IlmHamroh
Data Science va sun'iy intellekt/Loyihalar va karyera7/12-dars39 daqiqa
Mundarija (25)

29.7-dars: Portfolio yaratish

29-QISM — LOYIHALAR VA KARYERA · 7-dars


1. Kirish va motivatsiya

Oldingi darsda bitta loyihaning repo sini tartibga keltirdik: tuzilish, .gitignore, README, testlar, CI va ularni avtomatik tekshiradigan auditor. Endi bir qadam yuqoriga ko'tarilamiz: bitta repo emas, balki repolar to'plami — portfolio. Savol ham o'zgaradi: "bu repo tartiblimi?" emas, balki "bu odamni ishga olsak, u nima qila oladi?"

Ma'lumotlar fanida kirish darajasidagi nomzodlarning ko'pchiligida ish tajribasi yo'q yoki kam. Rezyumedagi "pandas, scikit-learn, PyTorch" ro'yxati hammada bir xil. Portfolio — bu ro'yxatning isboti: siz haqiqiy savolni oldingiz, ma'lumot topdingiz, uni tozaladingiz, model qurdingiz, uni halol baholadingiz va natijani tushunarli qilib yozdingiz. Ish beruvchi bunga ko'pincha bir-ikki daqiqa vaqt ajratadi — shuning uchun portfolio nafaqat yaxshi, balki tez o'qiladigan bo'lishi kerak.

Real vaziyat. Ikki nomzod bir xil kursni tugatgan. Birinchisining GitHub ida 12 ta repo: Titanic, Iris, MNIST, uy narxlari, yana bir Titanic — hammasi notebook, README lar bir qatorli. Ikkinchisida 4 ta repo: mahalliy e'lonlar asosida kvartira narxi bashorati (FastAPI demo bilan), o'zbekcha sharhlar tonalligi, do'kon savdosi bashorati va A/B test tahlili — har birida birinchi qatorda natija raqami, bazaviy model bilan taqqoslash va "cheklovlar" bo'limi. Birinchi nomzodning repolari ko'proq, lekin ish beruvchi 30 soniyada hech bir natijani topa olmaydi. Bu darsda aynan shuni o'lchaymiz: portfolio loyihasini ruberika bilan baholaymiz, README raqamlarini avtomatik tekshiramiz, ko'nikmalar qamrovini hisoblaymiz va "30 soniyalik ko'rib chiqish" ni simulyatsiya qilamiz.

Bu darsda portfolio nima uchun kerakligini, yaxshi loyiha mezonlarini, kurs amaliyotlarini xilma-xil portfolio ga aylantirishni va portfolio ni o'lchanadigan tarzda yaxshilashni o'rganamiz.

Bu darsda:

  • Portfolio nima uchun: ish beruvchi 1-2 daqiqada nimani ko'radi
  • Yaxshi portfolio loyihasi mezonlari va ruberika
  • 3-5 ta xilma-xil loyiha: tabular, NLP/CV, vaqt qatori, deploy qilingan xizmat
  • Kurs amaliyot darslarini portfolio loyihalariga aylantirish
  • Loyiha sahifasi (README) namunasi, blog yozuvi va demo
  • O'zbek konteksti: mahalliy ma'lumot bilan loyiha g'oyalari
  • Raqamlar halolligi: README va natija fayli mosligi
  • Tuzoqlar

ℹ Misollar real Python bilan (Python 3.14). Loyiha tavsiflari, portfolio lar va ko'rib chiquvchilar — namuna va faraziy: ular usulni ko'rsatadi, bozor haqida statistik da'vo emas. Ish bozori talablari haqidagi har qanday raqam faraziy — joriy vaziyatni o'zingiz vakansiyalardan tekshiring 29.8-bob.


2. Nazariya — chuqur tushuntirish

2.1. Portfolio nima uchun: ish beruvchi nimani ko'radi

text
KO'RIB CHIQISH ZANJIRI (umumiy manzara, har kompaniyada boshqacha)
  rezyume -> GitHub / portfolio havolasi -> 1-2 ta repo -> README ning boshi
  har bosqichda vaqt kam; keyingi bosqichga faqat qiziqish uyg'onsa o'tiladi

BIRINCHI DAQIQADA IZLANADIGAN SAVOLLAR
  1. Bu loyiha qanday SAVOLga javob beradi? (texnika emas - muammo)
  2. Natija qanday? Raqam bormi? Nima bilan taqqoslangan?
  3. Bu odam ma'lumotni o'zi topdi/tozaladimi yoki tayyor CSV oldimi?
  4. Baholash halolmi? (bazaviy, test to'plami, noaniqlik)
  5. Kod o'qiladimi? Ishga tushirsa bo'ladimi?
  6. Cheklovlarni biladimi? ("model hamma joyda ishlaydi" - xavf belgisi)

PORTFOLIO NIMANI ISBOTLAYDI
  texnik ko'nikma    - kod, modellar, baholash
  mustaqillik        - savol qo'yish, ma'lumot topish, tugatish
  muloqot            - README, grafiklar, yozuv 29.4-bob
  muhandislik        - repo tuzilishi, testlar, deploy (29.6, 27-qism)

Portfolio — kamroq, lekin chuqurroq. To'rtta tugallangan, yaxshi hujjatlangan loyiha o'nta yarim tayyor notebookdan kuchliroq ta'sir qiladi.

2.2. Yaxshi portfolio loyihasi mezonlari

text
MEZON                      NIMA KERAK                               VAZN (namuna)
1. Real savol              kim uchun, qanday qaror? ("do'kon          15
                           zaxirani qancha buyurtma qilsin")
2. Ma'lumot manbasi        o'zingiz yig'gan yoki qiziq ochiq manba;    10
                           manba, davr, litsenziya yozilgan
3. Oxiridan oxirigacha     yig'ish -> tozalash -> model -> baholash    15
                           -> natija (ideal: demo yoki xizmat)
4. Halol baholash          bazaviy model, to'g'ri bo'lish (vaqt,       20
                           guruh), noaniqlik (CI, SE), juftlashgan
                           taqqoslash (18-qism)
5. Natija va cheklovlar    raqam + ma'nosi; qayerda ishlamaydi         15
6. Qayta ishga tushirish   buyruqlar, qadalgan versiyalar, urug'lar    15
7. Birinchi ekran          README boshida xulosa va raqam              10

Vaznlar — bitta mumkin bo'lgan tanlov; muhimi ularning tartibi va ruberikaning aniq bo'lishi. Avtomatik ruberika (1-misol) — o'z-o'zini tekshirish vositasi: u matndagi kalit belgilarni qidiradi va shuning uchun "aldash" oson (so'zni yozib qo'yish). Haqiqiy ko'rib chiquvchi mazmunga qaraydi — ruberika faqat "biror narsani unutmadimmi?" degan savolga javob beradi.

text
PORTFOLIO UCHUN ZAIF LOYIHALAR (va ularni qanday kuchaytirish)
  Titanic, Iris, MNIST          - hamma qilgan; savol yo'q
    -> o'quv mashqi sifatida qoldiring, portfolio ning markazida emas
  "20 modelni sinadim"          - savolsiz model zoo
    -> bitta savol, bazaviy va 2-3 asosli nomzod, juftlashgan taqqoslash
  faqat notebook, README siz    - o'qib bo'lmaydi
    -> 29.6 dagi tuzilish
  "Accuracy 99%"                - nomutanosib sinflarda ma'nosiz 14.9-bob
    -> to'g'ri metrika va bazaviy bilan

2.3. Xilma-xillik: 3-5 ta loyiha

text
TAVSIYA ETILADIGAN TO'PLAM (DS generalist uchun)
  1. TABULAR + biznes savol     - klassifikatsiya/regressiya, belgilar,
                                  halol baholash (12-19-qismlar)
  2. MATN yoki RASM             - NLP (23-25) yoki CV (22); transfer learning
  3. VAQT QATORI yoki A/B       - bashorat + backtest (28.1-28.3) yoki
                                  tajriba tahlili (11-qism, 27.13)
  4. DEPLOY QILINGAN XIZMAT     - API yoki demo, monitoring g'oyasi (27-qism)
  5. (ixtiyoriy) YIG'ILGAN MA'LUMOT - scraping/API dan o'z ma'lumotingiz (7-qism)

YO'NALISHGA QARAB MOSLASH
  tahlilchi (analyst)   - SQL, A/B, EDA hisobot, dashboard ko'proq
  ML muhandis           - deploy, testlar, MLOps, samaradorlik ko'proq
  NLP/LLM               - matn loyihalari, RAG, baholash (25.9-25.10)

"T shaklidagi" profil: bitta yo'nalishda chuqur (masalan, 2 ta NLP loyiha), qolganlarida kengroq. 3-misolda ko'nikmalar matritsasi bilan qaysi yo'nalish yetishmasligini hisoblaymiz.

2.4. Kurs amaliyotlaridan portfolio loyihalari

Kursning deyarli har qismi amaliyot darsi bilan tugaydi. Ular — tayyor skelet. Portfolio loyihasiga aylantirish uchun uchta narsa qo'shiladi: o'z savolingiz (yoki o'z ma'lumotingiz), toza repo 29.6-bob va halol yozilgan README.

Kurs amaliyoti Portfolio loyihasi g'oyasi Nima qo'shiladi
7.12 Ma'lumot yig'ish Mahalliy e'lonlar yoki narxlar to'plami Muntazam yig'ish, sifat tekshiruvi, ruxsat va etika izohi
8.10 EDA loyihasi Ochiq ma'lumot bo'yicha tahliliy hisobot Savol, 3-5 asosiy topilma, grafiklar, cheklovlar
11.10 A/B test Tajriba tahlili (sintetik yoki ochiq) Quvvat hisobi, juftlashgan taqqoslash, qaror
14.14 / 15.14 Klassifikatsiya, ansambl Kredit riski yoki ketish modeli Biznes metrikasi, kalibrlash, xato tahlili
22.14 Nuqson aniqlash Rasm klassifikatsiyasi / nuqson Transfer learning, xato namunalari galereyasi
23.14 / 24.12 Murojaatlar, tonallik O'zbekcha matn klassifikatsiyasi O'z belgilangan ma'lumot, bazaviy TF-IDF bilan taqqoslash
25.14 RAG yordamchi Hujjatlar bo'yicha savol-javob Retrieval sifati o'lchovi, xato turlari
27.14 Ketish xizmati Deploy qilingan model API Docker, testlar, monitoring, demo
28.12 Talab bashorati Savdo yoki iste'mol bashorati Rolling backtest, bashorat intervallari
29.2-29.4 To'liq loyiha Yakuniy "flagman" loyiha Taqdimot, blog yozuvi

Kurs amaliyotini aynan ko'chirib qo'yish yetarli emas — ish beruvchi ko'p nomzodda bir xil loyihani ko'radi. Farqni o'z savolingiz, o'z ma'lumotingiz va o'z xulosangiz yaratadi. Amaliyot kodidan foydalansangiz, README da buni ochiq ayting.

2.5. Loyiha sahifasi: README namunasi

29.6 dagi README anatomiyasi portfolio uchun ham asos. Qo'shimcha: loyiha sahifasi "nega bu qiziq" degan savolga javob beradi va sizning hissangizni ko'rsatadi.

markdown
# Toshkent kvartira narxlari: e'lon narxi adolatlimi?

**Natija:** HistGB modeli e'lon narxini MAE 38.2 mln so'm bilan bashorat qiladi
(bazaviy - tuman medianasi - 61.5 mln; 95% CI [35.9, 40.6]). Demo: `/narx` API.
*(Barcha raqamlar - namuna.)*

![Bashorat va haqiqiy narx](reports/figures/bashorat.png)

## Savol
Xaridor e'londagi narx bozor darajasidan qanchalik farq qilishini bilmaydi.
Model "o'xshash kvartiralar qancha turadi?" degan savolga javob beradi.

## Ma'lumot
Ochiq e'lonlar sahifalaridan 2026-yil 3 oy davomida yig'ildi (sayt shartlari va
robots.txt tekshirildi); shaxsiy ma'lumot (telefon, ism) saqlanmagan.
Xom ma'lumot repo da yo'q - `src/kvartira/yigish.py` yig'ish skripti.

## Yondashuv
1. Tozalash: takrorlar, narx xatolari (so'm/dollar), ekstremal qiymatlar
2. Belgilar: tuman, maydon, qavat, qurilgan yil, matndan belgilar
3. Modellar: tuman medianasi (bazaviy) -> Ridge -> HistGB
4. Baholash: vaqt bo'yicha bo'lish (oxirgi oy - test), juftlashgan bootstrap

## Natijalar
| model         | MAE, mln so'm | 95% CI        |
|---------------|---------------|---------------|
| tuman medianasi | 61.5        | [58.8, 64.3]  |
| Ridge         | 45.0          | [42.6, 47.5]  |
| HistGB        | 38.2          | [35.9, 40.6]  |

## Cheklovlar
- E'lon narxi - sotuv narxi emas
- Faqat Toshkent; boshqa shaharlarda qayta o'qitish kerak
- Ta'mir sifati belgisi matndan olingan - shovqinli

## Ishga tushirish
    pip install -e .
    python -m kvartira.train --config configs/asos.yaml
    uvicorn kvartira.xizmat:app

## Mening hissam
Yig'ish, tozalash, modellar va API - to'liq o'zim. Baholash sxemasi 18-qism asosida.

2.6. Raqamlar halolligi

Portfolio dagi har raqam qayta olinadigan bo'lishi kerak: u skript chiqaradigan natija faylidan (masalan, reports/metrics.json) kelsin, qo'lda ko'chirilmasin (21.11 qoidasi: "hisobotdagi har raqam skriptdan").

text
QO'LDA KO'CHIRISH XATOLARI
  raqamlar o'rni almashadi: 0.723 -> 0.732
  eski natija qoladi: model qayta o'qitildi, README - yo'q
  yaxlitlash nomuvofiq: jadvalda 0.847, matnda 0.85, grafikda 0.8471
  nisbiy va mutlaq: "+17%" - nisbiymi yoki foiz punktmi?

YECHIM
  natija fayli -> README ni shablondan yaratish, YOKI
  README raqamlarini natija fayli bilan avtomatik solishtirish (2-misol)
  va buni CI ga qo'shish

2.7. Blog yozuvi

README — ma'lumotnoma, blog yozuvi — hikoya. Bitta yaxshi yozuv loyiha haqida suhbatni boshlab beradi va muloqot ko'nikmasini ko'rsatadi.

text
BLOG YOZUVI TUZILISHI (800-1500 so'z)
  1. Ilgak: qiziq savol yoki kutilmagan topilma (1 abzas)
  2. Nega muhim: kim uchun, qanday qaror
  3. Ma'lumot: qayerdan, qanday muammolar bor edi
  4. Asosiy topilma(lar): 1-2 grafik, raqamlar
  5. Nima ishlamadi (bu - eng qiziq qism, 29.5 writeup)
  6. Cheklovlar va keyingi qadam
  7. Havola: repo, demo
QAYERDA: shaxsiy sayt, GitHub Pages, umumiy blog platformalari;
  o'zbek tilida yozish - mahalliy hamjamiyat uchun qo'shimcha qiymat

2.8. Demo: API yoki interaktiv sahifa

Deploy qilingan demo — "model ishlaydi" degan eng kuchli isbot. 27.7-27.10 da FastAPI, Docker va bulutga joylashni o'rgandik. Interaktiv sahifa uchun streamlit kabi kutubxonalar ishlatiladi (bu muhitda o'rnatilmagan — faqat ma'lumotnoma):

python
# app.py - streamlit demo (ishga tushirish: streamlit run app.py)
import joblib
import pandas as pd
import streamlit as st

model = joblib.load("models/histgb.joblib")
st.title("Kvartira narxi bahosi")
tuman = st.selectbox("Tuman", ["Chilonzor", "Yunusobod", "Mirzo Ulug'bek"])
maydon = st.number_input("Maydon, m^2", 20.0, 300.0, 60.0)
qavat = st.slider("Qavat", 1, 25, 4)
if st.button("Baholash"):
    x = pd.DataFrame([{"tuman": tuman, "maydon": maydon, "qavat": qavat}])
    st.metric("Taxminiy narx, mln so'm", f"{model.predict(x)[0]:.0f}")
    st.caption("Model cheklovlari: faqat Toshkent, e'lon narxlari asosida")
text
DEMO QOIDALARI
  model fayli repo da emas 29.6-bob - ishga tushishda yuklanadi
  kirishni tekshirish 27.8-bob: noto'g'ri qiymat - tushunarli xabar
  cheklovlarni demoning o'zida yozing
  bepul xosting "uxlab qolishi" mumkin - README da skrinshot/GIF ham bo'lsin

2.9. O'zbek konteksti: mahalliy ma'lumot bilan loyihalar

Mahalliy savol va ma'lumot bilan qilingan loyiha — ikki xil afzallik: u boshqa nomzodlarnikiga o'xshamaydi va mahalliy ish beruvchi uchun tushunarli. G'oyalar (manbalarni o'zingiz toping va shartlarini tekshiring):

text
MANBA TURLARI
  davlat ochiq ma'lumotlar portallari va statistika nashrlari - aholi,
    narxlar indekslari, hududiy ko'rsatkichlar (formati va yangilanishini tekshiring)
  e'lon saytlari (ko'chmas mulk, avtomobil) - faqat ruxsat etilgan doirada,
    shaxsiy ma'lumotsiz (7-qism, 29.11)
  o'zbek tilidagi ochiq matnlar - yangiliklar, sharhlar (litsenziya!)
  o'zingiz yig'gan ma'lumot - so'rovnoma, sensor (havo sifati, harorat),
    shaxsiy xarajatlar (anonimlashtirilgan)

G'OYALAR
  hududlar bo'yicha narx dinamikasi va bashorati
  o'zbekcha matn: yangilik toifasi, sharh tonalligi, lotin-kirill transliteratsiya
    sifatini baholash
  shahar havo sifati: vaqt qatori bashorati va anomaliyalar
  jamoat transporti yoki yo'l harakati: vaqt bo'yicha naqshlar
  qishloq xo'jaligi: hosildorlik va ob-havo bog'liqligi (sababiylik ehtiyotkorligi, 28.11)

Har manbada: ruxsat (sayt shartlari, litsenziya), shaxsiy ma'lumot yo'qligi va ma'lumotning cheklovlari (tanlanma kimni qamraydi?) README da yozilgan bo'lsin.

2.10. Portfolio qayerda joylashadi

text
GitHub profili: profil README (qisqa "men kimman" + 3-4 asosiy loyiha havolasi),
  "pinned" repolar - eng yaxshi 4-6 ta
shaxsiy sayt (ixtiyoriy): loyiha sahifalari + blog
Kaggle: notebooklar va musobaqa writeup lari 29.5-bob
rezyume: har loyiha - bir qator, natija raqami bilan, havola (29.8)

2.11. Tuzoqlar

Asosiy tuzoqlar: ko'p, lekin sayoz loyihalar; faqat o'quv ma'lumotlari (Titanic, Iris, MNIST); savolsiz "model zoo"; README da natija yo'q yoki oxirida; bazaviy modelsiz raqam ("AUC 0.81" — yaxshimi?); noaniqliksiz yagona raqam; README raqamlari natija fayli bilan mos emas; cheklovlar yozilmagan; kurs amaliyotini o'zgarishsiz ko'chirish; ish joyi yoki boshqa birovning ma'lumotini ruxsatsiz ishlatish; shaxsiy ma'lumotli ma'lumotni ochiq joylash; ishlamaydigan demo havolasi; bir xil turdagi loyihalar (4 ta tabular klassifikatsiya).


3. Tez ma'lumotnoma

python
import json
import re

# README raqamini natija fayli bilan solishtirish (yaxlitlashni hisobga olib)
natija = json.load(open("reports/metrics.json", encoding="utf-8"))
m = re.search(r"Test AUC (\d+[.,]\d+)", readme)
qiymat = float(m.group(1).replace(",", "."))
xona = len(m.group(1).replace(",", ".").split(".")[1])
mos = abs(qiymat - round(natija["auc"], xona)) < 1e-9

# ko'nikmalar qamrovi (loyiha x ko'nikma 0/1 matritsa)
bor = M.max(axis=0)
vaznli_qamrov = (talab * bor).sum() / talab.sum()

# README ning birinchi N qatorida natija bormi
bosh = "\n".join(readme.splitlines()[:10])
natija_tepada = re.search(r"(AUC|MAE|F1|RMSE)\s*\d", bosh) is not None

Qaysi vaziyatda nima

Vaziyat Nima qilish kerak
10 ta o'quv loyihasi 3-4 tasini tanlab chuqurlashtiring, qolganini "pinned" dan olib tashlang
Hamma loyiha tabular NLP/CV, vaqt qatori yoki deploy loyihasini qo'shing (3-misol)
README da natija oxirida Birinchi 2-3 qatorga ko'chiring (4-misol)
Raqamlar qo'lda ko'chirilgan Natija fayli + avtomatik tekshiruv (2-misol)
Kurs amaliyoti asosida O'z savol/ma'lumot + toza repo + "mening hissam"
Demo yo'q FastAPI yoki interaktiv sahifa + skrinshot

Portfolio xulosasi

3-5 ta tugallangan loyiha > 12 ta yarim tayyor notebook
har loyiha: real savol, manba, bazaviy, noaniqlik, cheklovlar, buyruqlar
README boshida: nima + natija raqami + bazaviy
xilma-xillik: tabular + matn/rasm + vaqt qatori/A-B + deploy
raqamlar - natija faylidan; mahalliy ma'lumot - ruxsat va etika bilan

4. Batafsil misollar

Misollar real Python bilan (Python 3.14). Loyiha tavsiflari, portfolio va ko'rib chiquvchilar modeli — namuna va faraziy parametrlar bilan; har misol mustaqil ishlaydi.

Misol 1 — Portfolio ruberikasi: namuna loyihalarni baholash va vaznlarga sezgirlik

python
"""Portfolio ruberikasi: loyiha README larini mezonlar bo'yicha baholash."""

import re

import numpy as np

MEZONLAR = {  # nom: (vazn, tekshiruvchi regexlar - README matnida)
    "real savol": (15, [r"(?im)^#+\s*(muammo|savol)", r"(?i)(bo'lim|bank|do'kon|"
                        r"kompaniya|shifoxona|hokimiyat|foydalanuvchi)\w*\s"]),
    "ma'lumot manbasi": (10, [r"(?im)^#+\s*ma'lumot", r"(?i)(manba|yig'ildi|litsenziya)"]),
    "oxiridan oxirigacha": (15, [r"(?i)(tozalash|quvur)", r"(?i)(api|fastapi|streamlit|"
                                 r"dashboard|deploy|xizmat)"]),
    "halol baholash": (20, [r"(?i)bazaviy", r"(?i)(95% ?ci|ishonch oralig'i|se \d|"
                            r"juftlashgan|backtest)"]),
    "natija va cheklovlar": (15, [r"(?im)^#+\s*natija", r"(?im)^#+\s*cheklov"]),
    "qayta ishga tushirish": (15, [r"(?m)^\s{4}(python|make|pip|docker)\s",
                                   r"(?i)(urug'|seed|versiya|lock)"]),
    "birinchi ekran": (10, [r"\d+[.,]\d+|\d+%"]),   # birinchi 5 qatorda raqamli natija
}

LOYIHALAR = {
    "Titanic": """# Titanic
Kaggle dagi mashhur ma'lumot bilan ishladim. Ko'p narsa o'rgandim.
Random forest ishlatdim.
## Model
Accuracy 0.82 chiqdi.
## Ma'lumot
Manba: Kaggle o'quv musobaqasi.
""",
    "Kvartira narxi": """# Toshkent kvartira narxlari: narx bashorati va baholash xizmati
MAE 38.2 mln so'm (bazaviy - tuman medianasi - 61.5 mln); 95% CI [35.9, 40.6].
## Muammo
Xaridor e'londagi narx bozor narxidan yuqorimi - buni foydalanuvchi bilmaydi.
## Ma'lumot
E'lonlar sayti ochiq sahifalaridan yig'ildi (robots.txt va shartlar tekshirildi),
tozalash quvuri src/ da; manba havolasi va litsenziya izohi README oxirida.
## Natija
Juftlashgan bootstrap: HistGB bazaviydan sezilarli yaxshi.
## Foydalanish
    pip install -e .
    python -m kvartira.train --config configs/asos.yaml
FastAPI xizmati: /narx endpointi; urug' va versiyalar qadalgan.
## Cheklovlar
Faqat Toshkent; e'lon narxi - sotuv narxi emas.
""",
    "Sharh tonalligi": """# O'zbekcha mahsulot sharhlari tonalligi
Makro-F1 0.78 (bazaviy TF-IDF + logreg 0.71).
## Muammo
Do'kon sharhlarni qo'lda o'qiy olmaydi.
## Ma'lumot
3 000 ta sharh qo'lda belgilandi; manba - ochiq sharhlar.
## Natija
Xatolar tahlili: kinoya va aralash til.
## Cheklovlar
Kichik test to'plami - 95% CI keng.
""",
    "Elektr iste'moli": """# Elektr iste'moli bashorati
Bu loyihada vaqt qatorlari bilan ishladim va juda ko'p model sinab ko'rdim,
ARIMA, ETS, gradient boosting va LSTM. Natijalar pastda.
Loyiha menga juda yoqdi.
Kodni ishga tushirish uchun notebookni oching.
## Natija
Rolling backtest da MAPE 6.1% (bazaviy mavsumiy naiv 8.4%).
""",
    "MNIST": """# MNIST 99.3%
CNN bilan 99.3% aniqlik.
""",
}


def baholash(matn):
    ball = {}
    for nom, (_, regexlar) in MEZONLAR.items():
        if nom == "birinchi ekran":
            bosh = "\n".join(matn.splitlines()[:5])
            ball[nom] = 1.0 if re.search(regexlar[0], bosh) else 0.0
        else:
            ball[nom] = sum(bool(re.search(r, matn)) for r in regexlar) / len(regexlar)
    return ball


def jami(ball, vazn):
    return sum(vazn[k] * ball[k] for k in vazn)


def main() -> None:
    vazn = {k: v[0] for k, v in MEZONLAR.items()}
    ballar = {n: baholash(m) for n, m in LOYIHALAR.items()}

    print("=== 1. Ruberika: mezon ballari (0-1) va jami (100 dan) ===")
    qisqa = ["savol", "manba", "e2e", "baho", "natija", "qayta", "ekran"]
    print(f"  {'loyiha':<18}" + "".join(f"{q:>7}" for q in qisqa) + f"{'JAMI':>7}")
    for n, b in ballar.items():
        print(f"  {n:<18}" + "".join(f"{b[k]:>7.1f}" for k in MEZONLAR)
              + f"{jami(b, vazn):>7.1f}")

    print("\n=== 2. Eng katta yo'qotishlar (vazn x yetishmagan ulush) ===")
    for n, b in ballar.items():
        yoq = sorted(((vazn[k] * (1 - b[k]), k) for k in MEZONLAR), reverse=True)[:2]
        yoq = [f"{k} (-{v:.1f})" for v, k in yoq if v > 0]
        print(f"  {n:<18} {', '.join(yoq) if yoq else 'yo_q'}")

    print("\n=== 3. Vaznlarga sezgirlik: 2000 ta tasodifiy vazn (Dirichlet) ===")
    rng = np.random.default_rng(0)
    nomlar = list(LOYIHALAR)
    B = np.array([[ballar[n][k] for k in MEZONLAR] for n in nomlar])
    alfa = np.array([vazn[k] for k in MEZONLAR], dtype=float) / 5
    W = rng.dirichlet(alfa, size=2000) * 100
    J = W @ B.T                                    # (2000, loyihalar)
    orin = (-J).argsort(axis=1).argsort(axis=1) + 1
    asosiy = np.array([jami(ballar[n], vazn) for n in nomlar])
    asosiy_orin = (-asosiy).argsort().argsort() + 1
    print(f"  {'loyiha':<18} {'asosiy o_rin':>13} {'1-o_rin ulushi':>15} "
          f"{'o_rin 90% oralig_i':>19}")
    for i, n in enumerate(nomlar):
        lo, hi = np.percentile(orin[:, i], [5, 95])
        print(f"  {n:<18} {asosiy_orin[i]:>13} {np.mean(orin[:, i] == 1):>15.3f} "
              f"{f'{lo:.0f}-{hi:.0f}':>19}")
    tartib_saqlandi = np.mean(np.all(orin == asosiy_orin, axis=1))
    print(f"  to'liq tartib saqlangan ulush: {tartib_saqlandi:.3f}")
    eng = nomlar[int(np.argmax(asosiy))]
    if np.mean(orin[:, nomlar.index(eng)] == 1) > 0.9:
        print(f"  xulosa: '{eng}' vaznlar qanday bo'lmasin deyarli har doim birinchi")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Ruberika: mezon ballari (0-1) va jami (100 dan) ===
  loyiha              savol  manba    e2e   baho natija  qayta  ekran   JAMI
  Titanic               0.0    1.0    0.0    0.0    0.0    0.0    1.0   20.0
  Kvartira narxi        1.0    1.0    1.0    1.0    1.0    1.0    1.0  100.0
  Sharh tonalligi       1.0    1.0    0.0    1.0    1.0    0.0    1.0   70.0
  Elektr iste'moli      0.0    0.0    0.0    1.0    0.5    0.0    0.0   27.5
  MNIST                 0.0    0.0    0.0    0.0    0.0    0.0    1.0   10.0

=== 2. Eng katta yo'qotishlar (vazn x yetishmagan ulush) ===
  Titanic            halol baholash (-20.0), real savol (-15.0)
  Kvartira narxi     yo_q
  Sharh tonalligi    qayta ishga tushirish (-15.0), oxiridan oxirigacha (-15.0)
  Elektr iste'moli   real savol (-15.0), qayta ishga tushirish (-15.0)
  MNIST              halol baholash (-20.0), real savol (-15.0)

=== 3. Vaznlarga sezgirlik: 2000 ta tasodifiy vazn (Dirichlet) ===
  loyiha              asosiy o_rin  1-o_rin ulushi  o_rin 90% oralig_i
  Titanic                        4           0.000                 3-4
  Kvartira narxi                 1           1.000                 1-1
  Sharh tonalligi                2           0.000                 2-2
  Elektr iste'moli               3           0.000                 3-5
  MNIST                          5           0.000                 4-5
  to'liq tartib saqlangan ulush: 0.690
  xulosa: 'Kvartira narxi' vaznlar qanday bo'lmasin deyarli har doim birinchi

Natija tahlili.

1-bo'lim — beshta namuna README ruberikadan o'tdi. "Kvartira narxi" — 100: savol va foydalanuvchi, manba va litsenziya izohi, tozalash quvuri va FastAPI xizmati, bazaviy va 95% CI, natija va cheklovlar, buyruqlar va urug', birinchi ikki qatorda raqam. "Sharh tonalligi" — 70: mazmunan kuchli (bazaviy bilan taqqoslash, qo'lda belgilangan ma'lumot, cheklovlar), lekin ishga tushirish buyruqlari va oxiridan oxirigacha elementi (quvur yoki demo) yo'q. "Elektr iste'moli" — 27.5: baholash yaxshi (mavsumiy naiv bazaviy, rolling backtest), lekin README hikoya bilan boshlanadi, natija oxirida, savol va cheklovlar yo'q. Titanic (20) va MNIST (10) — birinchi qatorlarda raqam bor, boshqa deyarli hech narsa yo'q.

2-bo'lim — har loyiha uchun eng katta ikkita yo'qotish: bu "keyingi soatni nimaga sarflash kerak" degan savolga javob. "Sharh tonalligi" uchun — ishga tushirish buyruqlari va demo; "Elektr iste'moli" uchun — savol va qayta ishga tushirish. E'tibor bering: "Elektr iste'moli" ning texnik qismi Titanic nikidan ancha kuchli, lekin uni ko'rsatish uslubi uni yo'qqa chiqarmoqda — bu 4-misolda ham ko'rinadi.

3-bo'lim — vaznlarga sezgirlik. Vaznlarni 2000 marta tasodifiy (Dirichlet, o'rtachasi asosiy vaznlar atrofida) o'zgartirdik. "Kvartira narxi" 100% holatda birinchi, "Sharh tonalligi" har doim ikkinchi — ular vazn tanloviga bog'liq emas. Pastki uchlik esa aralashadi: to'liq tartib 69.0% holatda saqlandi, "Elektr iste'moli" 3-5 o'rinlar orasida. Xulosa: ruberika kuchli va zaif loyihalarni ishonchli ajratadi, lekin o'xshash darajadagi zaif loyihalar orasidagi tartib vaznlarga bog'liq — ularni bir-biri bilan solishtirishdan ko'ra, har birini tuzatish foydaliroq. Eslatma: bu ruberika kalit so'zlarni qidiradi, uni "aldash" oson (Vazifa 3.2); u haqiqiy ko'rib chiquvchining o'rnini bosmaydi, faqat unutilgan elementni eslatadi.

Misol 2 — README raqamlari va natija fayli: ko'chirish xatosini ushlash

python
"""README dagi raqamlarni natija fayli bilan avtomatik solishtirish."""

import json
import re
import tempfile
from pathlib import Path

README = """# Mijoz ketishini bashorat qilish
Test AUC 0.847 (bazaviy logistik regressiya 0.732), ya'ni +17% nisbiy yaxshilanish.
Top-10% xavfli mijozlar ketuvchilarning 34% ini qamraydi.

## Natija
| model    | AUC   | F1   |
|----------|-------|------|
| bazaviy  | 0.723 | 0.58 |
| HistGB   | 0.847 | 0.71 |

Test to'plami: 12 345 mijoz, ketish ulushi 18,2%.
"""

# README qaysi raqamni qayerdan olishini aytuvchi xarita: (nom, regex, kalit)
QOIDALAR = [
    ("xulosa: AUC", r"Test AUC (\d+[.,]\d+)", "auc"),
    ("xulosa: bazaviy AUC", r"bazaviy logistik regressiya (\d+[.,]\d+)", "bazaviy_auc"),
    ("xulosa: nisbiy o'sish %", r"\+(\d+)% nisbiy", "nisbiy_osish_foiz"),
    ("xulosa: top-10% qamrov %", r"ketuvchilarning (\d+)%", "top10_qamrov_foiz"),
    ("jadval: bazaviy AUC", r"\| bazaviy\s+\| (\d+[.,]\d+)", "bazaviy_auc"),
    ("jadval: bazaviy F1", r"\| bazaviy\s+\| [\d.]+\s+\| (\d+[.,]\d+)", "bazaviy_f1"),
    ("jadval: HistGB AUC", r"\| HistGB\s+\| (\d+[.,]\d+)", "auc"),
    ("jadval: HistGB F1", r"\| HistGB\s+\| [\d.]+\s+\| (\d+[.,]\d+)", "f1"),
    ("test hajmi", r"Test to'plami: ([\d\s]+) mijoz", "n_test"),
    ("ketish ulushi %", r"ketish ulushi (\d+[.,]\d+)%", "ketish_foiz"),
]


def son(matn):
    """'12 345' -> 12345, '18,2' -> 18.2; o'nlik xonalar sonini ham qaytaradi."""
    s = matn.replace(" ", "").replace(" ", "").replace(",", ".")
    return float(s), (len(s.split(".")[1]) if "." in s else 0)


def natijalar_yarat(auc, bazaviy_auc, f1, bazaviy_f1, top10, n_test, ketish):
    return {"auc": auc, "bazaviy_auc": bazaviy_auc, "f1": f1, "bazaviy_f1": bazaviy_f1,
            "nisbiy_osish_foiz": 100 * (auc - bazaviy_auc) / bazaviy_auc,
            "top10_qamrov_foiz": 100 * top10, "n_test": n_test, "ketish_foiz": 100 * ketish}


def tekshir(readme, natija):
    """Har raqam: README dagi yaxlitlangan qiymat natijaning yaxlitlanganiga tengmi?"""
    xatolar, qatorlar = 0, []
    for nom, regex, kalit in QOIDALAR:
        m = re.search(regex, readme)
        if not m:
            qatorlar.append((nom, "topilmadi", "", "YO'Q"))
            xatolar += 1
            continue
        qiymat, xona = son(m.group(1))
        haqiqiy = natija[kalit]
        ok = abs(qiymat - round(haqiqiy, xona)) < 1e-9
        xatolar += not ok
        qatorlar.append((nom, f"{qiymat:g}", f"{haqiqiy:.4f}", "OK" if ok else "FARQ"))
    return xatolar, qatorlar


def chop(qatorlar):
    print(f"  {'raqam':<26} {'README':>8} {'natija':>11}  holat")
    for nom, r, h, holat in qatorlar:
        print(f"  {nom:<26} {r:>8} {h:>11}  {holat}")


def main() -> None:
    with tempfile.TemporaryDirectory() as tmp:
        tmp = Path(tmp)
        v1 = natijalar_yarat(0.8471, 0.7234, 0.7093, 0.5812, 0.3408, 12345, 0.1821)
        (tmp / "metrics.json").write_text(json.dumps(v1, indent=1, sort_keys=True),
                                          encoding="utf-8")
        (tmp / "README.md").write_text(README, encoding="utf-8")

        print("=== 1. README va metrics.json (1-versiya) ===")
        natija = json.loads((tmp / "metrics.json").read_text(encoding="utf-8"))
        xatolar, qatorlar = tekshir((tmp / "README.md").read_text(encoding="utf-8"), natija)
        chop(qatorlar)
        print(f"  mos kelmagan raqamlar: {xatolar}")

        print("\n=== 2. README ichidagi o'zaro mosligi ===")
        r = (tmp / "README.md").read_text(encoding="utf-8")
        a = son(re.search(r"Test AUC (\d+[.,]\d+)", r).group(1))[0]
        b1 = son(re.search(r"regressiya (\d+[.,]\d+)", r).group(1))[0]
        b2 = son(re.search(r"\| bazaviy\s+\| (\d+[.,]\d+)", r).group(1))[0]
        print(f"  bazaviy AUC: xulosada {b1}, jadvalda {b2} -> bir xil: {b1 == b2}")
        for b in [b1, b2]:
            print(f"  +{100 * (a - b) / b:.1f}% (bazaviy {b} bilan) - README da '+17%'")

        print("\n=== 3. Tuzatilgan README ===")
        r2 = r.replace("regressiya 0.732", "regressiya 0.723")
        xatolar, _ = tekshir(r2, natija)
        print(f"  mos kelmagan raqamlar: {xatolar}")

        print("\n=== 4. Model qayta o'qitildi, README yangilanmadi ===")
        v2 = natijalar_yarat(0.8512, 0.7234, 0.7160, 0.5812, 0.3551, 13020, 0.1797)
        (tmp / "metrics.json").write_text(json.dumps(v2, indent=1, sort_keys=True),
                                          encoding="utf-8")
        natija = json.loads((tmp / "metrics.json").read_text(encoding="utf-8"))
        xatolar, qatorlar = tekshir(r2, natija)
        chop([q for q in qatorlar if q[3] != "OK"])
        print(f"  mos kelmagan raqamlar: {xatolar} -> CI da bu tekshiruv yiqilsa, "
              f"eskirgan README ochiq sahifaga chiqmaydi")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. README va metrics.json (1-versiya) ===
  raqam                        README      natija  holat
  xulosa: AUC                   0.847      0.8471  OK
  xulosa: bazaviy AUC           0.732      0.7234  FARQ
  xulosa: nisbiy o'sish %          17     17.0998  OK
  xulosa: top-10% qamrov %         34     34.0800  OK
  jadval: bazaviy AUC           0.723      0.7234  OK
  jadval: bazaviy F1             0.58      0.5812  OK
  jadval: HistGB AUC            0.847      0.8471  OK
  jadval: HistGB F1              0.71      0.7093  OK
  test hajmi                    12345  12345.0000  OK
  ketish ulushi %                18.2     18.2100  OK
  mos kelmagan raqamlar: 1

=== 2. README ichidagi o'zaro mosligi ===
  bazaviy AUC: xulosada 0.732, jadvalda 0.723 -> bir xil: False
  +15.7% (bazaviy 0.732 bilan) - README da '+17%'
  +17.2% (bazaviy 0.723 bilan) - README da '+17%'

=== 3. Tuzatilgan README ===
  mos kelmagan raqamlar: 0

=== 4. Model qayta o'qitildi, README yangilanmadi ===
  raqam                        README      natija  holat
  xulosa: AUC                   0.847      0.8512  FARQ
  xulosa: nisbiy o'sish %          17     17.6666  FARQ
  xulosa: top-10% qamrov %         34     35.5100  FARQ
  jadval: HistGB AUC            0.847      0.8512  FARQ
  jadval: HistGB F1              0.71      0.7160  FARQ
  test hajmi                    12345  13020.0000  FARQ
  ketish ulushi %                18.2     17.9700  FARQ
  mos kelmagan raqamlar: 7 -> CI da bu tekshiruv yiqilsa, eskirgan README ochiq sahifaga chiqmaydi

Natija tahlili.

1-bo'lim — README dagi 10 ta raqam natija fayli bilan solishtirildi. Tekshiruv yaxlitlashni hisobga oladi: README da 0.847, faylda 0.8471 — README dagi uch xona bo'yicha yaxlitlangan qiymat bir xil, demak mos. 12 345 (bo'shliq bilan) va 18,2 (vergul bilan) ham to'g'ri o'qildi. Bitta raqam mos kelmadi: xulosa qatoridagi bazaviy AUC 0.732, natija faylida 0.7234 — ikki raqamning o'rni almashgan, klassik ko'chirish xatosi.

2-bo'lim — README ning o'z ichida ham ziddiyat bor: xulosada 0.732, jadvalda 0.723. Bundan tashqari, "+17%" da'vosi faqat to'g'ri bazaviy (0.723) bilan to'g'ri keladi (+17.2%); noto'g'ri bazaviy bilan +15.7% chiqardi. O'qiydigan odam bu farqni ko'rsa, boshqa raqamlarga ham ishonmay qo'yadi — bitta xato butun loyihaning ishonchliligini tushiradi.

3-bo'lim — raqam tuzatilgach, mos kelmagan raqamlar 0.

4-bo'lim — eng ko'p uchraydigan real holat: model yangi ma'lumotda qayta o'qitildi, metrics.json yangilandi, README esa yo'q. Tekshiruv 10 ta raqamdan 7 tasini "FARQ" deb belgiladi (bazaviy AUC va F1 o'zgarmagan, shuning uchun ular mos). Bu tekshiruv CI ga qo'shilsa 29.6-bob, eskirgan README bilan commit "qizil" bo'ladi. Muqobil yondashuv — README ning natija qismini to'g'ridan-to'g'ri natija faylidan shablon orqali yaratish (Vazifa 4.1).

Misol 3 — Ko'nikmalar matritsasi: qamrov, takrorlanish va keyingi loyihani tanlash

python
"""Ko'nikmalar matritsasi: portfolio qamrovi, takrorlanish va keyingi loyihani tanlash."""

from itertools import combinations

import numpy as np

KONIKMALAR = ["SQL", "EDA", "statistika/A-B", "tabular ML", "belgilar", "baholash",
              "NLP", "kompyuter ko'rish", "vaqt qatori", "chuqur o'rganish",
              "LLM/RAG", "deploy/API", "MLOps", "ma'lumot yig'ish", "muloqot"]

PORTFOLIO = {   # nomzodning hozirgi loyihalari (namuna)
    "Titanic": ["EDA", "tabular ML"],
    "Uy narxi (Kaggle)": ["EDA", "tabular ML", "belgilar"],
    "Kredit riski": ["EDA", "tabular ML", "belgilar", "baholash"],
    "Mijoz ketishi": ["SQL", "EDA", "tabular ML", "belgilar", "baholash", "muloqot"],
}

KURS_LOYIHALARI = {   # kurs amaliyot darslari asosidagi loyiha g'oyalari
    "8.10 EDA hisoboti": ["EDA", "muloqot"],
    "7.12 ma'lumot yig'ish": ["ma'lumot yig'ish", "SQL"],
    "11.10 A/B test": ["statistika/A-B", "muloqot"],
    "22.14 nuqson aniqlash": ["kompyuter ko'rish", "chuqur o'rganish", "baholash"],
    "23.14 murojaatlar toifasi": ["NLP", "baholash"],
    "24.12 sharh tonalligi": ["NLP", "chuqur o'rganish", "baholash"],
    "25.14 RAG yordamchi": ["LLM/RAG", "NLP", "baholash"],
    "27.14 ketish xizmati": ["tabular ML", "deploy/API", "MLOps", "baholash"],
    "28.12 talab bashorati": ["vaqt qatori", "baholash", "MLOps", "muloqot"],
}

# vakansiya matnlarida ko'nikma talab qilinish ulushi - FARAZIY raqamlar,
# o'z bozoringiz uchun vakansiyalarni o'zingiz sanang (29.8)
TALAB = {"SQL": 0.8, "EDA": 0.7, "statistika/A-B": 0.5, "tabular ML": 0.7,
         "belgilar": 0.4, "baholash": 0.5, "NLP": 0.3, "kompyuter ko'rish": 0.2,
         "vaqt qatori": 0.3, "chuqur o'rganish": 0.3, "LLM/RAG": 0.3,
         "deploy/API": 0.4, "MLOps": 0.3, "ma'lumot yig'ish": 0.3, "muloqot": 0.6}


def matritsa(loyihalar):
    M = np.zeros((len(loyihalar), len(KONIKMALAR)), dtype=int)
    for i, k in enumerate(loyihalar.values()):
        for s in k:
            M[i, KONIKMALAR.index(s)] = 1
    return M


def qamrov(M):
    w = np.array([TALAB[k] for k in KONIKMALAR])
    bor = M.max(axis=0) if len(M) else np.zeros(len(KONIKMALAR), dtype=int)
    return int(bor.sum()), float((w * bor).sum() / w.sum())


def main() -> None:
    M = matritsa(PORTFOLIO)
    nomlar = list(PORTFOLIO)

    print("=== 1. Hozirgi portfolio: ko'nikmalar matritsasi ===")
    for i, n in enumerate(nomlar):
        print(f"  {n:<20} " + "".join("#" if v else "-" for v in M[i]))
    soni, vaznli = qamrov(M)
    print(f"  qamrov: {soni}/{len(KONIKMALAR)} ko'nikma; talab bilan vaznlangan: {vaznli:.2f}")
    yoq = [k for j, k in enumerate(KONIKMALAR) if M[:, j].max() == 0]
    print(f"  yetishmaydi: {', '.join(yoq)}")

    print("\n=== 2. Takrorlanish: loyihalar orasidagi Jaccard o'xshashligi ===")
    juftlar = []
    for i in range(len(nomlar)):
        for j in range(i + 1, len(nomlar)):
            a, b = M[i].astype(bool), M[j].astype(bool)
            juftlar.append(((a & b).sum() / (a | b).sum(), nomlar[i], nomlar[j]))
    for s, a, b in sorted(juftlar, reverse=True)[:3]:
        print(f"  {a:<18} ~ {b:<20} {s:.2f}")
    qoldiq = {}
    for i, n in enumerate(nomlar):
        boshqalar = np.delete(M, i, axis=0)
        qoldiq[n] = qamrov(M)[1] - qamrov(boshqalar)[1]
    print("  loyihani olib tashlasak vaznli qamrov kamayishi:")
    for n in nomlar:
        print(f"    {n:<20} {abs(qoldiq[n]):.3f}")

    print("\n=== 3. Ochko'z tanlov: kurs loyihalaridan 3 ta qo'shish ===")
    asosiy = [n for n in nomlar if qoldiq[n] > 0]
    tanlangan = {n: PORTFOLIO[n] for n in asosiy}
    print(f"  qoldirildi: {', '.join(asosiy)} (qamrovga hissasi yo'q loyihalar olib tashlandi)")
    print(f"  boshlang'ich vaznli qamrov: {qamrov(matritsa(tanlangan))[1]:.2f}")
    for qadam in range(3):
        eng, eng_q = None, qamrov(matritsa(tanlangan))[1]
        for n, k in KURS_LOYIHALARI.items():
            if n in tanlangan:
                continue
            q = qamrov(matritsa({**tanlangan, n: k}))[1]
            if q > eng_q + 1e-12:
                eng, eng_q = n, q
        if eng is None:
            break
        tanlangan[eng] = KURS_LOYIHALARI[eng]
        print(f"  {qadam + 1}-qadam: + {eng:<26} vaznli qamrov {eng_q:.2f}")
    soni, vaznli = qamrov(matritsa(tanlangan))
    print(f"  yakuniy: {len(tanlangan)} loyiha, {soni}/{len(KONIKMALAR)} ko'nikma, "
          f"vaznli {vaznli:.2f}")
    yoq = [k for j, k in enumerate(KONIKMALAR) if matritsa(tanlangan)[:, j].max() == 0]
    print(f"  hali yetishmaydi: {', '.join(yoq) if yoq else 'yo_q'}")

    print("\n=== 4. Barcha 3 talik kombinatsiyalar bilan solishtirish ===")
    kurs = list(KURS_LOYIHALARI)
    boshl = {n: PORTFOLIO[n] for n in asosiy}
    hamma = np.array([qamrov(matritsa({**boshl, **{kurs[i]: KURS_LOYIHALARI[kurs[i]]
                                                  for i in c}}))[1]
                      for c in combinations(range(len(kurs)), 3)])
    print(f"  kombinatsiyalar: {len(hamma)}; o'rtacha {hamma.mean():.3f}, "
          f"maks {hamma.max():.3f}")
    print(f"  ochko'z tanlov ({vaznli:.3f}) maksimumga teng: "
          f"{abs(vaznli - hamma.max()) < 1e-12}; undan yaxshi kombinatsiyalar: "
          f"{int(np.sum(hamma > vaznli + 1e-12))}")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Hozirgi portfolio: ko'nikmalar matritsasi ===
  Titanic              -#-#-----------
  Uy narxi (Kaggle)    -#-##----------
  Kredit riski         -#-###---------
  Mijoz ketishi        ##-###--------#
  qamrov: 6/15 ko'nikma; talab bilan vaznlangan: 0.56
  yetishmaydi: statistika/A-B, NLP, kompyuter ko'rish, vaqt qatori, chuqur o'rganish, LLM/RAG, deploy/API, MLOps, ma'lumot yig'ish

=== 2. Takrorlanish: loyihalar orasidagi Jaccard o'xshashligi ===
  Uy narxi (Kaggle)  ~ Kredit riski         0.75
  Titanic            ~ Uy narxi (Kaggle)    0.67
  Kredit riski       ~ Mijoz ketishi        0.67
  loyihani olib tashlasak vaznli qamrov kamayishi:
    Titanic              0.000
    Uy narxi (Kaggle)    0.000
    Kredit riski         0.000
    Mijoz ketishi        0.212

=== 3. Ochko'z tanlov: kurs loyihalaridan 3 ta qo'shish ===
  qoldirildi: Mijoz ketishi (qamrovga hissasi yo'q loyihalar olib tashlandi)
  boshlang'ich vaznli qamrov: 0.56
  1-qadam: + 27.14 ketish xizmati       vaznli qamrov 0.67
  2-qadam: + 24.12 sharh tonalligi      vaznli qamrov 0.76
  3-qadam: + 11.10 A/B test             vaznli qamrov 0.83
  yakuniy: 4 loyiha, 11/15 ko'nikma, vaznli 0.83
  hali yetishmaydi: kompyuter ko'rish, vaqt qatori, LLM/RAG, ma'lumot yig'ish

=== 4. Barcha 3 talik kombinatsiyalar bilan solishtirish ===
  kombinatsiyalar: 84; o'rtacha 0.749, maks 0.833
  ochko'z tanlov 0.833-bob maksimumga teng: True; undan yaxshi kombinatsiyalar: 0

Natija tahlili.

1-bo'lim — namuna nomzodning 4 ta loyihasi: hammasi tabular. Matritsa (# — ko'nikma bor) buni ko'rsatib turibdi: EDA va tabular ML to'rt marta takrorlanadi, 15 ko'nikmadan esa faqat 6 tasi qamralgan. Faraziy talab vaznlari bilan qamrov 0.56. Yetishmaydiganlar orasida A/B test, NLP, deploy, MLOps — vakansiyalarda tez-tez uchraydigan yo'nalishlar (vaznlar faraziy — o'z bozoringizni o'zingiz sanang, 29.8).

2-bo'lim — takrorlanish. "Uy narxi" va "Kredit riski" Jaccard o'xshashligi 0.75. Har loyihani olib tashlab qamrov qanchaga kamayishini hisobladik: Titanic, "Uy narxi" va "Kredit riski" — 0.000, ya'ni ular portfolio ga hech qanday yangi ko'nikma qo'shmaydi; hamma ishni "Mijoz ketishi" (0.212) qiladi. Bu ularni yashirish kerak degani emas — lekin "pinned" joylarni egallashga arzimaydi.

3-bo'lim — ochko'z (greedy) tanlov: har qadamda vaznli qamrovni eng ko'p oshiradigan kurs loyihasi qo'shiladi. Uch qadam: 27.14 ketish xizmati (0.67 — deploy va MLOps), 24.12 sharh tonalligi (0.76 — NLP va chuqur o'rganish), 11.10 A/B test (0.83 — statistika). Natija: 4 loyiha, 11/15 ko'nikma. Birinchi qadam amaliy maslahat beradi: yangi repo ochishdan ko'ra, mavjud "Mijoz ketishi" loyihasini 27.14 uslubida xizmatga kengaytirish — bitta chuqur loyiha. Hali yetishmaydi: kompyuter ko'rish, vaqt qatori, LLM/RAG, ma'lumot yig'ish — keyingi bosqich uchun ro'yxat.

4-bo'lim — ochko'z tanlov yaxshimi? 9 ta kurs loyihasidan barcha 84 ta 3 talik kombinatsiyani tekshirdik: o'rtacha 0.749, maksimum 0.833 — ochko'z tanlov aynan maksimumga teng, undan yaxshi kombinatsiya yo'q. Bu kichik masalada kafolat emas, omad: umumiy holda ochko'z qamrov tanlovi optimal emas (Vazifa 5.3), lekin amalda odatda yaqin natija beradi.

Misol 4 — "30 soniyalik ko'rib chiqish": README boshida asosiy ma'lumot bormi?

python
"""30 soniyalik ko'rib chiqish: README ning boshida asosiy ma'lumot bormi?"""

import re

import numpy as np

KIRISH = ("Assalomu alaykum! Bu loyihani kursni o'rganish davomida qildim. "
          "Avval pandas bilan ishlashni o'rgandim, keyin grafiklar chizdim, "
          "keyin esa bir nechta modelni sinab ko'rdim. Bu jarayon juda qiziqarli "
          "bo'ldi va men ko'p narsani o'rgandim. ")

READMELAR = {
    "hikoya": "\n".join(
        ["# Mening loyiham"] + [KIRISH] * 6 +
        ["## O'rnatish", "    pip install -r requirements.txt",
         "    python train.py"] +
        ["Keyin notebookni ochib, kataklarni ketma-ket ishga tushiring. " * 3] * 4 +
        ["## Natija", "HistGB modeli test AUC 0.81 berdi, bazaviy model esa 0.72.",
         "![ROC egri chizig'i](reports/figures/roc.png)",
         "Loyiha telekom mijozlarining ketishini bashorat qiladi."]),
    "o_rta": "\n".join(
        ["# Telekom mijozlari ketishini bashorat qilish",
         "## Muammo"] + ["Telekom kompaniyasi uchun mijozni saqlash yangi mijoz jalb "
                         "qilishdan arzonroq, shuning uchun ketishni oldindan bilish muhim. "
                         * 2] * 4 +
        ["## Natija", "Test AUC 0.81 (bazaviy 0.72).",
         "![ROC egri chizig'i](reports/figures/roc.png)",
         "## O'rnatish", "    pip install -e .", "    python -m churn.train"]),
    "piramida": "\n".join(
        ["# Telekom mijozlari ketishini bashorat qilish",
         "Test AUC 0.81 (bazaviy 0.72); top-10% xavfli mijozlar ketuvchilarning 34% i.",
         "![ROC egri chizig'i](reports/figures/roc.png)",
         "    pip install -e . && python -m churn.train",
         "## Muammo"] + ["Telekom kompaniyasi uchun mijozni saqlash yangi mijoz jalb "
                         "qilishdan arzonroq. " * 2] * 4 +
        ["## Ma'lumot", "Sintetik, 20 000 mijoz."]),
}

ELEMENTLAR = {
    "nima": r"(?i)ketish\w* bashorat",
    "natija": r"(?i)AUC \d\.\d+",
    "bazaviy": r"(?i)bazaviy\w*( model esa)? \d\.\d+",
    "rasm": r"!\[",
    "buyruq": r"(?m)^\s{4}(pip|python)",
}


def joylashuv(matn):
    """Har element birinchi uchragan joy: undan oldingi so'zlar soni."""
    natija, sozlar = {}, 0
    for qator in matn.splitlines():
        for nom, r in ELEMENTLAR.items():
            m = re.search(r, qator)
            if nom not in natija and m:
                natija[nom] = sozlar + len(qator[: m.start()].split())
        sozlar += len(qator.split())
    return natija, sozlar


def main() -> None:
    rng = np.random.default_rng(0)
    n = 5000
    # FARAZIY ko'rib chiquvchi modeli: tez o'qish 3-6 so'z/s, e'tibor vaqti
    # log-normal (mediana 30 s) - real qiymatlar odamga va vaziyatga bog'liq
    tezlik = rng.uniform(3, 6, n)
    vaqt = rng.lognormal(np.log(30), 0.5, n)
    oqilgan = tezlik * vaqt

    print("=== 1. Elementlar README da qayerda? (undan oldingi so'zlar soni) ===")
    joy = {}
    print(f"  {'README':<10} {'jami':>6} " + "".join(f"{e:>9}" for e in ELEMENTLAR))
    for nom, matn in READMELAR.items():
        joy[nom], jami = joylashuv(matn)
        print(f"  {nom:<10} {jami:>6} " + "".join(
            f"{joy[nom].get(e, -1):>9}" for e in ELEMENTLAR))
    for nom, matn in READMELAR.items():
        bosh = "\n".join(matn.splitlines()[:10])
        print(f"  {nom:<10} birinchi 10 qatorda natija raqami: "
              f"{bool(re.search(ELEMENTLAR['natija'], bosh))}")

    print(f"\n=== 2. {n} ta faraziy ko'rib chiquvchi: element ko'rilish ehtimoli ===")
    print(f"  o'qilgan so'zlar: mediana {np.median(oqilgan):.0f}, "
          f"10% {np.percentile(oqilgan, 10):.0f}, 90% {np.percentile(oqilgan, 90):.0f}")
    korildi = {}
    print(f"  {'README':<10} " + "".join(f"{e:>9}" for e in ELEMENTLAR)
          + f"{'o_rtacha soni':>15}")
    for nom in READMELAR:
        k = np.column_stack([oqilgan >= joy[nom].get(e, np.inf) for e in ELEMENTLAR])
        korildi[nom] = k
        print(f"  {nom:<10} " + "".join(f"{v:>9.3f}" for v in k.mean(axis=0))
              + f"{k.sum(axis=1).mean():>15.2f}")

    print("\n=== 3. Juftlashgan: 'natija' ko'rildi (bir xil ko'rib chiquvchilar) ===")
    j = list(ELEMENTLAR).index("natija")
    for a, b in [("piramida", "hikoya"), ("piramida", "o_rta")]:
        d = korildi[a][:, j].astype(float) - korildi[b][:, j]
        se = d.std(ddof=1) / np.sqrt(n)
        print(f"  {a} - {b}: {d.mean():+.3f} (SE {se:.3f}) sezilarli: {abs(d.mean()) > 2 * se}")

    print("\n=== 4. Sezgirlik: e'tibor vaqti medianasi o'zgarsa ===")
    print(f"  {'mediana':>8} " + "".join(f"{nom:>10}" for nom in READMELAR))
    for med in [15, 30, 60]:
        oq = tezlik * rng.lognormal(np.log(med), 0.5, n)
        print(f"  {med:>7}s " + "".join(
            f"{np.mean(oq >= joy[nom]['natija']):>10.3f}" for nom in READMELAR))
    print("  (qiymatlar - README boshidan natija raqamigacha o'qib yetish ehtimoli)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Elementlar README da qayerda? (undan oldingi so'zlar soni) ===
  README       jami      nima   natija  bazaviy     rasm   buyruq
  hikoya        314       311      298      301      305      203
  o_rta         155         3      139      142      143      148
  piramida      116         3        7       10       17       20
  hikoya     birinchi 10 qatorda natija raqami: False
  o_rta      birinchi 10 qatorda natija raqami: True
  piramida   birinchi 10 qatorda natija raqami: True

=== 2. 5000 ta faraziy ko'rib chiquvchi: element ko'rilish ehtimoli ===
  o'qilgan so'zlar: mediana 135, 10% 67, 90% 266
  README          nima   natija  bazaviy     rasm   buyruq  o_rtacha soni
  hikoya         0.052    0.062    0.059    0.055    0.221           0.45
  o_rta          1.000    0.475    0.463    0.458    0.434           2.83
  piramida       1.000    1.000    1.000    1.000    1.000           5.00

=== 3. Juftlashgan: 'natija' ko'rildi (bir xil ko'rib chiquvchilar) ===
  piramida - hikoya: +0.938 (SE 0.003) sezilarli: True
  piramida - o_rta: +0.525 (SE 0.007) sezilarli: True

=== 4. Sezgirlik: e'tibor vaqti medianasi o'zgarsa ===
   mediana     hikoya     o_rta  piramida
       15s      0.002     0.084     1.000
       30s      0.066     0.459     1.000
       60s      0.414     0.886     1.000
  (qiymatlar - README boshidan natija raqamigacha o'qib yetish ehtimoli)

Natija tahlili.

1-bo'lim — uch README da beshta asosiy element (nima qiladi, natija raqami, bazaviy bilan taqqoslash, rasm, ishga tushirish buyrug'i) nechanchi so'zda birinchi marta uchrashi. "Hikoya" README da (314 so'z) loyiha nima qilishi faqat 311-so'zda, natija 298-so'zda aytiladi — hammasi oxirida. "O'rta" README da nima qilishi darhol (3-so'z), lekin natija 139-so'zda. "Piramida" da hammasi birinchi 20 so'z ichida.

Birinchi 10 qator tekshiruvi qiziq natija berdi: "o'rta" README ham uni o'tdi — natija 7-qatorda. Lekin muammo bo'limining qatorlari uzun abzaslar, shuning uchun 7-qator 139-so'zga to'g'ri keladi. Qatorlar soni — noto'g'ri o'lchov; o'quvchi so'zlarni (va vaqtni) sarflaydi.

2-bo'lim — 5000 ta faraziy ko'rib chiquvchi: har biri 3-6 so'z/soniya tezlikda, e'tibor vaqti log-normal (mediana 30 s) — mediana bo'yicha 135 so'z o'qiydi (10% i 67 dan kam, 10% i 266 dan ko'p). Bu parametrlar faraziy, real odamlar boshqacha bo'lishi mumkin; lekin xulosa ularga sezgir emasligini 4-bo'limda tekshiramiz. "Hikoya" README da natijani atigi 6.2% ko'rib chiquvchi ko'radi, o'rtacha 5 elementdan 0.45 tasi ko'rinadi. "O'rta" da natija 47.5%, "piramida" da 100% — hammasi 5/5.

3-bo'lim — bir xil ko'rib chiquvchilar bilan juftlashgan farq: piramida hikoyadan +0.938 (SE 0.003), o'rtadan +0.525 (SE 0.007) — ikkalasi ham juda sezilarli.

4-bo'lim — sezgirlik: e'tibor vaqti medianasi 15, 30 va 60 soniya. "Hikoya" da natija ko'rilish ehtimoli 0.002, 0.066, 0.414; "o'rta" da 0.084, 0.459, 0.886; "piramida" da har doim 1.000. Ko'rib chiquvchi qanchalik sabrli bo'lmasin, tartib bir xil: teskari piramida ko'rib chiquvchining sabriga bog'liq bo'lmagan yagona variant. Bu — README ni o'zgartirish uchun eng arzon va eng samarali ish: bitta natija qatorini tepaga ko'chirish.


5. To'g'ri va noto'g'ri tushunishlar

Noto'g'ri fikr To'g'risi
"Loyihalar qancha ko'p bo'lsa, shuncha yaxshi" 3-5 ta chuqur, xilma-xil loyiha; takrorlanuvchilar qamrovga hech narsa qo'shmaydi (3-misol)
"Titanic va MNIST — yaxshi boshlanish, portfolio uchun ham" O'quv mashqi; savol va halol baholash yo'q (1-misolda 20 va 10 ball)
"Natija raqami README oxirida bo'lsa ham topiladi" Faraziy ko'rib chiquvchilarning faqat ~6% i oxirigacha yetdi (4-misol)
"Birinchi 10 qatorda natija bo'lsa — yetarli" Qatorlar uzun bo'lsa, natija baribir 139-so'zda bo'lishi mumkin (4-misol)
"Raqamni qo'lda ko'chirish oson" Joy almashgan raqam va eskirgan README ni avtomatik tekshiruv ushlaydi (2-misol)
"Kurs amaliyotini joylasam bo'ldi" O'z savoli, ma'lumoti va xulosasi bo'lmasa, boshqa nomzodlarnikidan farqi yo'q
"Avtomatik ruberika — portfolio sifatining o'lchovi" Faqat o'z-o'zini tekshirish ro'yxati; so'z bilan "aldash" oson
"Demo bo'lsa, README shart emas" Demo uxlab qolishi mumkin; README — asosiy hujjat

6. Keng tarqalgan xatolar va yechimlari

1. Natija README oxirida

python
# README: 6 abzas "qanday o'rgandim" -> o'rnatish -> ... -> natija        # ⚠️
# README: sarlavha -> natija + bazaviy (1-2 qator) -> rasm -> buyruq     # ✅

2. Bazaviysiz raqam

python
"Model AUC 0.81"                                                        # ⚠️
"AUC 0.81 (bazaviy logreg 0.72; juftlashgan farq +0.09, SE 0.01)"       # ✅

3. Qo'lda ko'chirilgan raqamlar

python
readme = readme.replace("0.84", "0.85")   # qo'lda, har qayta o'qitishda  # ⚠️
# metrics.json -> README tekshiruvi CI da (2-misol)                     # ✅

4. Bir xil turdagi loyihalar

python
portfolio = ["titanic", "uy_narxi", "kredit", "ketish"]   # hammasi tabular  # ⚠️
portfolio = ["ketish_xizmati", "sharh_tonalligi", "ab_test", "talab_bashorati"]  # ✅

5. Cheklovlar yo'q

python
# "Model har qanday mijoz uchun ketishni bashorat qiladi"               # ⚠️
# "## Cheklovlar: bitta hudud; kalibrlash tekshirilmagan; drift yo'q"   # ✅

6. Ruxsatsiz ma'lumot

python
df = pd.read_csv("ish_joyidan_mijozlar.csv")   # portfolio uchun         # ⚠️
df = yarat_sintetik(seed=0)  # yoki ochiq manba, litsenziyasi bilan      # ✅

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 7.12, 8.10, 11.10, 14.14, 22.14-25.14, 27.14, 28.12 (o'tilgan): Amaliyot darslari — portfolio loyihalari uchun skelet
  • 18-qism (o'tilgan): Halol baholash — portfolio ruberikasidagi eng og'ir mezon
  • 27.7-27.10 (o'tilgan): FastAPI, Docker, deploy — demo uchun
  • 29.4-dars (o'tilgan): Natijani taqdim etish — README va blog uchun muloqot qoidalari
  • 29.5-dars (o'tilgan): Kaggle — writeup portfolio elementi sifatida
  • 29.6-dars (o'tilgan): GitHub va loyiha tuzilishi — har portfolio loyihasining poydevori
  • 29.8-dars: Rezyume — portfolio loyihalarini bir qatorli natija bilan rezyumega ko'chirish
  • 29.11-dars: Ma'lumot etikasi — mahalliy va yig'ilgan ma'lumot bilan ishlash qoidalari

8. Eng yaxshi amaliyotlar

  1. 3-5 ta tugallangan, xilma-xil loyiha: tabular, matn/rasm, vaqt qatori yoki A/B, deploy.

  2. Har loyiha real savoldan boshlanadi: kim uchun, qanday qaror?

  3. README boshida: nima qiladi, natija raqami, bazaviy bilan taqqoslash.

  4. Halol baholash: bazaviy, to'g'ri bo'lish, noaniqlik, cheklovlar.

  5. Raqamlar natija faylidan; README ni avtomatik tekshiring.

  6. Kurs amaliyotiga o'z savolingiz, ma'lumotingiz va xulosangizni qo'shing; "mening hissam" ni yozing.

  7. Mahalliy ma'lumot — ruxsat, shaxsiy ma'lumotsiz, cheklovlari bilan.

  8. Kamida bitta loyihada demo va blog yozuvi.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # README si bir qatorli, "Accuracy 0.82" li Titanic loyihasi ruberikada qancha oladi?
2.  # vaznlarni tasodifiy o'zgartirsak, eng yaxshi loyiha birinchiligicha qoladimi?
3.  # README da bazaviy AUC 0.732, natija faylida 0.7234 - tekshiruv nima deydi?
4.  # model qayta o'qitildi, README yangilanmadi - nechta raqam mos kelmaydi?
5.  # 4 ta tabular loyiha: bittasini olib tashlasak qamrov kamayadimi?
6.  # ochko'z tanlov (3 qadam) eng yaxshi 3 talik kombinatsiyadan yomonmi?
7.  # natija README ning 298-so'zida: 30 s lik ko'rib chiquvchi uni ko'radimi?
8.  # birinchi 10 qatorda natija bor - bu uning tez topilishini kafolatlaydimi?
Javoblar
  1. 20/100 (1-misol): faqat manba va birinchi ekrandagi raqam
  2. Ha — "Kvartira narxi" 100% holatda birinchi; pastki o'rinlar aralashadi (to'liq tartib 69.0%)
  3. FARQ: round(0.7234, 3) = 0.723, README da 0.732
  4. 10 tadan 7 tasi
  5. Titanic, "Uy narxi", "Kredit riski" uchun yo'q (0.000); "Mijoz ketishi" uchun 0.212
  6. Yo'q — bu masalada aynan maksimumga teng (0.833)
  7. Ehtimoli past: faraziy modelda 6.2%
  8. Yo'q — "o'rta" README da natija 7-qatorda, lekin 139-so'zda (47.5%)

Vazifa 2: Xatolarni tuzating

python
1.  # README.md
    # Mening loyiham
    Bu loyihani kurs davomida qildim, ko'p narsa o'rgandim ...
    (natija 40-qatorda)

2.  "Modelimiz 95% aniqlikka erishdi"     # firibgarlik, 1% ijobiy sinf

3.  portfolio = ["titanic", "iris", "mnist", "uy_narxi", "titanic_v2"]

4.  # README: "AUC 0.85" ; metrics.json: {"auc": 0.8471}

5.  df = pd.read_csv("oldingi_ishdagi_mijozlar.csv")
Javoblar
python
1.  # Mijoz ketishini bashorat qilish
    # Test AUC 0.81 (bazaviy 0.72); top-10% xavfli mijozlar ketuvchilarning 34% i.
    # ![ROC](reports/figures/roc.png)
    # pip install -e . && python -m churn.train

2.  "PR-AUC 0.41 (bazaviy - tasodifiy - 0.01); 80% qamrovda aniqlik 0.12"

3.  portfolio = ["ketish_xizmati", "sharh_tonalligi", "talab_bashorati", "ab_test"]

4.  # README ni metrics.json dan yaratish yoki "AUC 0.847" + CI tekshiruvi

5.  df = yarat_sintetik(seed=0)   # yoki ochiq manba; ish ma'lumoti - hech qachon

Vazifa 3: Ruberika

Modellang (1-misol asosida):

  1. O'z portfolio loyihalaringiz README larini ruberikadan o'tkazing — qaysi mezon eng ko'p ball yo'qotadi?
  2. "Aldash" tajribasi: Titanic README siga faqat kalit so'zlarni qo'shing ("## Muammo", "bazaviy", "95% CI") — ball qanchaga oshadi? Bu ruberikaning qaysi zaifligini ko'rsatadi?
  3. Ruberikaga "mening hissam" va "litsenziya" mezonlarini qo'shing

Vazifa 4: Raqamlar

Modellang (2-misol asosida):

  1. README ni metrics.json dan shablon orqali avtomatik yarating (str.format)
  2. Tekshiruvni "foiz punkti" va "nisbiy foiz" ni farqlaydigan qiling
  3. Tekshiruvni CI qadamiga aylantiring: mos kelmasa — chiqish kodi 1

Vazifa 5: Ko'nikmalar

Modellang (3-misol asosida):

  1. TALAB vaznlarini 10-20 ta vakansiya matnidan o'zingiz hisoblang (29.8: kalit so'zlarni sanash)
  2. Har loyihaga "chuqurlik" (0-3) qo'shing: qamrov + chuqurlik bo'yicha ball
  3. Ochko'z tanlov qachon optimal emas? Qarshi misol quring

Vazifa 6: 30 soniya

Modellang (4-misol asosida):

  1. O'z README laringizni simulyatsiyadan o'tkazing: natija raqami necha foiz ko'rib chiquvchiga yetib boradi?
  2. Ko'rib chiquvchi modeliga "sarlavhalarni ko'z bilan skanerlash" ni qo'shing (sarlavha qatorlari tezroq o'qiladi)
  3. Rasm (grafik) natijani so'zdan tezroq yetkazadi deb faraz qiling — rasm joyini optimallashtiring

Vazifa 7: O'ylash

Kurs bitiruvchisi: "Portfolio uchun kursdagi 14 ta amaliyot darsining hammasini alohida repo qilib joyladim — 14 ta loyiha, hech kimda bunchalik ko'p yo'q. README lar yo'q, lekin kod ichida izohlar bor. Mahalliy ma'lumot bilan ishlash shart emas — xalqaro kompaniyalarga topshiraman."

Javob

Qisqa javob: 14 ta README siz repo — 14 ta "ochilmaydigan eshik". Ko'rib chiquvchi bir-ikki daqiqada bittasini ochadi va agar u yerda natija ko'rinmasa, qolganiga qaytmaydi.

1. Miqdor va sifat. 3-misolda to'rtta tabular loyihadan uchtasi portfolio qamroviga hech narsa qo'shmadi (0.000). 14 ta amaliyot orasida ham takrorlanish ko'p bo'ladi; bundan tashqari ular boshqa kurs bitiruvchilarining repolariga juda o'xshaydi.

2. README siz — ko'rinmaydi. 4-misolda natija README oxirida bo'lsa, faraziy ko'rib chiquvchilarning 6.2% i unga yetdi; README umuman bo'lmasa — nol. Kod ichidagi izohlarni ko'rib chiquvchi o'qimaydi.

python
# tavsiya etilgan reja (2-3 hafta):
# 1) 14 dan 4 tasini tanlash: xilma-xillik bo'yicha (3-misol - ochko'z tanlov)
# 2) har biriga: o'z savol, README (natija tepada), buyruqlar, cheklovlar
# 3) bittasini xizmatga aylantirish (27.14 uslubida) + demo
# 4) qolgan 10 ta - "kurs-mashqlari" nomli bitta repo ga yig'ish (arxiv)

3. Mahalliy ma'lumot haqida. Xalqaro kompaniyaga topshirish uchun ham mahalliy ma'lumot foydali: u sizning loyihangizni minglab bir xil loyihalardan ajratadi va "ma'lumotni o'zim topdim, tozaladim" degan eng kam uchraydigan ko'nikmani ko'rsatadi. README ingliz tilida yozilishi mumkin — ma'lumot manbai mahalliy bo'lsa ham. Majburiy emas, lekin kuchli farqlovchi.

Bitiruvchiga javob: "14 ta loyiha — mehnatingizning yaxshi isboti, lekin ko'rib chiquvchi ularni ko'rmaydi. 4 tasini tanlab, har biriga natija bilan boshlanadigan README yozing, bittasini ishlaydigan xizmatga aylantiring — bu 14 ta repo dan kuchliroq ishlaydi. Qolganlarini bitta arxiv repo ga yig'ing."

Nimani mustahkamlaydi: 2.1, 2.2, 2.3, 2.4, 2.6-bo'limlar.


Xulosa

Bu darsda portfolio ni o'lchanadigan tarzda qurish va yaxshilashni o'rgandik.

Eng muhim uch fikr:

  1. Portfolio — kam, lekin chuqur va xilma-xil. 1-misolda ruberika kuchli loyihani (100) zaiflaridan (10-27.5) vaznlar qanday bo'lmasin ajratdi; 3-misolda 4 ta tabular loyihadan uchtasi qamrovga hech narsa qo'shmadi, kurs amaliyotlaridan 3 ta xilma-xil loyiha qo'shish esa vaznli qamrovni 0.56 dan 0.83 ga ko'tardi.

  2. Birinchi ekran hal qiladi. 4-misolda natija README oxirida bo'lganda faraziy ko'rib chiquvchilarning 6.2% i, o'rtada — 47.5% i, tepada — 100% i uni ko'rdi; bu tartib e'tibor vaqti 15 dan 60 soniyagacha o'zgarganda ham saqlandi. Qatorlar soni emas, so'zlar (vaqt) muhim.

  3. Raqamlar — natija faylidan, avtomatik tekshiruv bilan. 2-misolda o'rni almashgan bitta raqam (0.732 va 0.723) README ichida ziddiyat va noto'g'ri nisbiy da'vo yaratdi; qayta o'qitishdan keyin eskirgan README da 10 raqamdan 7 tasi mos kelmadi — ikkala xatoni ham tekshiruv darhol ushladi.

Keyingi darsda Rezyume va ish qidirish: ma'lumotlar fani rezyumesining tuzilishi, loyihalarni natija raqami bilan bir qatorga sig'dirish, rezyumeni vakansiya talablariga moslash va ish qidirish jarayonini tashkil qilish.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
29.7-dars: Portfolio yaratish — IlmHamroh