Praktische Anwendung: Datenanalyse mit Gruppierungstechniken
Nachdem Sie verschiedene Methoden zur Gruppierung von Daten verstanden haben, wollen wir diese Techniken anwenden, um ein reales Problem zu lösen: die Analyse eines Datensatzes von Schülerdatensätzen. Wir werden verschiedene Gruppierungsmethoden verwenden, um nützliche Informationen aus den Daten zu extrahieren.
Einrichten des Beispieldatensatzes
Zuerst erstellen wir unseren Schülerdatensatz:
-
Erstellen Sie eine neue Datei namens student_analysis.py
im Verzeichnis /home/labex/project
.
-
Fügen Sie den folgenden Code hinzu, um die Beispieldaten einzurichten:
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']}")
- Speichern Sie die Datei.
Verwenden von defaultdict
, um Schüler nach Fach zu gruppieren
Analysieren wir, welche Schüler jedes Fach belegen:
- Fügen Sie den folgenden Code zu Ihrer Datei
student_analysis.py
hinzu:
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}")
- Speichern Sie die Datei.
Berechnen der Durchschnittsnoten nach Fach
Berechnen wir die Durchschnittsnote für jedes Fach:
- Fügen Sie den folgenden Code zu Ihrer Datei
student_analysis.py
hinzu:
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}")
- Speichern Sie die Datei.
Verwenden wir nun itertools.groupby()
, um die Verteilung der Noten zu analysieren:
- Fügen Sie den folgenden Code zu Ihrer Datei
student_analysis.py
hinzu:
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")
- Speichern Sie die Datei.
Kombinieren von Techniken: Erweiterte Analyse
Schließlich wollen wir eine komplexere Analyse durchführen, indem wir unsere Gruppierungstechniken kombinieren:
- Fügen Sie den folgenden Code zu Ihrer Datei
student_analysis.py
hinzu:
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")
-
Speichern Sie die Datei.
-
Führen Sie das vollständige Skript aus:
python3 /home/labex/project/student_analysis.py
Sie sollten eine umfassende Analyse der Schülerdaten sehen, einschließlich:
- Schülerdatensätze
- Schüler nach Fach gruppiert
- Durchschnittsnoten nach Fach
- Gesamtnotenverteilung
- Notenverteilung nach Fach
Dieses Beispiel zeigt, wie verschiedene Gruppierungstechniken kombiniert werden können, um komplexe Datenanalysen mit relativ einfachem Code durchzuführen. Jeder Ansatz hat seine Stärken:
defaultdict
eignet sich hervorragend für einfaches Gruppieren, ohne die Existenz von Schlüsseln überprüfen zu müssen
itertools.groupby()
ist effizient für die Arbeit mit sortierten Daten
- Die Kombination von Techniken ermöglicht mehrstufiges Gruppieren und komplexe Analysen
Die Auswahl der richtigen Gruppierungstechnik hängt von Ihren spezifischen Anforderungen und der Struktur Ihrer Daten ab.