Skip to content

Commit

Permalink
add courses parser
Browse files Browse the repository at this point in the history
  • Loading branch information
Samoed committed Sep 6, 2024
1 parent 5cebbc7 commit b0a82fd
Show file tree
Hide file tree
Showing 5 changed files with 309 additions and 8 deletions.
9 changes: 9 additions & 0 deletions courses_processor/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Папка нужна для генерации списка всех курсов
1. Создать папки с названием курса (1 или 2)

В каждой папке добавить:
- Файл с описанием курсов (сейчас notion из которого экспортируется csv)
- Таблицу с предвыборностью
- Таблицу с расписанием
2. Запустить скрипт `python compare_courses.py`
3. Изменять его до тех пор, пока в `total_courses.json` не будет повторений
120 changes: 120 additions & 0 deletions courses_processor/compare_courses.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
import json

import pandas as pd

notion_file = "notion.csv"
timetable_file = "Расписание.xlsx"
preselection_file = "Таблица предвыборности.xlsx"


def standardize_course_name(course):
if not isinstance(course, str):
return None

course = course.strip()

for check in (
"Выходной",
"Хакатон",
"Demoday",
"Количество выбранных курсов",
"Вариант обучения",
"Преподаватель:",
):
if check in course:
return None

if any(keyword in course for keyword in ["Экзамен", "Лекция", "Зачет"]):
return None

if "\n" in course:
course = course.split("\n")[0].strip()

replacements = {
"A/B тестирование": "А/В тестирование",
"Управление RnD командами": "Проведение научных исследований в области ИИ (Управление RnD командами)",
"Проведение научных исследований в области ИИ": (
"Проведение научных исследований в области ИИ (Управление RnD командами)"
),
"Этика ИИ": "Этика искусственного интеллекта",
"Системы обработки и анализа больших массивов данных (VK)": (
"Системы обработки и анализа больших массивов данных"
),
"Симулятор DS от Karpov.courses": "Симулятор DS от Karpov.Courses",
"DS симулятор от Karpov.courses": "Симулятор DS от Karpov.Courses",
"Программирование на С++": ["C++ Lite", "C++ Hard"],
"Uplift-моделирование": "UPLIFT-моделирование",
"Продвинутое A/B-тестирование": "Продвинутое А/B - тестирование",
"А/В тестирование и Reliable ML": "А/В тестирование",
"Построение баз данных": "Построение БД",
"Введение в большие языковые модели (LLM)": "Введение в LLM",
"Создание технологического бизнеса: чек-лист для предпринимателей": "Создание технологического бизнеса",
(
"High Tech Business Creation: check-list for entrepreneurs"
" / Создание технологического бизнеса: чек-лист для предпринимателей"
): "Создание технологического бизнеса",
"Воркшоп по разработке автономного агента на основе LLM (Осенний семестр)": (
"Воркшоп по разработке автономного агента на основе LLM"
),
}

if course in replacements:
return replacements[course]

return course


def timetable_parser(timetable_filename: str):
df = pd.read_excel(timetable_filename, sheet_name="Расписание")
timetable = df.iloc[2:, 5:10].to_numpy().flatten()
t = pd.Series(timetable)
full_courses = set(t[pd.notna(t)].tolist())
return set(filter(None, map(standardize_course_name, full_courses)))


def preselection_parser(preselection_filename: str, preselection_params):
df = pd.read_excel(preselection_filename, sheet_name=preselection_params["name"])
courses_row = df.iloc[1, 4:-5]
courses = set(courses_row.tolist())
return set(filter(None, map(standardize_course_name, courses)))


def notion_parser(notion_filename: str) -> set[str]:
df = pd.read_csv(notion_filename)
courses = df["Курсы"].tolist()
standardized_courses = []
for course in map(standardize_course_name, courses):
if isinstance(course, list):
standardized_courses.extend(course)
elif course:
standardized_courses.append(course)
return set(standardized_courses)


def main(course_folder: str, preselection_params):
notion_courses = notion_parser(course_folder + notion_file)
timetable_courses = timetable_parser(course_folder + timetable_file)
preselection_courses = preselection_parser(course_folder + preselection_file, preselection_params)

for name, courses in [
("notion", notion_courses),
("timetable", timetable_courses),
("preselection", preselection_courses),
]:
with open(f"{course_folder}{name}_courses.json", "w", encoding="utf-8") as f:
json.dump(list(courses), f, ensure_ascii=False)

print("course folder", course_folder)
print("notion", notion_courses)
print("Courses in preselection, but not in notion", preselection_courses - notion_courses)
print("Courses in timetable, but not in notion", timetable_courses - notion_courses)
print("Courses in timetable, but not in preselection", timetable_courses - preselection_courses)
return notion_courses, timetable_courses, preselection_courses


if __name__ == "__main__":
course_1 = main("course_1/", {"name": "Таблица предвыборности"})
course_2 = main("course_2/", {"name": "Таблица выборности"})
total_courses = set().union(*course_1, *course_2)
with open("total_courses.json", "w", encoding="utf-8") as f:
json.dump(sorted(total_courses), f, ensure_ascii=False, indent=4)
68 changes: 68 additions & 0 deletions courses_processor/total_courses.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
[
"C++ Hard",
"C++ Lite",
"MLOps",
"Multimodal Language Models",
"UNIX/Linux системы",
"UPLIFT-моделирование",
"А/В тестирование",
"Автоматическое машинное обучение",
"Алгоритмы и структуры данных",
"Бизнес-аналитика",
"Введение в LLM",
"Введение в МО (Python) и Продвинутое МО (Python)",
"Введение в МО на графах",
"Воркшоп по разработке автономного агента на основе LLM",
"Вычисления на графических процессорах (GPU)",
"Глубокое обучение и компьютерное зрение",
"Графические интерфейсы",
"Графы знаний",
"Динамическое ценообразование",
"Дополнительные разделы машинного обучения",
"Инжиниринг управления данными",
"Иностранный язык",
"Инструменты разработки data-driven решений",
"История и философия науки",
"Кейсы применения машинного обучения",
"Компьютерная химия и моделирование химических систем / Computational Chemistry and Modeling of Chemical Systems",
"Контейнеризация и оркестрация приложений",
"Критическое мышление в практической деятельности",
"Математика для машинного обучения и анализа данных",
"Математическая статистика",
"Машинное обучение для анализа научных данных",
"Машинное обучение и анализ данных (практикум)",
"Нейросети в химии / Neural Networks in Chemistry",
"Обработка и генерация изображений",
"Основы глубокого обучения",
"Основы машинного обучения (ml-basic)",
"Педагогическая практика",
"Построение БД",
"Практика применения машинного обучения",
"Проведение научных исследований в области ИИ (Управление RnD командами)",
"Программирование на Java (продвинутый)",
"Программирование на естественном языке",
"Программирование на языке Kotlin",
"Продвинутое А/B - тестирование",
"Продвинутое МО (Python) и Глубокое обучение",
"Продвинутый курс научных исследований",
"Продуктовые исследования",
"Проектирование архитектуры микросервисов",
"Проектирование систем машинного обучения (ML System Design)",
"Проектная практика",
"Производственная проектно-технологическая практика",
"Производственная, научно-исследовательская практика",
"Процессы и методологии разработки решений на основе ИИ",
"Работа в удаленных командах",
"Разработка веб-приложений (Python Backend)",
"Ранжирование и матчинг",
"Рекомендательные системы",
"Симулятор DS от Karpov.Courses",
"Системы обработки и анализа больших массивов данных",
"Создание технологического бизнеса",
"Стартап-трек: от идеи до бизнеса",
"Стратегия развития AI-продуктов",
"Управление данными",
"Хранение больших данных и Введение в МО (Python)",
"Цифровая обработка сигналов (Digital Signal Processing)",
"Этика искусственного интеллекта"
]
Loading

0 comments on commit b0a82fd

Please sign in to comment.