Визуализация данных, показывающих последний уровень безработицы в США с использованием Plotly Python

Table of Contents
Introduction
1. Data preparation
2. Animated Bar Chart
3. A line chart
Conclusion

Вступление

Во всех новостях пишут об экономических трудностях из-за COVID-19. Последствия непропорционально сильно повлияли на общины чернокожих.

Федеральный резервный банк Сент-Луиса (FRED) обновил данные по уровню безработицы. Диапазон наблюдений варьируется в зависимости от набора данных, но последние данные относятся к маю 2020 года. Мы собираемся визуализировать, как уровень безработицы изменился в зависимости от расы и пола за год, используя Графически анимированную гистограмму на Jupyter.

В этой статье предполагается, что вы уже знакомы с основными операциями в JupyterLab / Jupyter Notebook.

Сюжетная инсталляция

plotly.py можно установить с помощью pip.

$ pip install plotly==4.8.1

для пользователей Conda:

$ conda install -c plotly plotly=4.8.1

Поддержка JupyterLab (Python 3.5+)

Используя pip:

$ pip install jupyterlab "ipywidgets>=7.5"

для пользователей Conda:

$ conda install jupyterlab "ipywidgets=7.5"

Затем запустите следующее (вам нужен установленный узел):

# JupyterLab renderer support 
$ jupyter labextension install [email protected]  
# OPTIONAL: Jupyter widgets extension 
$ jupyter labextension install @jupyter-widgets/jupyterlab-manager [email protected]






Подготовка данных

Вышеуказанные данные составляют 20 лет. И старше (LNS14000024), 20 лет. И более, белые мужчины (LNS14000028), 20 лет. Конец, белые женщины (LNS14000029), 20 лет. И старше, черные или афроамериканские мужчины (LNS14000031), 20 лет. И старше, чернокожие или афроамериканки (LNS14000032)), 20 лет. И старше, латиноамериканские или латиноамериканские мужчины (LNS14000034), 20 лет. И старше, испаноязычные или латиноамериканские женщины (LNS14000032).

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

import pandas as pd
import plotly.express as px 
over20='https://gist.githubusercontent.com/shinokada/dfcdc538dedf136d4a58b9bcdcfc8f18/raw/d1db4261b76af67dd67c00a400e373c175eab428/LNS14000024.csv'
over20_white_men='https://gist.githubusercontent.com/shinokada/dfcdc538dedf136d4a58b9bcdcfc8f18/raw/d1db4261b76af67dd67c00a400e373c175eab428/LNS14000028.csv'
over20_white_women='https://gist.githubusercontent.com/shinokada/dfcdc538dedf136d4a58b9bcdcfc8f18/raw/d1db4261b76af67dd67c00a400e373c175eab428/LNS14000029.csv'
over20_black_men='https://gist.githubusercontent.com/shinokada/dfcdc538dedf136d4a58b9bcdcfc8f18/raw/7d63e7a7495dfb8578120016c7a7dd4edc04e20d/LNS14000031.csv'
over20_black_women='https://gist.githubusercontent.com/shinokada/dfcdc538dedf136d4a58b9bcdcfc8f18/raw/d1db4261b76af67dd67c00a400e373c175eab428/LNS14000032.csv'
over20_hispanic_men='https://gist.githubusercontent.com/shinokada/dfcdc538dedf136d4a58b9bcdcfc8f18/raw/f693c9bdd76875b12a14033cc54931da894bd341/LNU04000034.csv'
over20_hispanic_women='https://gist.githubusercontent.com/shinokada/dfcdc538dedf136d4a58b9bcdcfc8f18/raw/f693c9bdd76875b12a14033cc54931da894bd341/LNU04000035.csv' 
df_over20 = pd.read_csv(over20)
df_over20_wm = pd.read_csv(over20_white_men)
df_over20_ww = pd.read_csv(over20_white_women)
df_over20_bm = pd.read_csv(over20_black_men)
df_over20_bw = pd.read_csv(over20_black_women)
df_over20_hm = pd.read_csv(over20_hispanic_men)
df_over20_hw = pd.read_csv(over20_hispanic_women) 
def prepare(dfs, datefrom):
    result=[]
    for item in dfs:
        item.columns = ['date','rate','category']
        item = item[item['date']>= datefrom]
        result.append(item)
    return result 
dfs = [df_over20, df_over20_wm, df_over20_ww, df_over20_bm, df_over20_bw, df_over20_hm, df_over20_hw]
datefrom='2017-01-01'
categories = ['Average', 'White men', 'White women', 'Black men', 'Black women','Hispanic men', 'Hispanic women'] 
i=0
while i < len(categories):
    dfs[i].loc[:,'category'] = categories[i]
    i = i+1     
df=prepare(dfs, datefrom)    
df = pd.concat(df, ignore_index=True)
display(df)

Импортируем необходимые библиотеки, Pandas и Plotly.express.

Мы создаем переменные для каждых данных, используя URL-адреса Github.

Мы читаем все файлы значений, разделенных запятыми (файлы csv), используя read_csv.

Мы создаем функцию с именем prepare. Эта функция принимает два параметра: dfs список фреймов данных и datefrom строку даты.

Создаем пустой список result. Мы перебираем список DataFrames для переименования столбцов, фильтруем поле date, используя переменную datefrom, и добавляем каждый DataFrame в result.

Мы определяем переменную dfs, используя все DataFrames, datefrom и categories.

Мы добавляем новый столбец, используя dfs и categories.

Мы используем prepare функцию dfs и datefrom в качестве аргументов.

Мы объединяем все DataFrames, используя concat с параметром ignore_index=True. Каждый DataFrame имеет свой собственный индекс, и это позволяет нам игнорировать их и маркировать индекс от 0,…, n-1. Выходные данные df имеют следующую структуру.

Анимированная гистограмма

Модуль plotly.express - это высокоуровневый API-интерфейс plotly для быстрой генерации фигур.

fig = px.bar(df, x="category", y="rate", color="category",
   animation_frame="date", animation_group="category", 
   range_y=[0,20])
fig.update_layout(
    height=600,
    title_text='Over 20 Unemployment Rate in USA from'+datefrom+' to May 2020'
)
fig.show()

Каждая функция Plotly Express возвращает объект graph_objects.Figure, и мы создаем его экземпляр с помощью plotly.express.bar. Устанавливаем параметр, x, y, color и т. Д.

Мы используем update_layout для установки height и title, а затем отображаем анимированную гистограмму.

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

Линейный график

На приведенной ниже диаграмме показан уровень безработицы с 1972–01–01 по 2020–05–01. Мы выбираем пять DataFrames и меняем значение datefrom. Если вы хотите создать анимацию линейного графика, смотрите этот пост.

df = pd.concat([df_over20, df_over20_wm, df_over20_ww, df_over20_bm, df_over20_bw], ignore_index=True)
datefrom='1972-01-01'
fig = px.line(df, x="date", y="rate", color="category",range_x=[datefrom,'2020-07-30'])
# fig.update_layout(hovermode='x unified')
fig.update_layout(
    height=600,
    title_text='Over 20 Unemployment Rate in USA from'+datefrom+' to May 2020'
)
fig.show()

Заключение

Анимированная гистограмма - отличный инструмент, чтобы показать резкое изменение уровня безработицы из-за COVID-19. Pandas и Python позволяют легко комбинировать и изменять исходные данные.

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

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

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