Практическое применение: Анализ данных с использованием методов группировки
Теперь, когда вы понимаете несколько методов группировки данных, давайте применим эти методы для решения реальной проблемы: анализа набора данных записей студентов. Мы будем использовать различные методы группировки для извлечения полезной информации из данных.
Настройка примера набора данных
Сначала давайте создадим наш набор данных записей студентов:
-
Создайте новый файл с именем student_analysis.py
в каталоге /home/labex/project
.
-
Добавьте следующий код для настройки примера данных:
import itertools
from collections import defaultdict
## Sample student data
students = [
{"id": 1, "name": "Emma", "grade": "A", "subject": "Math", "score": 95},
{"id": 2, "name": "Noah", "grade": "B", "subject": "Math", "score": 82},
{"id": 3, "name": "Olivia", "grade": "A", "subject": "Science", "score": 90},
{"id": 4, "name": "Liam", "grade": "C", "subject": "Math", "score": 75},
{"id": 5, "name": "Ava", "grade": "B", "subject": "Science", "score": 88},
{"id": 6, "name": "William", "grade": "A", "subject": "History", "score": 96},
{"id": 7, "name": "Sophia", "grade": "B", "subject": "History", "score": 85},
{"id": 8, "name": "James", "grade": "C", "subject": "Science", "score": 72},
{"id": 9, "name": "Isabella", "grade": "A", "subject": "Math", "score": 91},
{"id": 10, "name": "Benjamin", "grade": "B", "subject": "History", "score": 84}
]
print("Student Records:")
for student in students:
print(f"ID: {student['id']}, Name: {student['name']}, Subject: {student['subject']}, Grade: {student['grade']}, Score: {student['score']}")
- Сохраните файл.
Использование defaultdict для группировки студентов по предмету
Давайте проанализируем, какие студенты изучают каждый предмет:
- Добавьте следующий код в ваш файл
student_analysis.py
:
print("\n--- Students Grouped by Subject ---")
## Group students by subject using defaultdict
subject_groups = defaultdict(list)
for student in students:
subject_groups[student["subject"]].append(student["name"])
## Print students by subject
for subject, names in subject_groups.items():
print(f"{subject}: {names}")
- Сохраните файл.
Расчет средних баллов по предмету
Давайте рассчитаем средний балл по каждому предмету:
- Добавьте следующий код в ваш файл
student_analysis.py
:
print("\n--- Average Scores by Subject ---")
## Calculate average scores for each subject
subject_scores = defaultdict(list)
for student in students:
subject_scores[student["subject"]].append(student["score"])
## Calculate and print averages
for subject, scores in subject_scores.items():
average = sum(scores) / len(scores)
print(f"{subject} Average: {average:.2f}")
- Сохраните файл.
Теперь давайте используем itertools.groupby()
для анализа распределения оценок:
- Добавьте следующий код в ваш файл
student_analysis.py
:
print("\n--- Grade Distribution (using itertools.groupby) ---")
## Sort students by grade first
sorted_students = sorted(students, key=lambda x: x["grade"])
## Group and count students by grade
grade_counts = {}
for grade, group in itertools.groupby(sorted_students, key=lambda x: x["grade"]):
grade_counts[grade] = len(list(group))
## Print grade distribution
for grade, count in grade_counts.items():
print(f"Grade {grade}: {count} students")
- Сохраните файл.
Комбинирование методов: Расширенный анализ
Наконец, давайте выполним более сложный анализ, объединив наши методы группировки:
- Добавьте следующий код в ваш файл
student_analysis.py
:
print("\n--- Advanced Analysis: Grade Distribution by Subject ---")
## Group by subject and grade
subject_grade_counts = defaultdict(lambda: defaultdict(int))
for student in students:
subject = student["subject"]
grade = student["grade"]
subject_grade_counts[subject][grade] += 1
## Print detailed grade distribution by subject
for subject, grades in subject_grade_counts.items():
print(f"\n{subject}:")
for grade, count in grades.items():
print(f" Grade {grade}: {count} students")
-
Сохраните файл.
-
Запустите полный скрипт:
python3 /home/labex/project/student_analysis.py
Вы должны увидеть всесторонний анализ данных студентов, включая:
- Записи студентов
- Студенты, сгруппированные по предмету
- Средние баллы по предмету
- Общее распределение оценок
- Распределение оценок по предмету
Этот пример демонстрирует, как различные методы группировки можно комбинировать для выполнения сложного анализа данных с относительно простым кодом. Каждый подход имеет свои сильные стороны:
defaultdict
отлично подходит для простой группировки без необходимости проверять существование ключа
itertools.groupby()
эффективен для работы с отсортированными данными
- Комбинирование методов позволяет выполнять многоуровневую группировку и сложный анализ
Выбор правильного метода группировки зависит от ваших конкретных потребностей и структуры ваших данных.