Пошаговое руководство по очистке данных для визуализации данных

Table of Contents
Introduction
1. Libraries
2. Data Scraping with BeautifulSoup
3. The Mapbox Token
4. Plotly.express
5. Other Datasets
6. Comparing to Plotly.graph_object
Conclusion

Вступление

В этой статье я покажу вам, как очистить последние данные из CSSEGISandData's COVID-19 репозиторий Github и создать пузырьковую карту с помощью Plotly и Mapbox.

Мы собираемся использовать JupyterLab (или Jupyter Notebook, если хотите), Plotly express, BeautifulSoup и Mapbox.

Раньше было сложно установить Plotly на JupyterLab, но теперь установить его легко. Вы можете найти это здесь".

Библиотеки

import requests
from bs4 import BeautifulSoup
import plotly.express as px
import pandas as pd

Мы используем HTTP-библиотеку Python requests для отправки get запроса на веб-страницу. BeautifulSoup - это библиотека Python для извлечения данных из файлов HTML и XML.

plotly.express - это высокоуровневая оболочка для Plotly. Он использует более простой синтаксис и прост в использовании. pandas - это быстрый, мощный, гибкий и простой в использовании инструмент для анализа и обработки данных с открытым исходным кодом.

Сбор данных с помощью BeautifulSoup

Приступим к написанию кода для соскабливающей части.

Устанавливаем переменные github и URL.

github = 'https://github.com'
URL = 'https://github.com/CSSEGISandData/COVID-19/tree/master/csse_covidplotly.expressdata/csse_covidplotly.expressdaily_reports_us'

Мы получаем веб-страницу с помощью request.get() и создаем объект Beautifulsoup, анализируя содержимое страницы.

page = requests.get(URL)
soup = BeautifulSoup(page.content, 'html.parser')

Изучив HTML-код страницы, вы можете обнаружить, что последний отчет всегда является четвертой ссылкой после последней. Если вам нужно это подтвердить, вы можете распечатать последнюю версию.

latest = str(soup.table.find_all('a')[-4]['href'])
# print(latest)

Выход:

/CSSEGISandData/COVID-19/blob/master/csse_covidplotly.expressdata/csse_covidplotly.expressdaily_reports_us/06-04-2020.csv

Мы создаем ссылку на последние данные и снова получаем содержимое веб-страницы с помощью requests.get(). Мы можем подтвердить последнийURL, распечатав его.

latestURL = github + latest
latestPage = requests.get(latestURL, 'html.parser')
print(latestURL)

Выход:

plotly.expressdata/csse_covidplotly.expressdaily_reports_us/06-20-2020.csv">https://github.com/CSSEGISandData/COVID-19/blob/master/csse_covidplotly.expressdata/csse_covidplotly.expressdaily_reports_us/06-04-2020.csv

На Github есть необработанная страница с идентификатором raw-url. Мы получаем URL-адрес необработанного URL-адреса страницы. Мы можем подтвердить это, напечатав rawURL.

soup = BeautifulSoup(latestPage.content, 'html.parser')
raw = str(soup.find(id='raw-url')['href'])
rawURL = github + raw
print(rawURL)

Выход:

plotly.expressdata/csse_covidplotly.expressdaily_reports_us/06-20-2020.csv">https://github.com/CSSEGISandData/COVID-19/raw/master/csse_covidplotly.expressdata/csse_covidplotly.expressdaily_reports_us/06-04-2020.csv

Теперь необработанная страница имеет формат CSV, и мы можем использовать Pandas для ее чтения. Мы можем подтвердить это, распечатав данные с помощью head().

df = pd.read_csv(rawURL)
print(df.head())

Мы отбрасываем строки (axis=0), в которых отсутствует значение Lat. Также заполняем поля 0, если данные отсутствуют.

df = df.dropna(axis=0, subset=['Lat'])
df = df.fillna(0)
print(df.head())

Мы берем дату и время из первой строки в третьем столбце. (Первый индекс равен 0)

date, time = df.iloc[0, 2].split()
print(date)
print(time)

Выход:

2020-06-04
04:33:37


Токен Mapbox

Зарегистрируйтесь на Mapbox. И создать токен.

В своем JupyterLab / Jupyter Notebook создайте файл .mapbox_token, скопируйте и вставьте созданный токен из Mapbox в этот файл.

px.set_mapbox_access_token(open(".mapbox_token").read())

Мы устанавливаем токен Mapbox с помощью Plotly express set_mapbox_access_token. Если вы используете Git, добавьте .mapbox_token в ваш .gitignore файл.

Plotly.express

Последняя часть кода - это установка plotly.express параметров и макета.

Следующий список содержит некоторые ключевые параметры для plotly.express.scatter_mapbox.

Мы используем color, size, color_continuous_scale, size_max, zoom, center, hover_data и hover_name. При желании вы можете установить другие параметры.

fig = px.scatter_mapbox(
    df, lat="Lat", lon="Long_",
    color="Deaths",
    size="Deaths",
    color_continuous_scale=px.colors.sequential.Jet,
    size_max=40,
    zoom=3, 
    center={"lat": 37.0902, "lon": -95.7129},              
    hover_data=["Confirmed"],
    hover_name='Province_State'
)

Мы можем установить заголовок в fig.update_layout. И fig.show() для отображения изображения.

fig.update_layout(
    title=f'COVID-19 Deaths in USA by states.  Date: {date}',
)
fig.show()

Весь код:

Другие наборы данных

Мы можем использовать это для других страниц CSSEGISandData, посвященных COVID-19. Например, используя ссылку на ежедневный отчет по всему миру:

URL = 'https://github.com/CSSEGISandData/COVID-19/tree/master/csse_covidplotly.expressdata/csse_covidplotly.expressdaily_reports'

По сравнению с Plotly.graph_object

Следующее изображение в формате gif создано с использованием Plotly.graph_object. Вы видите разницу? У него нет названий штатов, ландшафта, рек и деталей, как у Mapbox. Вы можете найти код здесь.

Заключение

Теперь вы знаете, как создать пузырьковую карту с помощью Plotly.express. Библиотека Mapbox была использована, потому что она дает вам лучшее представление и вы можете управлять картой с различными параметрами. Как насчет использования пузырьковой карты для вашего проекта Data Science.

Новостная рассылка

Получите полный доступ ко всем статьям на Medium, став участником.

Ресурсы

Связанные истории