Визуализация данных, показывающих последний уровень безработицы в США с использованием 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, став участником.