На практиці спробувати використати Python для обробки текстових даних, навчитись працювати з файлами.
В інтернеті існує достатньо багато джерел, де можна знайти підготовлені для аналізу набори даних ("датасети", datasets). В цій роботі ми будемо працювати зі справжньою базою даних олімпійських атлетів за останні 120 років з сайту Kaggle. Дані скачані з сайту та лежать в цьому репозиторії, готові для обробки. Крім того, я імпортував дані в гуглдок
Дані знаходяться у форматі .csv
- це один з найпростіших форматів для даних. Його суть описана в назві - CSV
- comma separated values - "значення розділені комою". Фактично, ви можете відкрити такий файл будь-яким текстовим редактором та побачите напступне:
В першому рядку вказані назви стовбчиків, а в наступних - значення. Зауважу, що не дивлячись на назву у .csv
можуть бути і інші розідльники, не тільки кома
Як і в минулих роботах, завдання має різні рівні складності. Але, в цій роботі рівні слід виконувати послідовно, тобто найбільш повна програма матиме всередині себе всі три рівні
1 рівень. Напишіть програму, що приймає наступні аргументи командного рядка:
- Адреса файлу з даними;
- Завжди
-medals
- Країна (назва може вводитись як за повною назвою, так і за кодом)
- Рік проведення Олімпіади
- (Опціонально)
-output
- (Опціонально) файл для виведення результатів
Наприклад, olympics.py data.csv -medals USA 1996
, або olympics.py data.csv -medals AUT 1976 -output result.txt
Програма має обробити наданий файл та вивести в стовбчик перші десять медалістів з цієї країни на заданій олімпіади (у форматі "ім'я - дисципліна - тип медалі"), а під цим - сумарну кількість медалей за типом (золоті, срібні та бронзові) у цієї країни. Програма має коректно обробляти крайні випадки (у заданої країни менше 10 медалей, введена країна не існує або у введений рік не проводилась олімпіада). Якщо користувач ввів параметр -output
, то результат має бути виведений не тільки на екран, а і у вказаний файл
2 рівень. Додайте до програми підтримку іншої команди - -total
, за якою аргументом йде рік. Наприклад, olympics.py data.csv -total 1972
. Після цього програма має вивести на екран дані про всі країни, що здобули на цій олімпіаді хоча б одну медаль у форматі "країна - золото - срібло - бронза"
3 рівень. Додайте до програми підтримку іншої команди - -overall
, за яким йде довільна кількість країн. Наприклад, olympics.py data.csv -overall Ukraine Ireland Canada
. Програма має вивести на екран для кожної з введених країн рік в якій вона здобула найбільшу кількість медалей та це число
- Повторіть, якщо не пам'ятаєте, string slicing, це може спростити життя в даній роботі
- На лекції ми розглядали наступний формат зчитування даних з файлу:
file = open(path, 'r')
lines = file.readlines()
Проте, цей формат може бути повільним та не зручним для роботи з великими файлами. Наприклад, наш набір даних містить 41Мб (інші набори можуть містити сотні Мб або Гб), і зчитувати всі 40 мільйонів символів у масив перед початком роботи не раціонально. Замість цього, можна у циклі використовувати метод file.readline()
, який буде повертати щоразу наступний рядок з файла, поки файл не закінчиться, після чого буде повернуто порожній рядок
next_line = file.readline()
while next_line:
# do stuff with line
next_line = file.readline()
- В цій роботі, особливо на етапах починаючи з другого, вам може знадобитись нова структура даних - словник (dictionary). Якщо список збергіає певну множину значень до якої можна доступатись за номером елемента, то словник зберігає множину пар "ключ-значення", коли за будь-яким ключем можна дістати віповідне значення. Приклад - телефонна книга.
phone_book = {
"Ann": "095-150-23-34",
"Bob": "063-456-12-43",
"Charlie": "050-123-12-56"
}
Для того щоб дістати телефон Ann, достатньо викликати phone_book["Ann"]
. Детальніше можна почитати тут або тут. У цій роботі ви можете використовувати словник для того щоб, наприклад, накопичувати медалі по країнам (словник країна -> кількість медалей)
Максимальний бал - 5:
- 1 бал - першій рівень
- 1 бал - другий рівень
- 1 бал - третій рівень
- 1 бал - відповіді на питання при здачі
- 1 бал - виконання додаткового практичного завдання при здачі