Главная страница
Навигация по странице:

  • Рис. 16.9.

  • УПРАЖНЕНИЯ 16.6. Рефакторинг

  • 16.7. Автоматизированный заголовок

  • 16.8. Недавние землетрясения

  • Мэтиз. Изучаем Python. Crash course2 n d e d i t i o na h a n d s o n, p r o j e c t b a s e d i n t r o d u c t i o n t o p r o g r a m m i n g


    Скачать 6.2 Mb.
    НазваниеCrash course2 n d e d i t i o na h a n d s o n, p r o j e c t b a s e d i n t r o d u c t i o n t o p r o g r a m m i n g
    Дата28.06.2022
    Размер6.2 Mb.
    Формат файлаpdf
    Имя файлаМэтиз. Изучаем Python.pdf
    ТипДокументы
    #618322
    страница40 из 52
    1   ...   36   37   38   39   40   41   42   43   ...   52
    367
    Программа импортирует тип диаграммы
    Scattergeo и класс
    Layout
    , а затем модуль offline для вывода карты . Как и при построении гистограммы, определяется список с именем data
    . Объект
    Scattergeo создается в списке , потому что в лю- бой построенной визуализации можно нанести более одного набора данных. Тип диаграммы
    Scattergeo позволяет наложить на карту диаграмму разброса геогра- фических данных. В простейшем варианте использования этого типа диаграммы достаточно передать список долгот и широт.
    Мы предоставляем заголовок диаграммы  и создаем словарь с именем fig
    , со- держащий данные и макет . Наконец, fig передается функции plot()
    с содержа- тельным именем файла для вывода данных.
    При выполнении этого файла должна открыться карта, примерный вид которой показан на рис. 16.7. Землетрясения обычно происходят поблизости от границ тектонических плит, что соответствует тому, что мы видим на диаграмме.
    Рис. 16.7. Простая карта с информацией о землетрясениях, произошедших за последние 24 часа
    В диаграмму можно внести множество изменений, которые сделают карту более информативной и удобочитаемой. Внесем некоторые из этих изменений.
    Другой способ определения данных для диаграммы
    Прежде чем переходить к настройке диаграммы, рассмотрим другой способ опре- деления данных для диаграмм Plotly. Для текущей диаграммы список данных определяется в одной строке:
    data = [Scattergeo(lon=lons, lat=lats)]

    368 Глава 16 • Загрузка данных
    Это один из простейших способов определения данных диаграмм в Plotly. Тем не менее это не идеальный вариант настройки визуализации. Эквивалентный способ определения данных для текущей диаграммы выглядит так:
    data = [{
    'type': 'scattergeo',
    'lon': lons,
    'lat': lats,
    }]
    В этом варианте вся информация о данных структурируется в форме пар «ключ- значение» в словаре. Включив этот код в eq_plot .py
    , вы увидите ту же диаграмму, которая была сгенерирована ранее. С этим форматом настройки задаются проще, чем с предыдущим форматом.
    Настройка размера маркера
    Разбираясь с тем, как улучшить оформление карты, следует сосредоточиться на тех аспектах карты, которые вы бы хотели передать более четко. На текущей карте показано местоположение каждого землетрясения, но она не передает силу каждого землетрясения. Пользователь должен сразу видеть, где в мире происходят самые разрушительные землетрясения.
    Для этого мы будем изменять размер маркеров в зависимости от магнитуды каж- дого землетрясения.
    eq_world_map.py
    import json
    # Нанесение данных на карту.
    data = [{
    'type': 'scattergeo',
    'lon': lons,
    'lat': lats,

    'marker': {

    'size': [5*mag for mag in mags],
    },
    }]
    my_layout = Layout(title='Global Earthquakes')
    Plotly предоставляет широкие возможности настройки рядов данных, каждый элемент которых может быть представлен в форме «ключ-значение». В данном случае мы используем ключ 'marker'
    для определения величины каждого маркера на карте . Мы используем вложенный словарь как значение, связанное с 'marker'
    , потому что вы можете задать ряд настроек для всех маркеров ряда.
    Мы хотим, чтобы размер маркера соответствовал магнитуде каждого землетрясе- ния. Но если передать только список mags
    , то маркеры получатся слишком мелкими

    Построение карт с глобальными наборами данных: формат JSON 369
    и вам будет трудно разглядеть различия в размерах. Чтобы получить подходящий размер маркера, необходимо умножить магнитуду на масштабный коэффициент.
    Для моего экрана хорошо подходит значение 5; возможно, для вашей карты лучше подойдет чуть большее или меньшее значение. Мы используем генератор списка, который сгенерирует правильный размер маркера для каждого значения в списке mags
    .
    Примерный вид карты, которая будет построена при выполнении этого кода, по- казан на рис. 16.8. Карта выглядит значительно лучше, но это еще не все.
    Рис. 16.8. На карте обозначены магнитуды всех землетрясений
    Настройка цвета маркеров
    Также можно изменить цвет каждого маркера, чтобы обозначить разрушительную силу каждого землетрясения. Для этого мы воспользуемся цветовыми шкалами
    Plotty. Прежде чем вносить изменения, скопируйте файл eq_data_30_day_m1 .json в каталог data
    . Этот файл содержит данные землетрясений за 30-дневный период, и с расширенным набором данных карта будет выглядеть намного интереснее.
    Пример использования цветовой шкалы для представления магнитуды каждого землетрясения:
    eq_world_map.py

    filename = 'data/eq_data_30_day_m1.json'
    # Нанесение данных на карту.
    data = [{
    'marker': {

    370 Глава 16 • Загрузка данных 'size': [5*mag for mag in mags],

    'color': mags,

    'colorscale': 'Viridis',

    'reversescale': True,

    'colorbar': {'title': 'Magnitude'},
    },
    }]
    Не забудьте обновить имя файла, чтобы использовать 30-дневный набор данных .
    Все значимые изменения происходят в словаре 'marker'
    , потому что мы изменяем только внешний вид маркеров. Настройка 'color'
    сообщает Plotly, какое значе- ние должно использоваться для определения местоположения каждого маркера на цветовой шкале . Для определения цвета будет использоваться список mags
    Настройка 'colorscale'
    указывает Plotly, какой диапазон цветов должен исполь- зоваться: цветовая шкала 'Viridis'
    лежит в диапазоне от темно-синего до светло- желтого и хорошо подходит для набора данных . Мы присваиваем 'reversescale'
    значение
    True
    , потому что светло-желтый цвет должен использоваться для самых слабых, а темно-синий — для самых разрушительных землетрясений . Настройка 'colorbar'
    управляет внешним видом цветной полосы, которая выводится сбоку от карты. Здесь цветовой шкале присваивается заголовок 'Magnitude'
    , чтобы было сразу ясно, что представляют разные цвета .
    Если запустить программу в этой версии, карта будет выглядеть намного сим- патичнее. На рис. 16.9 цветовая шкала обозначает разрушительность отдельных землетрясений. При большом количестве точек данных становится ясно видно, где проходят границы тектонических плит!
    Рис. 16.9. Цвета и размеры маркеров представляют магнитуду землетрясений

    Построение карт с глобальными наборами данных: формат JSON 371
    Другие цветовые шкалы
    Также для оформления диаграммы возможно выбрать другую цветовую шкалу.
    Чтобы просмотреть доступные варианты цветовых шкал, сохраните следующую короткую программу под именем show_color_scales .py
    :
    show_color_scales.py
    from plotly import colors for key in colors.PLOTLY_SCALES.keys():
    print(key)
    Plotly хранит цветовые шкалы в модели colors
    . Цветовые шкалы определяются в словаре
    PLOTLY_SCALES
    , а имена цветовых шкал служат ключами в словаре. Ре- зультат выполнения с перечнем доступных цветовых шкал:
    Greys
    YlGnBu
    Greens
    Viridis
    Поэкспериментируйте с этими цветовыми шкалами; помните, что любую шкалу можно «перевернуть» при помощи настройки reversescale
    ПРИМЕЧАНИЕ Выведите содержимое словаря PLOTLY_SCALES, и вы увидите, как определены цветовые шкалы . У каждой шкалы имеется начальный и конечный цвет, а некоторые шкалы также определяют один или несколько промежуточных цветов .
    Plotly интерполирует оттенки между этими цветами .
    Добавление подсказки
    Чтобы закончить построение карты, мы добавим подсказку, которая будет появ- ляться при наведении указателя мыши на маркер, представляющий землетрясение.
    Кроме значений долготы и широты, которые должны выводиться по умолчанию, мы выведем магнитуду и описание приблизительного местоположения. Для этого нужно извлечь из файла еще немного данных, а также добавить их в словарь в data
    :
    eq_world_map.py

    mags, lons, lats, hover_texts = [], [], [], []
    for eq_dict in all_eq_dicts:
    lat = eq_dict['geometry']['coordinates'][1]

    title = eq_dict['properties']['title']
    mags.append(mag)
    lons.append(lon)
    lats.append(lat)
    hover_texts.append(title)

    372 Глава 16 • Загрузка данных
    # Нанесение данных на карту.
    data = [{
    'type': 'scattergeo',
    'lon': lons,
    'lat': lats,

    'text': hover_texts,
    'marker': {
    },
    }]
    Сначала мы создаем список с именем hover_texts для хранения меток, которые будут использоваться для разных маркеров . Секция title данных землетрясений содержит текстовое описание магнитуды и местоположения каждого землетрясе- ния в дополнение к его долготе и широте. В точке  мы извлекаем эту информа- цию, присваиваем ее переменной title
    , а затем присоединяем к списку hover_texts
    Если объект data содержит ключ 'text'
    , Plotly выводит это значение в подсказке маркера, когда пользователь задерживает над ним указатель мыши. Когда вы пере- даете список, соответствующий количеству маркеров, Plotly извлекает отдельную метку для каждого генерируемого маркера . Запустите программу; при наведении указателя мыши на любой маркер должна появиться подсказка с описанием того, где произошло землетрясение, и его точной магнитудой.
    Впечатляет! Приблизительно в 40 строках кода мы создали привлекательную и содержательную карту глобальной сейсмической активности, которая к тому же демонстрирует геологическую структуру планеты. Plotly предоставляет много- численные средства настройки оформления и поведения ваших визуализаций.
    С их помощью вы сможете строить диаграммы и карты, содержащие именно ту информацию, которая вам нужна.
    УПРАЖНЕНИЯ
    16.6. Рефакторинг: в цикле, извлекающем данные из all_eq_dicts
    , используются пере- менные для сохранения магнитуды, долготы, широты и заголовка каждого землетрясения перед присоединением этих значений к соответствующим спискам. Такой подход был вы- бран для того, чтобы процесс извлечения данных из файла JSON был более понятным, но в вашем коде он необязателен. Вместо использования временных переменных извлеките каждое значение из eq_dict и присоедините его к соответствующему списку в одной стро- ке. В результате тело цикла сократится до четырех строк.
    16.7. Автоматизированный заголовок: в этом разделе заголовок задавался вручную при определении my_layout
    ; это означает, что вы должны обновлять заголовок при каждом из- менении исходного файла. Вместо этого можно воспользоваться заголовком набора дан- ных из метаданных файла JSON. Извлеките это значение, присвойте его переменной и ис- пользуйте для заголовка карты при определении my_layout
    16.8. Недавние землетрясения: в интернете доступны файлы данных с информацией о по- следних землетрясениях за одночасовой, однодневный и 30-дневный период. Откройте

    Итоги 373
    страницу https://earthquake .usgs .gov/earthquakes/feed/v1 .0/geojson .php и найдите список ссы- лок на наборы данных за разные периоды времени. Загрузите один из этих наборов данных и создайте визуализацию последней сейсмической активности.
    16.9. Пожары: в ресурсах этой главы присутствует файл world_fires_1_day .csv
    . Он содержит информацию о пожарах по всему миру, включая долготу, широту и площадь каждого по- жара. Используя процедуру обработки данных из первой части этой главы и картографи- ческие средства из этого раздела, постройте карту с информацией о том, какие части мира страдают от пожаров.
    Обновленные версии этих данных можно загрузить по адресу https://earthdata .nasa .gov/
    earth-observation-data/near-real-time/irms/active-fire-data/
    . Ссылки на данные в формате CSV на- ходятся в разделе TXT.
    Итоги
    В этой главе вы научились работать с реальными наборами данных. Вы узнали, как обрабатывать файлы CSV и JSON и как извлечь данные, на которых вы хотите со- средоточиться. Используя реальные погодные данные, вы освоили новые возмож- ности работы с библиотекой Matplotlib, включая использование модуля datetime и возможность нанесения нескольких наборов данных на одну диаграмму. Вы узнали, как нанести данные на карту мира с использованием Plotly и как изменить оформление карт и диаграмм Plotly.
    С накоплением опыта работы с файлами CSV и JSON вы сможете обрабатывать практически любые данные, которые вам потребуется проанализировать. Многие сетевые наборы данных могут загружаться хотя бы в одном из этих форматов. По- сле работы с этими форматами вам также будет проще усвоить другие форматы данных.
    В следующей главе вы напишете программы для автоматического сбора данных из сетевых источников, а затем создадите визуализации этих данных. Это занятие весьма интересное, если вы рассматриваете программирование как увлечение, и аб- солютно необходимое, если вы занимаетесь программированием профессионально.

    17
    Работа с API
    В этой главе вы научитесь писать специализированные программы для построения визуализаций на основании загруженных программами данных. Ваша программа будет использовать программный интерфейс (API) веб-приложения для автома- тического запроса конкретной информации с сайта (вместо целых страниц). Полу- ченная информация будет использоваться для построения визуализации. Так как программы, написанные по такой схеме, всегда используют самые свежие данные для построения визуализации, даже при быстро изменяющихся данных полученная диаграмма всегда будет оставаться актуальной.
    Использование API веб-приложений
    API веб-приложения представляет собой часть веб-сайта, предназначенную для взаимодействия с программами, которые используют особым образом построенные
    URL-адреса для запроса информации. Подобные запросы называются вызовами
    API. Запрашиваемые данные возвращаются в удобном формате (например, JSON или CSV). Многие приложения, зависящие от внешних источников данных (как приложения, интегрирующиеся с сайтами социальных сетей), используют вы- зовы API.
    Git и GitHub
    Наша визуализация будет построена на базе информации с GitHub — сайта, органи- зующего совместную работу программистов над проектами. Мы воспользуемся API
    GitHub для запроса информации о проектах Python и последующего построения интерактивной визуализации относительной популярности этих проектов в Plotly.
    Имя GitHub (
    https://github .com/
    ) происходит от Git — распределенной системы контроля версий, которая позволяет программистам совместно трудиться над про- ектами. Пользователи Git управляют своим индивидуальным вкладом в проект, чтобы изменения, вносимые одним человеком, не конфликтовали с изменениями, вносимыми другими людьми. Когда вы реализуете новую возможность в проекте,
    Git отслеживает изменения, внесенные в каждый файл. Если новый код успешно работает, вы закрепляете внесенные изменения, и Git записывает новое состояние

    Использование API веб-приложений 375
    проекта. Если же вы допустили ошибку и захотите отменить внесенные измене- ния, Git позволяет легко вернуться к любому из предыдущих рабочих состояний.
    (За дополнительной информацией об управлении версиями с использованием Git обращайтесь к приложению Г.) Проекты GitHub хранятся в репозиториях, содер- жащих все ресурсы, связанные с проектом: код, информацию о других участниках, все проблемы или отчеты об ошибках и т. д.
    Если проект нравится пользователям GitHub, то пользователи могут «поставить звезду», чтобы продемонстрировать свою поддержку и следить за проектами, которые могут им пригодиться. В этой главе мы напишем программу для авто- матической загрузки информации о проектах Python с наибольшим количеством звезд на GitHub, а затем построим содержательную визуализацию таких проектов.
    Запрос данных с использованием вызовов API
    GitHub поддерживает API (программный интерфейс) для запроса разнообразной информации посредством вызовов API. Чтобы понять, как выглядит вызов API, введите следующий адрес в адресной строке своего браузера и нажмите
    Enter
    :
    https://api.github.com/search/repositories?q=language:python&sort=stars
    Этот вызов возвращает количество проектов Python, размещенных на GitHub в на- стоящее время, а также информацию о самых популярных репозиториях Python.
    Рассмотрим вызов подробнее: первая часть https://api.github.com/
    передает за- прос части сайта GitHub, отвечающей на вызовы API. Следующая часть, search/
    repositories
    , приказывает API провести поиск по всем репозиториям в GitHub.
    Вопросительный знак после repositories означает, что мы собираемся передать аргумент. Символ q
    обозначает запрос (Query), а знак равенства начинает опре- деление запроса (
    q=
    ). Выражение language:python указывает, что запрашивается информация только по репозиториям, для которых основным языком указан
    Python. Завершающая часть,
    &sort=stars
    , сортирует проекты по количеству при- своенных им звезд.
    В следующем фрагменте приведены несколько начальных строк ответа.
    {

    "total_count": 3494012,

    "incomplete_results": false,

    "items": [
    {
    "id": 21289110,
    "node_id": "MDEwOlJlcG9zaXRvcnkyMTI4OTExMA==",
    "name": "awesome-python",
    "full_name": "vinta/awesome-python",
    Вероятно, по виду ответа вы уже поняли, что этот URL-адрес не предназначен для обычных пользователей, потому что ответ закодирован в формате, рассчитанном

    376 Глава 17 • Работа с API
    на машинную обработку. На момент написания книги на GitHub было найдено
    3 494 012 проектов Python . Значение "incomplete_results"
    равно false
    , а зна- чит, запрос был обработан успешно (информация не является неполной) . Если бы у GitHub возникли проблемы с полной обработкой запроса API, то в этом поле было бы возвращено значение true
    . Возвращаемые данные отображаются в списке "items"
    с информацией о самых популярных проектах Python на GitHub .
    Установка пакета requests
    Пакет
    Requests предоставляет удобные средства для запроса информации с сайтов из программ Python и анализа полученных ответов. Для установки requests ис- пользуется pip
    :
    $ python -m pip install --user requests
    Эта команда приказывает Python запустить модуль pip и включить пакет
    Requests в установку Python текущего пользователя. Если для запуска программ или уста- новки пакетов вы используете python3
    или другую команду, проследите за тем, чтобы здесь использовалась та же команда.
    1   ...   36   37   38   39   40   41   42   43   ...   52


    написать администратору сайта