Python / Эцсийн төсөл

Эцсийн төсөл

Та 49 хичээл туулж энд хүрлээ. Хувьсагч, функц, давталтаас эхлэн OOP, async, ML хүртэл — энэ бол жинхэнэ амжилт. Эцсийн төслийн зорилго нэг: сурсан бүх зүйлээ нэг бодит програмд нэгтгэх. Загвар дагах биш — өөрөө бодож, өөрөө шийдэж бүтээнэ.

Төслийн тодорхойлолт

Та оюутны оноог шинжлэх CLI хэрэгсэл бүтээнэ. Энэ хэрэгсэл нь:

  • CSV файлаас оноо уншина
  • Өгөгдлийг цэвэрлэж баталгаажуулна
  • Статистик тооцоолж хэвлэнэ
  • Гистограмм зураг хадгална
  • Командын мөрнөөс ажиллана

Доорх кодыг нэг бүрчлэн уншиж ойлгоорой — шууд хуулж болохгүй, учрыг нь ойлгосны дараа өөрийн гараар бичнэ.

Төслийн бүтэц

код
шинжилгээ/
├── main.py          ← CLI оролт, argparse
├── уншигч.py        ← CSV унших, баталгаажуулах
├── шинжилгээ.py     ← статистик тооцоолол
├── дүрслэл.py       ← matplotlib график
├── requirements.txt
└── оноонууд.csv     ← туршилтын өгөгдөл

Өгөгдөл бэлдэх

оноонууд.csv файл үүсгэнэ:

csv
нэр,оноо,хичээл
Болд,85,Математик
Сарнай,92,Математик
Төгс,,Математик
Номин,78,Физик
Эрдэнэ,95,Физик
Болд,88,Физик
Сарнай,70,Биологи
Номин,95,Биологи
Эрдэнэ,60,Биологи
Төгс,82,Математик

Уншигч модуль

python
# уншигч.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

Шинжилгээ ба дүрслэл модуль

python
# шинжилгээ.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()
python
# дүрслэл.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

python
# 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.график)

Ажиллуулах:

bash
# Бүх өгөгдөл
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 |

Хамгийн чухал зүйл: код бичсээр байх. Жижиг ч байсан өөрийн төсөл байг — тэр чинь хамгийн сайн багш.