Loading [MathJax]/extensions/tex2jax.js

Обработка данных в формате CSV

В этом задании все решения пишутся на языке Python. Вам необходмио научиться работать с файлами (хотя можно использовать и стандартный ввод-вывод), разобраться со множествами и словарями.

В каждой задаче вы можете читать данные либо из файла data.csv, либо со стандартного ввода. Программа должна вывести результат либо в файл output.txt, либо на стандартный вывод.

Вам предлагаются для обработки различные данные в формате CSV. Данные представляют собой текстовый файл, каждая строка которых содержит некоторое количество данных, разделённых одинаковым символом. Аббревиатура CSV обозначает Comma-Separated Values, однако в качестве разделителя будет использоваться другой символ.

CSV-данные на сайте data.mos.ru записаны в кодировке Windows-1251, но в тестирующей системе этот же файл будет сконвертирован в кодировку UTF-8.

При этом при открытии файла программой в Python на вашем компьютере может понадобится указание кодировки. Для этого в функцию open нужно передать параметр encoding. Возможные значения: encoding="cp1251" или encoding="utf8". При сдаче задачи в тестирующую систему этот параметр нужно убрать или указать utf8.

Кроме того, если вы используете в программе текстовые строки, записанные на русском языке, то сам файл с программой должен быть сохранён в кодировке UTF-8 (по умолчанию Wing IDE может сохранять файлы в кодировке CP-1251). Для этого в первой строке файла программы на языке Python следует установить кодировку самого файла с программой:

# -*- coding: utf-8 -*-

A: Ejudge: количество решённых задач

Изучите файл с экспортом сданных решений в ejudge школьного учебного контеста. Для каждого участника определите количество сданных им задач. Задача считается сданной, если в поле Status записано значение OK. Обратите внимание, что участник может сдать одну задачу несколько раз, тогда эта задача считается только один раз. Задачи нужно идентифицировать по полю Prob.

Выведите список учащихся (поле User_Name), упорядоченный по алфавиту, после имя участника через двоеточие и пробел выведите количество решённых им задач. Необходимо вывести имена всех пользователей, которые встречаются в данном файле, в том числе тех, которые не решили ни одной задачи.

Пример результата работы программы (первые пять строк) для данного файла:

9Б Гречуха Максим: 8
9Б Губинская Вероника: 7
9Б Леонова Вероника: 7
9Б Мустафаев Руслан: 8
9Б Некрасов Алексей: 8

B: Ejudge: статистика по языкам программирования

Изучите файл с экспортом сданных решений в ejudge, контест проводится в формате личной олимпиады. Интересные для вас поля в этом файле:
User_Id — уникальный числовой идентификатор пользователя.
User_Login — уникальный логин пользователя (также можно использовать, как уникальный числовой идентификатор).
User_Inv — у скрытого пользователя в этом поле записан символ "I".
Lang — идентификатор языка программирования.
Score — Количество баллов, полученных за задачу.

Посчитайте общее число участников контеста, а также то, сколько участников использовало тот или иной язык программирования. Будем считать, что участник использует язык программирования, если он сдал хотя бы одно решение, набравшее больше 0 баллов. Скрытых пользователей учитывать не нужно.

Выведите общее число пользователей (Total) в первой строке, считаются только участники, сдавшие хотя бы одну задачу на ненулевой балл.

В последующий строках выведите все использованные языки программирования, после слова Total или названия языка программирования через двоеточие и пробел выведите число участников. Список упорядочите по убыванию числа участников, использующих данный язык программирования, при равных значениях — в лексикографическом порядка названия языка программирования.

Пример результата работы программы для данного файла:

Total: 19
python3: 19
g++: 5

C: Ejudge: результаты личной олимпиады

Вам понадобятся также следующие поля:
User_Name — имя пользователя в таблице результатов
Prob — идентификатор задачи (произвольная строка).

По каждой задаче пользователь получает балл, равный максимальному числу баллов из всех сабмитов по этой задаче. Сумма баллов, набранных участником, равна сумме баллов за все задачи.

Для каждого участника посчитайте сумму баллов, которые он набрал по всем задачам. Упорядочите участников по убыванию суммы баллов, при равной сумме баллов — в лексикографическом порядке поля User_Name. Выведите упорядоченный список: сначала имя пользователя, потом через двоеточие и пробел — его баллы.

Решения, имеющие статус Compilation error имеют значение поля Score равное -1, эти решения учитывать не нужно (их балл равен 0).

Eсли все решения участника набрали 0 баллов, то участник тоже участвовал в олимпиаде и его результат тоже нужно выводить.

Имена участников могут совпадать (привет Александрам Некрасовым), идентифицировать участников нужно по логину или id, но выводить нужно имена.

Пример результата работы программы для данного файла:

[9В] Порфирьев Антон: 400
[7Б] Сергиенко Дмитрий: 366
[9В] Павлек Николай: 363
[9Д] Миронов Сергей: 362
[9В] Смирнягин Артем: 359
[7Б] Бурков Илья: 358
[9В] Овчинников Андрей: 356
[9В] Фирсов Федор: 351
[9В] Севастьянова Александра: 331
[7Б] Орехов Савва: 330
[9В] Калабай Михаил: 330
[9В] Кирьяков Сергей: 330
[9В] Осипов Григорий: 330
[9В] Бархварт Максим: 321
[8В] Болгов Михаил: 320
[9В] Ингман Глеб: 320
[9В] Сутый Дмитрий: 320
[9В] Рылин Илья: 318
[8В] Черных Владимир: 308

D: Ejudge: результаты командной олимпиады

Изучите файл с экспортом сданных решений в ejudge, контест проводится в формате командной олимпиады. Интересные для вас поля в этом файле:
Stat_Short — равен OK, если решение прошло все тесты.
Dur — время сдачи в секундах решения от начала тура. Также вместо поля Dur можно использовать поля Dur_Hour и Dur_Min, равных количеству прошедших с начала тура часов и минут.

По правилам командной олимпиады команды ранжируются по убьванию числа решённых задач. При равном числе решённых задач команды ранжируются по возрастанию штрафного времени. Штрафное время по задаче равно времени, в которой было сдано решение этой задачи на OK, измеряемое в минутах от начала тура, плюс 20 штрафных минут за каждую неудачную попытку сдать решение этой задачи. Например, если команда сделала 2 неудачные попытки по задаче, и после этого сдала решение на OK через 1 час 5 минут 30 секунд после начала тура, то команда получает \(65 + 2\times 20=105\) штрафных минут. Значение поля Dur у удачной попытки будет равно \(1\times 3600 + 5\times 60 + 30=3930\), Dur_Hour будет равно 1, Dur_Min будет равно 5.

Штрафные баллы не начисляются за задачи, которые в итоге не были сданы на OK, а также штрафные баллы не начисляются за решения, отправленные после того, как был получен OK по данной задаче. Также в Москве на школьных соревнованиях не учитываются решения, имеющие статус “Ошибка компиляции”, у них значение поля Stat_Short равно CE.

Выведите таблицу результатов командной олимпиады в формате название команды, затем через двоеточие и пробел — число решённых задач и, через пробел, штрафные баллы. Список должен быть упорядочен по убыванию числа решённых задач, затем по возрастанию штрафного балла, затем по названию команды.

Пример результата работы программы для данного файла:

42: Борис, (Гурциева B', Белова B', Воробьева B'): 9 785
28: Ядреный Хренодер (Смирнов B', Капленков C, Подопросветов C): 9 1023
39: Easy Win (Самбуров B', Оспенников B', Чахвадзе B'): 8 917
34: No money — no honey (Неверова C, Олемская C, Федорова C): 7 496
35: #Альтернатива# (Копаева C, Плюшкин C, Мустафин C): 7 669
26: Новогодний дуб (Винокуров C', Гусев C', Соколов C'): 7 726
31: ОАО «Мозгострах» (Карбушев B', Привалихин B', Труфанов B'): 7 838
36: Нет идей (Фадеева C', Серикова C', Власова C'): 7 857
38: nyan pony (Сидоров B', Зверева B', Николаев B'): 7 863
41: Дружба — это магия (Сахабиев C', Хайруллин C', Поляков C'): 7 1004
30: Трое на кухне (Воронцова B', Савон B', Иглина B'): 6 375
44: Лама (Жуковская C, Цаплин B', Русина C): 6 464
27: 12348 (Начкин C', Алехина C', Якунчева C'): 6 555
37: Чапельник (Чистопольская C, Минеева B', Дженжер C): 6 573
33: Cone Forest (Алфёров C, Шалимова С, Казаков C): 6 587
32: Тётки (с) (Романова C', Ерохина C', Ерохина C'): 6 815
29: python++ (Кириллов C, Амиров C, Аникушин C): 6 1025
43: Двое против всех (Морозов C', Анопренко C'): 5 190
40: PENTAGRAM (Янцевич C, Соломатин C, Амиров C): 4 444

E: Городской Wi-Fi

В следующих задачах мы будем изучать интересные сведения, которые можно скачать с сайта data.mos.ru.

Изучите данные о городском Wi-Fi. Для скачивания набора данных используйте кнопку «Экспорт».

Обратите внимание, что все значения полей в этом файле заключены в кавычки, а также, что в файле две строки с заголовками столбцов.

Также изучите архивные наборы данных от 19.02.2023, от 08.12.2021.

Отличия архивных наборов данных от современных.

  1. Архивные наборы данных записаны в кодировке Windows-1251, но в тестирующей системе эти файлы будут сконвертированы в кодировку UTF-8. Вы можете скачать архивные файлы с данными и сконвертировать их из кодировки Windows-1251 в кодировку UTF-8 перед запуском, либо осуществлять перекодировку средствами языка Python при открытии файла, в этом случае в функцию open нужно передать параметр encoding="cp1251". При сдаче задачи в тестирующую систему этот параметр нужно убрать.
  2. Наборы данных в разные года могут содержать разное число столбцов, однако, нужные для выполнения задания столбцы всегда присутствуют. Для определения, в каких столбцах хранятся данные, используйте английские заголовки из первой строки.
  3. В современной версии этого файла вторая строка строка содержит русские названия столбцов, в старых версиях файла эта строка может отутствовать. Решение должно учитывать это (считав строку проверьте, что она содержит данные).

Ваше приложение должно работать и с актуальной версией данных, и с архивными версиями (после перекодировки в UTF-8), с учётом этих особенностей.

Посчитайте для каждого района Москвы количество точек доступа в этом районе. Упорядочите список по убыванию количества точек доступа, при равном значении — в лексикографическом порядке названия района. Выведите полученный список, отделяя название района от числа точек доступа двоеточием и пробелом.

Начальная часть ответа для набора данных от 24.01.2024 (версия 1.34) выглядит так:

Пресненский район: 505
Тверской район: 494
район Хамовники: 432
Басманный район: 351
район Замоскворечье: 348

F: Предметы московской олимпиады

В этой задаче нужно обработать набор данных “Победители олимпиад” из раздела “Образование”,

Определите, по каким предметам проводится московская олимпиада. Для каждого предмета выведите его название, и сколько лет проводилась олимпиада по этому предмету (на основании имеющихся данных).

Выведите список предметов в алфавитном порядке, затем через двоеточие и пробел — количество лет проведения.

Начало списка для последнего набора данных (версия 3.9 от 20.09.2023) выглядит так:

Астрономия: 10
Биология: 10
Бюджетная грамотность: 1
Генетика: 2
География: 10

G: Призёры регионального этапа всероссийской олимпиады

В этой задаче нужно обработать набор данных “Победители олимпиад” из раздела “Образование”,

Помимо актуальной версии данных, вы можете скачать архивные данные от 25.01.2023, от 02.02.2022, от 01.02.2021, от 03.02.2020, от 11.02.2019. Обратите внимание на все особенности архивных наборов данных.

Вам необходимо посчитать для каждой московской школы количество победителей и призёров регионального этапа всероссийской олимпиады школьников в последнем учебном году (региональный этап — это третий этап всероссийской олимпиады). Последний учебный год — это максимальный год, по которому предоставлены данные в данном наборе.

Необходимо вывести список всех школы Москвы в формате: краткое название школы (поле «ShortName»), затем через двоеточие и пробел количество победителей регионального этапа из этой школы, количество призёров регионального этапа, через пробел.

Список упорядочен по убыванию суммарного числа победителей и призёров, затем по убывания числа победителей, затем по возрастанию названия школы (в лексикографическом порядке).

Начало списка для последнего набора данных (версия 3.9 от 20.09.2023) выглядит так:

АНО ОШ ЦПМ: 228 660
ГБОУ «Лицей «Вторая школа» имени В.Ф. Овчинникова»: 72 255
лицей НИУ ВШЭ: 37 238
ГБОУ школа № 57: 55 215
ГБОУ школа № 179: 38 220

H: Лучшие школы по предметам и годам

Будем рассматривать результаты заключительного (четвёртого) этапа всероссийской олимпиады школьников. Составьте список предметов, и для каждого года, в который проводилась олимпиада по этому предмету, и определите лучшую школу Москвы по этому предмету в этот год. Лучшая школа определяется по следующим критериями:

  1. Наибольшее количество победителей и призёров заключительного этапа по этому предмету.
  2. При равном количестве победителей и призёров лучшей считается та школа, у которой больше победителей.
  3. Если у лучших школ по предмету равное число и победителей, и призёров, то лучшими считаются все такие школы и они выводятся в лексикографическчом порядке краткого названия школы (поле «ShortName»).

Формат вывода результата следующий. Предметы олимпиады должны быть упорядочены в лексикографическом порядке. Для каждого предмета выводится блок из несколько строк. Сначала выводится название предмета в отдельной строке. Следующие строки содержат лучшие школы по годам. Строки упорядочены по году, если в какой-то год есть несколько лучших школ, они упорядочены по краткому названию школы. В каждой строке выводится учебный год проведения олимпиады (как он записан в файле с данными), затем, через пробел, название школы, затем, через двоеточие и пробел, количество победителей и призёров заключительного этапа из этой школы по этому предмету в этом году, затем, через пробел, количество победителей. В конце блока выводится пустая строка.

Также вам понадобится проявить творческий подход к анализу данных. Дело в том, что в этом файле с данными названия предметов, по которым проводится олимпиада, могут меняться. Даже в один и тот же год предмет может записываться по-разному. И эти названия могут не соответствовать порядку проведения всероссийской олимпиады школьников.

Поэтому вам надо разобраться с названиями предметов, посчитать статистику с учётом разных названий, и вывести названия именно так, как они указаны в пункте 4 порядка проведения всероссийской олимпиады школьников. При этом названия предметов будут записываться с заглавной буквы, например, "Математика", а названия олимпиады по иностранным языкам записываются в виде "Иностранный язык (английский язык)".Всего у вас должно получиться 24 предмета.

Начало списка для последнего набора данных (версия 3.9 от 20.09.2023) выглядит так:

Астрономия
2012/2013 ГБОУ лицей «Вторая школа»: 1 1
2013/2014 ГАОУ ВО МИОО. СОШ № 179: 2 1
2014/2015 ГАОУ ВО МИОО. СОШ № 179: 3 3
2015/2016 ГАОУ ВО МИОО. СОШ № 179: 5 2
2016/2017 ГАОУ ВПО МИОО. СОШ № 179: 5 2
2017/2018 ГБОУ школа № 179: 9 2
2018/2019 ГБОУ «Лицей «Вторая школа»: 3 2
2019/2020 ГБОУ «Лицей «Вторая школа»: 2 0
2019/2020 ГБПОУ «Воробьевы горы»: 2 0
2020/2021 АНО ОШ ЦПМ: 11 2
2021/2022 АНО ОШ ЦПМ: 7 3
2022/2023 АНО ОШ ЦПМ: 15 4

Биология
2012/2013 ГБОУ школа-интернат «Интеллектуал»: 5 1
2013/2014 ФГБОУ ВПО «МГУ им. М.В. Ломоносова» . СУНЦ МГУ: 5 0
2014/2015 ФГБОУ ВПО «МГУ им. М.В. Ломоносова» . СУНЦ МГУ: 9 4
2015/2016 ФГБОУ ВПО «МГУ им. М.В. Ломоносова» . СУНЦ МГУ: 13 5
2016/2017 СУНЦ МГУ: 13 1
2017/2018 Московский государственный университет имени М.В. Ломоносова, МГУ имени М.В. Ломоносова, Московский университет или МГУ: 13 2
2018/2019 СУНЦ МГУ: 10 2
2019/2020 ФГБОУ ВПО «МГУ им. М.В. Ломоносова» . СУНЦ МГУ: 6 0
2020/2021 СУНЦ МГУ: 15 3
2021/2022 АНО ОШ ЦПМ: 24 5
2022/2023 АНО ОШ ЦПМ: 30 6

I: Мужские имена

Изучите набор данных “Сведения о наиболее популярных мужских именах среди новорожденных” из раздела “справочная информация”. Скачайте архивы с данными от 20.03.2023, от 16.02.2021.

В этом файле собрана статистика с января 2015 года, для каждого месяца приведено 100 наиболее популярных мужских имён.

Этот файл плохо пригоден для обработки, поэтому задача будет решаться в несколько шагов. Прежде всего обратите внимание, что в файле от 2023 года присустствует две строки с заголовками: английскими и русскими. В файле от 2021 года только английские заголовки, но при этом в самом файле строка с заголовками полей повторяется несколько раз. Также обратите внимание, что в файле 2023 года больше столбцов, но все дополнительные столбцы — пустые. Ваше приложение должно уметь работать с разными версиями наборов данных.

Для каждого имени посчитайте суммарное число новорождённых по этим данным. Упорядочите список имен по убыванию числа детей, а при равных значениях — по имени в лексикографическом порядке.

Выведите полученный список в формате: имя, через двоеточие и пробел — количество детей.

Начало списка для последнего набора данных (версия 2.116 от 06.02.2024) выглядит так:

Александр: 25847
Михаил: 23421
Максим: 22265
Артём: 19170
Иван: 18038

J: Мужские имена — убрать дубликаты

Обратите внимание на то, что некоторые записи содержат такое “имя”, как “Даниил, Данила, Данил”. То есть в некоторых случаях эти имена считаются раздельно, а в некоторых — вместе, и в этом случае невозможно установить статистику по каждому из этих имён. Давайте считать, что все три варианта имени “Даниил”, “Данила”, “Данил” являются одним и тем же именем “Даниил”, которое указано первым в списке.

Вам необходимо установить все случаи, когда в именах встречаются запятые. Если в имени встречается запятая, то это означает, что перечислены разные варианты одного и того же имени. Канонической формой считается форма, которая указана первой. Во всех данных необходимо осуществить замену всех вариантов имени на каноническую форму (в том числе тех вариантов, где имена перечислены через запятую). Необходимо осуществить замену дублирующихся имён на каноническую форму и посчитать статистику после этого.

Начало списка для последнего набора данных (версия 2.116 от 06.02.2024) выглядит так:

Александр: 25847
Михаил: 23421
Максим: 22265
Артём: 20729
Даниил: 18970

K: Мужские имена — среднее значение

Посчитайте для каждого имени среднее число раз, которое это имя даётся новорожденному в месяц.

При этом поскольку за каждый месяц дана статистика только по 100 именам, то по многим именам, которые не каждый месяц попадают в Top-100, есть данные не по всем месяцам. По таким именам нужно считать среднее, как суммарное число детей, делённое на количество месяцев, по котором есть статистика.

Обратите внимание, что в результате дублирования одной формы написания имени, может быть так, что в одном месяце одно и то же имя в разных формах повторяется несколько раз.

Результат деления округлите до целого числа вниз. Выведите полученный список в таком же формате, как в предыдущих задачах.

Окончание списка для последнего набора данных (версия 2.116 от 06.02.2024) выглядит так:

Прохор: 6
Рафаэль: 6
Стефан: 6
Феликс: 5
Омар: 3

L: Мужские имена — динамика по времени

Посчитайте, как меняется популярность имени со временем. Сравните среднемесячную частоту появления каждого имени в первом году, по которому есть данные, и в последнем году и посчитайте разницу — насколько изменилось среднемесячное число новорождённых с этим именем в последнем году по сравнению с первым годом.

Необходимо учитывать только те имена, которые встречались хотя бы раз в первом и последнем году. Среднемесячное число появлений имени считается, как в предыдущей задаче (среднее по месяцам, с учётом того, что данные по конкретному имени есть не по всем месяцам, деление с округлением вниз).

Выведите для каждого имени его среднемесячное число появлений в первом году, в последнем году, разницу этих величин. Упорядочите список по убыванию разницы, при равном значении — по имени.

Начало списка для последнего набора данных (версия 2.116 от 06.02.2024) выглядит так:

Мухаммад: 15 79 64
Лев: 80 123 43
Мирон: 36 72 36
Марк: 100 122 22
Адам: 15 34 19

N: Ближайшая точка доступа к школе

Найдите ближайшую к школе № 179 точку доступа городского Wi-Fi. Программа должна вывести в первой строке адрес этой точки доступа, во второй строке — расстояние до этой точки доступа в метрах.

Для данных на data.mos.ru программа может вывести следующий результат:

город Москва, Камергерский переулок, дом 4, строение 1
68.4

Возможно, что программа будет находить не эту точку доступа, а какую-то другую, но тоже близко расположенную (например, в Георгиевском переулке или на Большой Дмитровке). Также расстояние может незначительно отличаться.

O: Архив погодных данных

На сайте rp5.ru можно скачать данные с архивом погоды, например, на этой странице выберите вкладку “Скачать архив погоды”.

По указанным данным определите среднемесячную температуру для каждого месяца (январь, февраль, ..., декабрь). Под среднемесячной температурой подразумевается среднее арифметическое всех данных наблюдений, относящихся к данному месяцу. Вам может быть дан архив с данными произвольного места наблюдений за период произвольной длины, однако, гарантируется, что в наборе данных есть данные для каждого из 12 месяцев.

Программе на вход будет подан оригинальный набор данных с этого сайта, полученный при выборе настроек Формат: CSV (текстовый), Кодировка: UTF-8.

Выведите 12 чисел (по одному числу в строке) — среднюю температуру каждого месяца, округлённую до одного знака после запятой (используйте функцию round).

У данных, которые выгружаются с этого сайта, есть проблема, вы сможете обнаружить её уже на первом тесте в тестирующей системе. Вы можете скачать первый тестовый набор данных. Ответ для этого набора данных должен быть таким:

-6.0
-1.5
-1.2
6.9
13.9
20.5
22.0
19.2
9.5
6.0
1.7
-7.8

ZJ: Мужские имена - wat?!

Найдите странное имя, которое начинается со строчной буквы. Вероятно, это ошибка человека, который не умеет копировать данные между разными файлами и источниками данных, и вбивал информацию руками.

Исправьте эту ошибку, учтите это в программе, которая обрабатывает данные. Сделайте это с умом. Во всём остальном условие совпадает с условием задачи «Мужские имена — убрать дубликаты».

Эта задача будет засчитана только тому, кто сдаст её первым.