Эцсийн төсөл
Та 49 хичээл туулж энд хүрлээ. Хувьсагч, функц, давталтаас эхлэн OOP, async, ML хүртэл — энэ бол жинхэнэ амжилт. Эцсийн төслийн зорилго нэг: сурсан бүх зүйлээ нэг бодит програмд нэгтгэх. Загвар дагах биш — өөрөө бодож, өөрөө шийдэж бүтээнэ.
Төслийн тодорхойлолт
Та оюутны оноог шинжлэх CLI хэрэгсэл бүтээнэ. Энэ хэрэгсэл нь:
- CSV файлаас оноо уншина
- Өгөгдлийг цэвэрлэж баталгаажуулна
- Статистик тооцоолж хэвлэнэ
- Гистограмм зураг хадгална
- Командын мөрнөөс ажиллана
Доорх кодыг нэг бүрчлэн уншиж ойлгоорой — шууд хуулж болохгүй, учрыг нь ойлгосны дараа өөрийн гараар бичнэ.
Төслийн бүтэц
шинжилгээ/
├── main.py ← CLI оролт, argparse
├── уншигч.py ← CSV унших, баталгаажуулах
├── шинжилгээ.py ← статистик тооцоолол
├── дүрслэл.py ← matplotlib график
├── requirements.txt
└── оноонууд.csv ← туршилтын өгөгдөл
Өгөгдөл бэлдэх
оноонууд.csv файл үүсгэнэ:
нэр,оноо,хичээл
Болд,85,Математик
Сарнай,92,Математик
Төгс,,Математик
Номин,78,Физик
Эрдэнэ,95,Физик
Болд,88,Физик
Сарнай,70,Биологи
Номин,95,Биологи
Эрдэнэ,60,Биологи
Төгс,82,Математик
Уншигч модуль
# уншигч.py
import pandas as pd
from pathlib import Path
def csv_унших(зам: str) -> pd.DataFrame:
файл = Path(зам)
if not файл.exists():
raise FileNotFoundError(f"Файл олдсонгүй: {зам}")
if файл.suffix.lower() != ".csv":
raise ValueError("Зөвхөн .csv файл дэмжигдэнэ.")
df = pd.read_csv(файл, encoding="utf-8")
# Баганыг шалгах
шаардагдах = {"нэр", "оноо", "хичээл"}
дутуу = шаардагдах - set(df.columns)
if дутуу:
raise ValueError(f"Дутуу багана: {дутуу}")
# Цэвэрлэх
df["нэр"] = df["нэр"].str.strip()
df["хичээл"] = df["хичээл"].str.strip()
df["оноо"] = pd.to_numeric(df["оноо"], errors="coerce")
дутуу_тоо = df["оноо"].isnull().sum()
if дутуу_тоо:
print(f"⚠ {дутуу_тоо} дутуу оноо олдлоо — тэдгээрийг хасав.")
df = df.dropna(subset=["оноо"])
df["оноо"] = df["оноо"].clip(0, 100).astype(int)
return df
Шинжилгээ ба дүрслэл модуль
# шинжилгээ.py
import pandas as pd
def статистик_хэвлэх(df: pd.DataFrame) -> None:
print("\n" + "═" * 40)
print(f" Нийт бичлэг : {len(df)}")
print(f" Оюутны тоо : {df['нэр'].nunique()}")
print(f" Дундаж оноо : {df['оноо'].mean():.1f}")
print(f" Хамгийн өндөр: {df['оноо'].max()} ({df.loc[df['оноо'].idxmax(), 'нэр']})")
print(f" Хамгийн бага : {df['оноо'].min()} ({df.loc[df['оноо'].idxmin(), 'нэр']})")
print("═" * 40)
print("\nХичээлээр дундаж оноо:")
хичээлээр = df.groupby("хичээл")["оноо"].agg(["mean", "count"])
хичээлээр.columns = ["дундаж", "тоо"]
for хичээл, мөр in хичээлээр.iterrows():
print(f" {хичээл:<12} {мөр['дундаж']:5.1f} ({мөр['тоо']:.0f} оюутан)")
print("\nОноогоор зэрэглэл:")
def зэрэглэл(оноо: int) -> str:
if оноо >= 90: return "А"
if оноо >= 75: return "В"
if оноо >= 60: return "С"
return "D"
df["зэрэглэл"] = df["оноо"].apply(зэрэглэл)
print(df.groupby("зэрэглэл")["нэр"].count().to_string())
print()
# дүрслэл.py
import matplotlib.pyplot as plt
import pandas as pd
def гистограмм_хадгалах(df: pd.DataFrame, гаралт: str) -> None:
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(11, 4))
# Гистограмм
ax1.hist(df["оноо"], bins=10, range=(0, 100),
color="#a78bfa", edgecolor="white", alpha=0.85)
ax1.axvline(df["оноо"].mean(), color="#fbbf24",
linestyle="--", linewidth=2, label=f"Дундаж: {df['оноо'].mean():.1f}")
ax1.set_title("Онооны тархалт")
ax1.set_xlabel("Оноо")
ax1.set_ylabel("Оюутны тоо")
ax1.legend()
ax1.grid(True, alpha=0.3)
# Хичээлээр хайрцаг диаграмм
хичээлүүд = df["хичээл"].unique()
өгөгдлүүд = [df[df["хичээл"] == х]["оноо"].values for х in хичээлүүд]
ax2.boxplot(өгөгдлүүд, labels=хичээлүүд, patch_artist=True,
boxprops=dict(facecolor="#60a5fa", alpha=0.6))
ax2.set_title("Хичээлээр харьцуулалт")
ax2.set_ylabel("Оноо")
ax2.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig(гаралт, dpi=150)
print(f"График хадгалагдлаа: {гаралт}")
CLI оролт — main.py
# main.py
import argparse
from уншигч import csv_унших
from шинжилгээ import статистик_хэвлэх
from дүрслэл import гистограмм_хадгалах
parser = argparse.ArgumentParser(description="Оюутны оноог шинжлэх хэрэгсэл")
parser.add_argument("файл", help="CSV файлын зам")
parser.add_argument("--график", default="гаралт.png", help="Зургийн нэр (default: гаралт.png)")
parser.add_argument("--хичээл", help="Зөвхөн энэ хичээлийг шинжлэх")
args = parser.parse_args()
df = csv_унших(args.файл)
if args.хичээл:
df = df[df["хичээл"] == args.хичээл]
if df.empty:
print(f"Алдаа: '{args.хичээл}' хичээл олдсонгүй.")
exit(1)
статистик_хэвлэх(df)
гистограмм_хадгалах(df, args.график)
Ажиллуулах:
# Бүх өгөгдөл
python main.py оноонууд.csv
# Зөвхөн нэг хичээл
python main.py оноонууд.csv --хичээл Физик --график физик.png
Дараагийнх: таны аялал үргэлжилнэ
Та Python-ийн суурийг бүрэн эзэмшлээ — энэ бол жижиг зүйл биш. Цаашид судлах чиглэлүүд:
| Чиглэл | Судлах зүйл | | ------ | ----------- | | Backend | FastAPI, PostgreSQL, Docker | | Өгөгдлийн шинжилгээ | Pandas дэвшилтэт, Seaborn, Plotly | | Machine Learning | scikit-learn дэвшилтэт, XGBoost | | Deep Learning | TensorFlow, PyTorch | | Автоматжуулалт | Selenium, Playwright, Airflow |
Хамгийн чухал зүйл: код бичсээр байх. Жижиг ч байсан өөрийн төсөл байг — тэр чинь хамгийн сайн багш.