Программирование

Автор задания: И. В. Щуров.

Данный notebook является набором задач по курсу «Программирование» (Магистерская программа «Журналистика данных», НИУ ВШЭ, 2018-19).

На странице курса находятся другие материалы.

Домашнее задание №10

Максимум за ДЗ можно набрать 8 баллов.

Чтобы сдать ДЗ, его надо загрузить в nbgr-x в виде ipynb-файла. Получить ipynb-файл можно, выбрав в Jupyter пункт меню File → Download as... → IPython Notebook (.ipynb).

Задача 1 (2 балла)

С помощью API World Bank, напишите функцию get_capital(country_code), принимающую на вход ISO 3166-1-код государства (например, "rus") и возвращающую название его столицы (в том виде, в котором оно возвращается этим API). Если вы хотите, чтобы API использовало формат JSON, укажите словарь {'format': 'json'} в качестве второго аргумента requests.get. (Вы можете использовать как JSON, так и XML-интерфейс, на ваш выбор.)

Подсказка. Обратите внимание: код страны здесь надо передавать как часть URL до знака вопроса.

Подсказка. Если вы будете использовать XML-API, вам нужно указать кодировку utf-8-sig. Это можно сделать, устанавливая атрибут encoding у объекта, возвращаемого requests.get, то есть где-то в программе должно быть написано что-то вроде:

r = requests.get(…)
r.encoding = 'utf-8-sig'

Если этого не сделать, задача не заработает на проверяющем сервере и не будет засчитана.

In [ ]:
# YOUR CODE HERE
In [ ]:
assert get_capital("rus") == 'Moscow'
assert get_capital("usa") == 'Washington D.C.'
assert get_capital('bra') == 'Brasilia'
assert get_capital('it') == 'Rome'

Задача 2 (2 балла)

Написать функцию diff_lat(place1, place2), которая бы с помощью геокодера Яндекса находила координаты двух объектов, заданных строками place1 и place2, и возвращала бы число с плавающее точкой, являющееся ответом на вопрос: на сколько градусов place2 севернее, по сравнению с place1?

In [ ]:
# YOUR CODE HERE
In [ ]:
assert abs(diff_lat("Москва", "Апатиты") - 11.81) < 0.1
assert abs(diff_lat("Шаболовка, 26", "Кочновский, 3")-0.086) < 0.001
assert abs(diff_lat("Краснодар", "Петропавловск-Камчатский") - 8) < 0.1
assert abs(diff_lat("Геленджик", "Саратов") - 7) < 0.1
assert abs(diff_lat("Саратов", "Геленджик") + 7) < 0.1

Задача 3 (2 балла)

Задачу придумал А. Зотов.

Напишите функцию check_email(email), которая принимает на вход адрес электронной почты и с помощью University Domains and Names API определяет, к какому университету и какой стране относится адрес. Программа должна вернуть строку формата Affiliated with %University Name% in %Country%, если адрес относится к какому-то университету, и Not a university email иначе. К примеру, для запроса check_email([email protected]) программа должна вернуть строку Affiliated with New Economic School in Russian Federation.

Подсказка: Вам не нужно скачивать весь двухмегабайтный json-файл с сервера. Поиск http://universities.hipolabs.com/search поддерживает запросы типа domain=hse.ru, вам нужно использовать именно его. В e-mail адресе доменное имя — это то, что идёт после символа @.

In [ ]:
# YOUR CODE HERE
In [ ]:
assert check_email('[email protected]') == 'Affiliated with New Economic School in Russian Federation'
assert check_email('[email protected]') == 'Affiliated with Higher School of Economics in Russian Federation'
assert check_email('[email protected]') == 'Not a university email'
assert check_email('[email protected]') == 'Not a university email'
assert check_email('[email protected]') == 'Affiliated with Stanford University in United States'
assert check_email('[email protected]') == 'Affiliated with Charles University Prague in Czech Republic'

Задача 4 (2 балла)

На сайте http://dronestre.am собираются данные об ударах дронов США. У него есть простое API, позволяющее получить информацию о всех ударах в виде JSON-файла. Адрес для API: http://api.dronestre.am/data Написать функцию strikes_per_country(year), принимающую на вход год в виде целого числа (например, 2015) и возвращающую словарь, ключами которого являются страны, а значениями — число ударов в этой стране.

Подсказка 1. API не принимает параметр year (и вообще никаких параметров не принимает). Вам придётся скачать все данные и вытащить из них только те записи, которые вам нужны. Дата в данных указана в виде строки в стандартном формате. Можно проверить, что строка начинается с некоторого префикса с помощью .startswith. Например, "Hello".startswith("He") возвращает True.

Подсказка 2. Попробуйте использовать collections.Counter (импортируется с помощью from collections import Counter). Почитайте в документации, что он делает.

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

# (make request)
# json_data = (some lines to get data)
def strikes_per_country(year):
    # query json_data for data you need
In [ ]:
# YOUR CODE HERE
In [ ]:
assert strikes_per_country(2002) == {'Yemen': 1}
assert strikes_per_country(2009) == {'Pakistan': 56}
assert strikes_per_country(2016) == {'Pakistan': 3, 'Somalia': 5, 'Yemen': 23}

Задача 5 (3 балла)

С помощью API Google Books можно получать информацию о различных книгах. Например, вот так можно получить данные по книге по её ISBN: https://www.googleapis.com/books/v1/volumes?q=isbn:9785699648146. Напишите функцию book_table(isbns), принимающую на вход список ISBN'ов и возвращающую список списков; каждый элемент списка должен содержать четыре элемента (в указанном порядке): заглавие, автор(ы), язык и число страниц (в виде целого числа). Если авторов несколько, они должны быть разделены запятой и пробелом. Пример см. в тесте.

In [ ]:
# YOUR CODE HERE
In [ ]:
obtained = book_table(['9781292153964', '9780262035613', '9785457499850'])
expected = [['Artificial Intelligence', 'Stuart Russell, Peter Norvig', 'en', 1152],
 ['Deep Learning', 'Ian Goodfellow, Yoshua Bengio, Aaron Courville',
  'en',
  800],
 ['Вино из одуванчиков', 'Рэй Брэдбери', 'ru', 499]]
assert obtained == expected

Задача 6 (4 балла)

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

Подсказка. Здесь проще всего использовать robobrowser.

In [ ]:
# YOUR CODE HERE
In [ ]:
assert get_languages_hse("Щуров") == ['английский']
assert get_languages_hse("Дагаев") == ['английский', 'французский']
assert get_languages_hse("Тамбовцева") == ['английский', 'испанский', 
                                           'французский']
assert get_languages_hse("Буров") == ['английский', 'французский']