В этом пошаговом учебном пособии мы рассмотрим, как анимировать значимую визуализацию из набора данных реального мира с почти 700 000 точек данных.
Если вы предпочитаете клонировать и следовать этому учебному пособию в качестве ноутбука Юпитера, вы можете сделать это на этом ссылка на сайт
Крис-Средство/Учебные пособия
В противном случае мы будем анимировать ~ 60 -летние данные о потреблении энергии в США только в 10 строках Python!
Чтобы доказать это вам, вот код от начала до конца:
import pandas as pd import plotly.express as px # Importing the dataset df = pd.read_csv("https://www.eia.gov/state/seds/sep_use/total/csv/use_all_btu.csv") # Filter out aggregate United States and Washington DC rows df = df[~df.isin(["US", "DC"])] # Filter rows that contain total consumption per energy source total_df = df[df["MSN"].str.match("[A-Z]{2}TC[A-Z]")] # Melt from wide to long format total_df = total_df.melt(id_vars=["Data_Status", "State", "MSN"], var_name="Year", value_name="BTU") # Sum energy consumption per state per year summed_df = total_df.groupby(["State", "Year"], as_index=False).sum() # Animate the bar plot fig = px.bar(summed_df, x="State", y="BTU", animation_frame="Year", range_y=(0, summed_df["BTU"].max()), color="State", title="United States total energy consumption (BTU)") fig.update_xaxes(categoryorder="total ascending") fig.show()
.csv Мы будем работать с публикой доступны на Администрация энергетической информации США Правительственный веб -сайт.
Предварительные пакеты:
А теперь … Время кодировать!
Импорт нашего набора данных относительно проста; Мы можем передать URL -адрес .csv к pandas.read_csv и он импортирует его в Панды. DataFrame
Анкет
df = pd.read_csv("https://www.eia.gov/state/seds/sep_use/total/csv/use_all_btu.csv")
В этом случае наш набор данных содержит строки как для совокупных данных Соединенных Штатов ( US
) и Вашингтон, округ Колумбия ( DC
).
Поскольку мы обеспокоены потреблением энергии на государство, мы собираемся отфильтровать США
и DC
ряды.
df = df[~df.isin(["US", "DC"])]
Не беспокойтесь, если вы не полностью понимаете этот следующий раздел! Он не имеет никакого отношения к коду, мы просто собираемся разработать некоторые важные знания в области домена, прежде чем двигаться вперед.
Просмотр Документация Предоставлено на веб -сайте, мы видим, что "MSN"
Столбец означает Имена мнемонических серий . Это коды, которые содержат информацию о типе источника энергии, сектора и единице.
В контексте наших данных, Row 0
Значение MSN – Abicb Анкет
Давайте разберем это:
- Ab : Компоненты смешивания бензина авиации
- IC : Производственный сектор
- B : Британские тепловые единицы (BTU)
Таким образом, эта строка соответствует Компоненты смешивания авиационного бензина, потребляемые промышленным сектором в британских тепловых единицах (BTU) Анкет
Когда 3 -й и 4 -й символы MSN являются ТК это означает, что строка соответствует общему потреблению энергии во всех секторах (то есть жилом, промышленном и т. Д.) Для этого ресурса.
Оглядываясь назад на компоненты смешивания бензина в авиации, MSN из ABTCB Таким образом, будет
- Ab : Компоненты смешивания бензина авиации
- TC : Всего всех секторов
- B : Британские тепловые единицы (BTU)
Чтобы получить все ряды, которые имеют ТК Как 3 -й и 4 -й символы (и, следовательно, общая), мы можем использовать регулярное выражение с Series.str.match
метод
Шаблон, который мы будем использовать, это " [A-z] {2} tc [a-z] "
.
Давайте разберем это:
- [A-z] {2}: 1-я и 2-я буква может быть любыми заглавными буквами
- TC: 3 -й и 4 -й буквы должны быть TC
- [A-Z]: 5-й персонаж может быть любая заглавная буква
total_df = df[df["MSN"].str.match("[A-Z]{2}TC[A-Z]")]
Теперь, когда у нас есть ряды, которые мы хотим визуализировать, мы собираемся раскрыть наши DataFrame
от широкого до длинного формата. Это помассирует столбцы года в строки как два новых столбца: "Год"
и "Btu"
Анкет
Это позволяет нам выбирать и фильтровать наши данные намного проще сейчас, а также передать их в plotly.express
который ожидает длинный формат DataFrame
.
total_df = total_df.melt(id_vars=["Data_Status", "State", "MSN"], var_name="Year", value_name="BTU")
Теперь, когда у нас есть общее потребление на источник энергии, штат и год, мы можем суммировать их всех вместе, сгруппированные по каждому штату и каждый год.
Это оставит нас с общим потреблением энергии на состояние в год, которое мы ищем визуализировать.
summed_df = total_df.groupby(["State", "Year"], as_index=False).sum()
Наши данные теперь готовы к визуализации! plotly.express.bar
имеет animation_frame
Аргумент, который позволяет нам передать, в каком столбце анимируется наши данные.
Для этого примера мы будем анимировать один кадр на "Год"
данных.
fig = px.bar( summed_df, x="State", y="BTU", color="State", animation_frame="Year", title="United States total energy consumption (BTU)", range_y=( 0, summed_df["BTU"].max() ), ).update_xaxes(categoryorder="total ascending") fig.show()
Отличная работа! Теперь, когда у нас есть эти данные, есть Тон из других идей, которые вы можете найти. Я рекомендую возиться с разными MSN Коды, группировки и т. Д. и посмотрите, что вы можете научиться!
Если у вас есть какие -либо вопросы, не стесняйтесь написать мне или обратиться в комментарии ниже! 👇
Оригинал: “https://dev.to/chrisgreening/animating-60-years-of-us-energy-data-with-10-lines-of-python-afi”