Рубрики
Без рубрики

Анимируя 60 лет энергетических данных США с 10 линиями Python

В этом пошаговом учебном пособии мы рассмотрим, как анимировать значимую визуализацию из … Tagged с помощью Python, DataScience, Codenewbie, Tutorial.

В этом пошаговом учебном пособии мы рассмотрим, как анимировать значимую визуализацию из набора данных реального мира с почти 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”