<jupyter_start><jupyter_text>Ваше завдання створити візуалізації, котрі відповідають на наступні питання:- Як змінювалась структура генерації електроенергії за роками?- Як залежить споживання електроенергії від дня року та години доби?- Як змінюється генерація електроенергії з різних джерел впродовж доби?- Як змінюється споживання електроенергії впродовж доби у розрізі місяців року та пір року?- Як змінюється споживання електроенергії впродовж тижня?Ви самостійно маєте обрати спосіб візуалізації. Ви також маєте написати короткий супровідний текст до кожної візуалізації, котрий пояснює, чому ви обрали саме цей спосіб презентації даних, які ще альтернативи ви розглядали, та чому зупинились саме на цьому варіанті (які його переваги та недоліки).Джерело даних: Національна енергетична компанія "Укренерго"<jupyter_code>import altair as alt
import pandas as pd
import numpy as np
## Finding day of year
import datetime as dt
alt.data_transformers.disable_max_rows()
df = pd.read_excel('./data/2014-2020.xlsx')
df = df.rename(columns={'Час/Дата': 'Date'})
df.head()<jupyter_output><empty_output><jupyter_text>Як змінювалась структура генерації електроенергії за роками?<jupyter_code>sources = ["AES", "TEC", "VDE", "TES", "GES", "GAES_GEN"]
years_range = list(range(2014, 2020))
columns = ["year", "source", "energy", ]

df_sources = pd.DataFrame(columns=columns)
for y in years_range:
    year_mask = df['Date'].str.contains(str(y))
    means = list(df[year_mask][sources].mean())
    for s, m in zip(sources, means):
        df_temp = pd.DataFrame([[y, s, m]], columns=columns)
        df_sources = df_sources.append(df_temp, ignore_index=True)

df_sources.head()
alt.Chart(df_sources).mark_bar().encode(
    x=alt.X('year:O', stack='zero', title="Рік"),
    y=alt.Y('energy:Q', title="МВт"),
    color=alt.Color('source', title="Джерело Ен")
).properties(
    width = 500,
    height = 400,
    title='Зміна структури генерації електроенергії за роками',
)<jupyter_output><empty_output><jupyter_text>ОписЯ обрав цей вид візуалізації бо він наглядний, та його легко зрозуміти. Для покращення цього графіку можна подумати про деталізацією, так щоб можна було отримати дані в числах а не тільки наглядно  Як залежить споживання електроенергії від дня року та години доби?<jupyter_code>def extract_year(x):
    return int(x[-4:])

def extract_month(x):
    return int(x.split(".")[1])

def extract_day(x):
    return int(x.split(".")[0].split("-")[1])

def extract_hour(x):
    return int(x.split("-")[0])

def get_weekday(x):
    d_m_y = [int(elm) for elm in x.split("-")[1].split(".")]
    return dt.datetime(d_m_y[2], d_m_y[1], d_m_y[0]).weekday()

def get_day_of_year(x):
    d_m_y = [int(elm) for elm in x.split("-")[1].split(".")]
    dt_value = dt.datetime(d_m_y[2], d_m_y[1], d_m_y[0])

    return int(dt_value.strftime('%j'))

df_dates = df
df_dates["year"] = df_dates["Date"].apply(extract_year)
df_dates["month"] = df_dates["Date"].apply(extract_month)
df_dates["day"] = df_dates["Date"].apply(extract_day)
df_dates["hour"] = df_dates["Date"].apply(extract_hour)
df_dates["weekday"] = df_dates["Date"].apply(get_weekday)
df_dates["day_of_year"] = df_dates["Date"].apply(get_day_of_year)

df_dates.head()

df_dates = df_dates.rename(columns={'CONSUMPTION': 'consumption'})
columns = ["day_of_year", "hour", "avg_consumption"]

df_consumption = pd.DataFrame(columns=columns)
for h in range(1, 24):
    for d in range(1, 367):
        hour_mask = df_dates['hour'] == h
        day_mask = df_dates['day_of_year'] == d
        m = int(df_dates[hour_mask & day_mask]['consumption'].mean())
        df_temp = pd.DataFrame([[d, h, m]], columns=columns)
        df_consumption = df_consumption.append(df_temp, ignore_index=True)

print(df_consumption)

alt.Chart(df_consumption).transform_filter(alt.FieldRangePredicate(field='hour', range=[1, 24])).mark_rect().encode(
    x = alt.X('hour:O'),
    y = alt.Y('day_of_year:N', sort = alt.Sort(order = 'descending')),
    color = alt.Color('avg_consumption:Q', scale = alt.Scale(scheme = 'blueorange'))
).properties(title="Залежність споживання електроенергії від дня року та години доби")<jupyter_output><empty_output><jupyter_text>ОписЯ обрав цей вид візуалізації, бо я бачив подібний графік в коді до цієї практичної та подумав що це досить інтуїтивно буде для такго виду даних, хіт мапа від синього до теплого оранджевого в цьому допомагає.  Як змінюється генерація електроенергії з різних джерел впродовж доби?<jupyter_code>columns = ["hour", "source", "energy"]

df_sources_hours = pd.DataFrame(columns=columns)
for h in range(1, 24):
    hour_mask = df['Date'].str.contains(f"^{h}-.*$", regex=True)
    means = list(df[hour_mask][sources].mean())
    for s, m in zip(sources, means):
        df_temp = pd.DataFrame([[h, s, m]], columns=columns)
        df_sources_hours = df_sources_hours.append(df_temp, ignore_index=True)

df_sources_hours.head()
alt.Chart(df_sources_hours).mark_bar().encode(
    x=alt.X('hour:O', stack='zero', title="Година доби"),
    y=alt.Y('energy:Q', title="МВт"),
    color=alt.Color('source', title="Джерело Ен")
).properties(
    width = 900,
    height = 600,
    title='Як змінюється генерація електроенергії з різних джерел впродовж доби?',
)<jupyter_output><empty_output><jupyter_text>ОписЯ обрав цей вид візуалізації, бо завдання досить подібне до першого, де я використав це й жеш вид візуалізації.  Як змінюється споживання електроенергії впродовж доби у розрізі місяців року та пір року?<jupyter_code>columns = ["month", "hour", "avg_consumption"]

df_consumption_by_month = pd.DataFrame(columns=columns)
for h in range(1, 24):
    for m in range(1, 13):
        hour_mask = df_dates['hour'] == h
        month_mask = df_dates['month'] == m
        consmption_mean = int(df_dates[hour_mask & month_mask]['consumption'].mean())
        df_temp = pd.DataFrame([[m, h, consmption_mean]], columns=columns)
        df_consumption_by_month = df_consumption_by_month.append(df_temp, ignore_index=True)

df_consumption_by_month.head()
alt.Chart(df_consumption_by_month).transform_filter(alt.FieldRangePredicate(field='hour', range=[1, 24])).mark_rect().encode(
    x = alt.X('hour:O'),
    y = alt.Y('month:N', sort = alt.Sort(order = 'descending')),
    color = alt.Color('avg_consumption:Q', scale = alt.Scale(scheme = 'blueorange'))
).properties(title="Як змінюється споживання електроенергії впродовж доби у розрізі місяців року")<jupyter_output><empty_output><jupyter_text>ОписЯ обрав цей вид візуалізації, бо використання хітмапи мені сподобалось, і тут воно теж підходить під умову.<jupyter_code>columns = ["year_season", "hour", "avg_consumption"]
seasons_of_year = {1: [12, 1 ,2], 2: [3, 4, 5], 3: [6, 7, 8], 4: [9, 10, 11]}

df_consumption_by_seasons = pd.DataFrame(columns=columns)
for h in range(1, 24):
    for year_season_indx, season in enumerate(["Winter", "Spring", "Summer", "Fall"], start=1):
        hour_mask = df_dates['hour'] == h
        year_season_mask = df_dates['month'].isin(seasons_of_year[year_season_indx])
        consmption_mean = int(df_dates[hour_mask & year_season_mask]['consumption'].mean())
        df_temp = pd.DataFrame([[season, h, consmption_mean]], columns=columns)
        df_consumption_by_seasons = df_consumption_by_seasons.append(df_temp, ignore_index=True)

df_consumption_by_seasons.head()
alt.Chart(df_consumption_by_seasons).transform_filter(alt.FieldRangePredicate(field='hour', range=[1, 24])).mark_rect().encode(
    x = alt.X('hour:O'),
    y = alt.Y('year_season:N', sort = alt.Sort(order = 'descending')),
    color = alt.Color('avg_consumption:Q', scale = alt.Scale(scheme = 'blueorange'))
).properties(title="Як змінюється споживання електроенергії впродовж доби у розрізі пори року")<jupyter_output><empty_output><jupyter_text>ОписТут теж хітмапа піходить до умови і наглядність мене задовільняє.  Як змінюється споживання електроенергії впродовж тижня?<jupyter_code>columns = ["weekday", "avg_consumption"]
days_of_week = ["Monday", "Tuesday","Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
df_consumption_by_weekday = pd.DataFrame(columns=columns)

for week_indx, week_name in enumerate(days_of_week):
    weekday_mask = df_dates['weekday'] == week_indx
    consmption_mean = int(df_dates[weekday_mask]['consumption'].mean())
    df_temp = pd.DataFrame([[week_name, consmption_mean]], columns=columns)
    df_consumption_by_weekday = df_consumption_by_weekday.append(df_temp, ignore_index=True)

print(df_consumption_by_weekday)

alt.Chart(df_consumption_by_weekday).mark_bar(size=20).encode(
    alt.X(
        "weekday:N",
        sort=days_of_week,
        title="Day of Week"
    ),
    alt.Y(
        "avg_consumption:Q",
        title="Consumption"
    )
).properties(height=400, width=800)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1385665529010239, 'fraction_numerical': 0.011035267349260523, 'mean_word_length': 5.614747930775019, 'pattern_counts': {'":': 0, '<': 29, '<?xml version=': 0, '>': 29, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '467609', 'license': 'MIT', 'n_tokens_mistral': 3487, 'n_tokens_neox': 3803, 'n_words': 688, 'path': 'Assignments/Assignment02/02.ipynb', 'repo_name': 'sluzhynskyi/DataVisualization', 'size': '8790'}