Mundarija (25)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Portfolio nima uchun: ish beruvchi nimani ko'radi
- 2.2. Yaxshi portfolio loyihasi mezonlari
- 2.3. Xilma-xillik: 3-5 ta loyiha
- 2.4. Kurs amaliyotlaridan portfolio loyihalari
- 2.5. Loyiha sahifasi: README namunasi
- 2.6. Raqamlar halolligi
- 2.7. Blog yozuvi
- 2.8. Demo: API yoki interaktiv sahifa
- 2.9. O'zbek konteksti: mahalliy ma'lumot bilan loyihalar
- 2.10. Portfolio qayerda joylashadi
- 2.11. Tuzoqlar
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Portfolio ruberikasi: namuna loyihalarni baholash va vaznlarga sezgirlik
- Misol 2 — README raqamlari va natija fayli: ko'chirish xatosini ushlash
- Misol 3 — Ko'nikmalar matritsasi: qamrov, takrorlanish va keyingi loyihani tanlash
- Misol 4 — "30 soniyalik ko'rib chiqish": README boshida asosiy ma'lumot bormi?
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
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
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
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 10Vaznlar — 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.
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 bilan2.3. Xilma-xillik: 3-5 ta loyiha
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.
# 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.)*

## 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").
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'shish2.7. Blog yozuvi
README — ma'lumotnoma, blog yozuvi — hikoya. Bitta yaxshi yozuv loyiha haqida suhbatni boshlab beradi va muloqot ko'nikmasini ko'rsatadi.
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 qiymat2.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):
# 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")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'lsin2.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):
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
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
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 NoneQaysi 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 bilan4. 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
"""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:
=== 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 birinchiNatija 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
"""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:
=== 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 chiqmaydiNatija 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
"""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:
=== 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: 0Natija 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?
"""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.",
"",
"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).",
"",
"## 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.",
"",
" 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:
=== 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
# README: 6 abzas "qanday o'rgandim" -> o'rnatish -> ... -> natija # ⚠️
# README: sarlavha -> natija + bazaviy (1-2 qator) -> rasm -> buyruq # ✅2. Bazaviysiz raqam
"Model AUC 0.81" # ⚠️
"AUC 0.81 (bazaviy logreg 0.72; juftlashgan farq +0.09, SE 0.01)" # ✅3. Qo'lda ko'chirilgan raqamlar
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
portfolio = ["titanic", "uy_narxi", "kredit", "ketish"] # hammasi tabular # ⚠️
portfolio = ["ketish_xizmati", "sharh_tonalligi", "ab_test", "talab_bashorati"] # ✅5. Cheklovlar yo'q
# "Model har qanday mijoz uchun ketishni bashorat qiladi" # ⚠️
# "## Cheklovlar: bitta hudud; kalibrlash tekshirilmagan; drift yo'q" # ✅6. Ruxsatsiz ma'lumot
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
3-5 ta tugallangan, xilma-xil loyiha: tabular, matn/rasm, vaqt qatori yoki A/B, deploy.
Har loyiha real savoldan boshlanadi: kim uchun, qanday qaror?
README boshida: nima qiladi, natija raqami, bazaviy bilan taqqoslash.
Halol baholash: bazaviy, to'g'ri bo'lish, noaniqlik, cheklovlar.
Raqamlar natija faylidan; README ni avtomatik tekshiring.
Kurs amaliyotiga o'z savolingiz, ma'lumotingiz va xulosangizni qo'shing; "mening hissam" ni yozing.
Mahalliy ma'lumot — ruxsat, shaxsiy ma'lumotsiz, cheklovlari bilan.
Kamida bitta loyihada demo va blog yozuvi.
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
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
20/100(1-misol): faqat manba va birinchi ekrandagi raqam- Ha — "Kvartira narxi" 100% holatda birinchi; pastki o'rinlar aralashadi (to'liq tartib 69.0%)
FARQ:round(0.7234, 3) = 0.723, README da0.732- 10 tadan 7 tasi
- Titanic, "Uy narxi", "Kredit riski" uchun yo'q (
0.000); "Mijoz ketishi" uchun0.212 - Yo'q — bu masalada aynan maksimumga teng (
0.833) - Ehtimoli past: faraziy modelda
6.2% - Yo'q — "o'rta" README da natija 7-qatorda, lekin 139-so'zda (
47.5%)
Vazifa 2: Xatolarni tuzating
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
1. # Mijoz ketishini bashorat qilish
# Test AUC 0.81 (bazaviy 0.72); top-10% xavfli mijozlar ketuvchilarning 34% i.
# 
# 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 qachonVazifa 3: Ruberika
Modellang (1-misol asosida):
- O'z portfolio loyihalaringiz README larini ruberikadan o'tkazing — qaysi mezon eng ko'p ball yo'qotadi?
- "Aldash" tajribasi: Titanic README siga faqat kalit so'zlarni qo'shing ("## Muammo", "bazaviy", "95% CI") — ball qanchaga oshadi? Bu ruberikaning qaysi zaifligini ko'rsatadi?
- Ruberikaga "mening hissam" va "litsenziya" mezonlarini qo'shing
Vazifa 4: Raqamlar
Modellang (2-misol asosida):
- README ni
metrics.jsondan shablon orqali avtomatik yarating (str.format) - Tekshiruvni "foiz punkti" va "nisbiy foiz" ni farqlaydigan qiling
- Tekshiruvni CI qadamiga aylantiring: mos kelmasa — chiqish kodi 1
Vazifa 5: Ko'nikmalar
Modellang (3-misol asosida):
TALABvaznlarini 10-20 ta vakansiya matnidan o'zingiz hisoblang (29.8: kalit so'zlarni sanash)- Har loyihaga "chuqurlik" (0-3) qo'shing: qamrov + chuqurlik bo'yicha ball
- Ochko'z tanlov qachon optimal emas? Qarshi misol quring
Vazifa 6: 30 soniya
Modellang (4-misol asosida):
- O'z README laringizni simulyatsiyadan o'tkazing: natija raqami necha foiz ko'rib chiquvchiga yetib boradi?
- Ko'rib chiquvchi modeliga "sarlavhalarni ko'z bilan skanerlash" ni qo'shing (sarlavha qatorlari tezroq o'qiladi)
- 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.
# 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:
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 qamrovni0.56dan0.83ga ko'tardi.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.Raqamlar — natija faylidan, avtomatik tekshiruv bilan. 2-misolda o'rni almashgan bitta raqam (
0.732va0.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.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!