Визуализация, Графики

ИНТЕРАКТИВНАЯ ВИЗУАЛИЗАЦИЯ ДАННЫХ РАСПРОСТРАНЕНИЯ COVID-19

Время прочтения: 4 мин.

Вирусологи изучают морфологию, физиологию, генетику а так же эволюцию вирусов, рассматривают способы диагностики, терапии и профилактики вирусных заболеваний. Изучают вирус под микроскопом. Какие инструменты необходимы Data Scientist’y для изучения вируса?

Data Scientist/Data Analytic работает с огромным объёмом данных, в которые необходимо «погрузиться». Одним из подходов изучения данных является построение графического представления.

В этой статье мы познакомимся с Python’овской библиотекой Plotly, которая позволяет быстро и эффективно строить графические представления данных. Эффективность заключается в интерактивности . Библиотека даёт возможность «прикоснуться» к данным и изучить их со всех «сторон».Plotly — это открытая библиотека, распространяемая по лицензии MIT, что позволяет использовать её в научной и коммерческой деятельности. Весь исходный код находится в репозитории GitHub

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

Данные, с которыми мы сегодня будем работать — статистика распространения короновируса (COVID-19). Датасет взят с репозитория Университета Джонса Хопкинса на GitHub. Университет Джонса Хопкинса — это частный исследовательский университет, основанный Джонсом Хопкинсом в городе Балтимор, штат Мэриленд, США. Мы будем работать с данными на 22.03.2020.

COVID-19 был выбран «на злобу дня», такого же результата можно было добиться на данных, например, о миграции китов, изменения курса валют или каких-либо других. Наша задача заключается в демонстрации возможностей библиотеки, её функциональности и удобстве. Давайте начнём!

Первое, что нам стоит сделать — импортировать библиотеки, с которыми мы будем работать:

import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
    

Давайте построим наш первый интерактивный график. Это будет гистограмма по топ 5 стран по количеству заразившихся.

 # сountrysTop5  - наш Pandas DataFrame c топ 5
    fig = px.histogram(allCountrysTop5, y="Confirmed",x="Country/Region",
        title='Гистограмма распространения вируса в разрезе топ 5 стран',histfunc='avg')
    fig.show()

Как вы можете заметить код максимально лаконичен, и думаю даже человек, который не занимается программированием легко прочитает этот код.

Вот наша гистограмма. И теперь Вы можете «потрогать» данные 🙂

P.S. В правом верхнем углу находится панель управления.

Следующим этапом будет линейный график. Вот пример кода.

 # countrys - Pandas DataFrame c данными о распространении и смертности
Deaths = px.line(countrys, x="Last Update", y="Deaths",color='Country/Region',title='Deaths in Countrys', hover_name="Country/Region")
Deaths.show()

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

   colors = ['red','black','blue','darkgreen','darkorange']
    fig = go.Figure()
    tabCountry = italy.loc[confirmedCountrys['Country/Region']==country]
    fig.add_trace(go.Scatter(x=italy['Last Update'], y=italy['Confirmed'],name=country+'_Confirmed'))
    fig.add_trace(go.Scatter(x=italy['Last Update'], y=italy['Deaths'],name=country+'_Deaths'))
    fig.add_trace(go.Scatter(x=italy['Last Update'], y=italy['Recovered'],name=country+'_Recovered'))
    maxy = max(italy['Confirmed'])
    num=1
    # status - словарь статусов 
    for st in status:
        col = colors[num-1]
        date = status[st][country]
        fig.add_shape(dict(type="line",
            x0=date,x1=date,
            y0=0,y1=maxy/num,line=dict(color=col)))
        fig.add_trace(go.Scatter(
            x=[date, date],name=st,
            y=[maxy/num, maxy/num],text=[' '+st]
            ,mode="text",textfont=dict(color=col),textposition='middle right'))
        num+=1    
    fig.update_layout(title_text='Confirmed,Deaths and Recovered in Italy')
    fig.show()
        

На данные можно посмотреть совсем под иным углом…а точнее под всеми углами. Plotly позволяет создавать 3D графики. И вот один пример такого графика:

  # countrys43D - Pandas DataFrame c данными о заражении
            # population - стобец с информацие о зараженных в процентном соотношении с общим населением страны
            fig = go.Figure(go.Mesh3d(x=countrys43D['Last Update'],y=countrys43D['Country/Region']
                          ,z=countrys43D['population'],color='rgba(244,22,100,0.3)'))
            fig.update_layout(scene=dict(xaxis_title='Date',
                      yaxis_title='Country',
                      zaxis_title='population'),margin=dict(l=20,r=10,b=10,t=10),autosize=False)
            fig.show()

И напоследок совместим две очень интересных функциональности библиотеки Plotly: анимация и карты. Создавать анимированные графики в библиотеке очень легко, Вы сами можете в этом убедиться:


            # allCountrys - Pandas DataFrame c данными о заражении в разрезе всех стран 
            mapGraph = allCountrys.groupby(['Last Update', 'Country/Region'])['Confirmed', 'Deaths', 'Recovered'].max()
            mapGraph = mapGraph.reset_index()
            mapGraph['size'] = mapGraph['Confirmed'].pow(0.3)

            fig = px.scatter_geo(mapGraph, locations="Country/Region", locationmode='country names', 
                                color="Confirmed", size='size', hover_name="Country/Region", 
                                range_color= [0, max(mapGraph['Confirmed'])+2], 
                                projection="natural earth", animation_frame="Last Update", 
                                title='Карта распространения COVID-19 ')
            fig.update(layout_coloraxis_showscale=False)
            fig.show()

Карты не работают в оффлайн режиме, поэтому если у Вас по какой-то причине не работает график, вот пример в формате gif:

Спасибо за внимание!

Советуем почитать