# Univerzitet u Novom Sadu, Fakultet tehničkih nauka, Novi Sad, Srbija
# Studijski program OAS Informacioni inženjering
# Predmet Metode i tehnike nauke o podacima

# Pomoćni sadržaj

# Korišćeni podaci
#
# Skup podataka "Iowa Motor Fuel Sales by County and Year"
# - portal otvorenih podataka američke savezne države Ajova (SAD)
# - podaci o prodaji motornog goriva u američkoj saveznoj državi Ajova (SAD)
#   - vlasnik podataka: Estelle Montgomery
#   - odeljenje koje objavilo podatke: Iowa Dept of Revenue
#   - datum kreiranja: 4. 12. 2014.
#   - datum najnovijeg ažuriranja: 4. 4. 2025.
#   - format podataka: CSV i drugi
# 
# Internet strana:
# https://data.iowa.gov/Sales-Distribution/Iowa-Motor-Fuel-Sales-by-County-and-Year/hbwp-wys3/about_data


# %% Biblioteke

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches


# %% Zadatak 1

prodaja = pd.read_csv("Iowa_Motor_Fuel_Sales_by_County_and_Year_20260407.csv", 
                      thousands=",", decimal=".", encoding="utf-8")

prodaja.dropna(inplace=True)

print()
print("Skup podataka:")
print(prodaja)

print("Kolone:")
print(prodaja.dtypes)

print("Nazivi kolona:")
print(prodaja.columns)

prodaja.columns = [naziv.strip() for naziv in prodaja.columns]

print("Nazivi kolona nakon sređivanja:")
print(prodaja.columns)


# %% Zadatak 2

prodaja = prodaja.loc[:, ["Calendar Year", 
                          "County", 
                          "Number of Retail Locations", 
                          "Non-Ethanol Gasoline Sales (in gallons)", 
                          "Ethanol Gasoline Sales (in gallons)", 
                          "Clear and Dyed Diesel Sales (in gallons)", 
                          "Clear and Dyed Biodiesel Sales (in gallons)", 
                          "Pure Biodiesel Sales (in gallons)"]]

prodaja.rename(columns={
    "Calendar Year": "godina",
    "County": "okrug",
    "Number of Retail Locations": "broj_lokacija",
    "Non-Ethanol Gasoline Sales (in gallons)": "benzin_bez_etanola",
    "Ethanol Gasoline Sales (in gallons)": "benzin_s_etanolom",
    "Clear and Dyed Diesel Sales (in gallons)": "dizel_prozirni_obojeni",
    "Clear and Dyed Biodiesel Sales (in gallons)": "biodizel_prozirni_obojeni",
    "Pure Biodiesel Sales (in gallons)": "biodizel_čisti"
    }, inplace=True)

print()
print("Skup podataka:")
print(prodaja)

print("Kolone:")
print(prodaja.dtypes)


# %% Zadatak 3

broj_godina  = prodaja["godina"].nunique()

podaci_okrug_agreg = (prodaja.loc[:, ["okrug", "godina"]]
                       .groupby(["okrug"], sort=False).count())

okrug_potpuni = podaci_okrug_agreg.loc[
    podaci_okrug_agreg["godina"] == broj_godina, :].index.to_list()

prodaja = prodaja.loc[prodaja["okrug"].isin(okrug_potpuni), :]

print()
print("Skup podataka:")
print(prodaja)


# %% Zadatak 4

broj_lokacija_medijana = prodaja["broj_lokacija"].median()

print()
print("Medijana za broj lokacija:")
print(broj_lokacija_medijana)

prodaja.insert(prodaja.columns.get_loc("broj_lokacija") + 1, 
               "brojnost_lokacija", 
               prodaja["broj_lokacija"].apply(
                   lambda e: "mala" if e <= broj_lokacija_medijana 
                   else "velika"))

print("Skup podataka:")
print(prodaja)

print("Kolone:")
print(prodaja.dtypes)

print("Deo skupa podataka (neke od kolona):")
print(prodaja.loc[:, ["godina", "okrug", "broj_lokacija", 
                      "brojnost_lokacija"]])


# %% Zadatak 5

GAL_U_LIT = 3.785412

prodaja = prodaja.apply(lambda k: np.around(np.multiply(k, GAL_U_LIT), 0) 
                        if k.name in ["benzin_bez_etanola", 
                                      "benzin_s_etanolom", 
                                      "dizel_prozirni_obojeni", 
                                      "biodizel_prozirni_obojeni", 
                                      "biodizel_čisti"] 
                        else k)

print()
print("Skup podataka:")
print(prodaja)

print("Deo skupa podataka (neke od kolona):")
print(prodaja.loc[:, ["godina", "okrug", "benzin_bez_etanola", 
                      "benzin_s_etanolom"]])

print("Deo skupa podataka (neke od kolona):")
print(prodaja.loc[:, ["godina", "okrug", "dizel_prozirni_obojeni"]])

print("Deo skupa podataka (neke od kolona):")
print(prodaja.loc[:, ["godina", "okrug", "biodizel_prozirni_obojeni", 
                      "biodizel_čisti"]])


# %% Zadatak 6

podaci_broj_lokacija_agreg = (
    prodaja.loc[:, ["okrug", "broj_lokacija"]]
    .groupby(["okrug"], as_index = False, sort=False).mean()
    .sort_values("broj_lokacija", ascending = False))

n_okrug = 5

print()
print("Okruzi najvećih prosečnih brojeva lokacija (odabrano okruga n = {}):"
      .format(n_okrug))
print(podaci_broj_lokacija_agreg[0:n_okrug])


# %% Zadatak 7

godina_odabir = 2019
podaci_godina_odabir = prodaja.loc[prodaja["godina"] == godina_odabir, :]

print()
print("Najveća prodaja benzina s etanolom u okrugu za {}. godinu:".
      format(godina_odabir))
print(podaci_godina_odabir["benzin_s_etanolom"].max())
print("Najveća prodaja benzina bez etanola u okrugu za {}. godinu:".
      format(godina_odabir))
print(podaci_godina_odabir["benzin_bez_etanola"].max())

dimenzije_podaci_godina_odabir = podaci_godina_odabir["broj_lokacija"]

plt.figure(figsize=(8, 6))
plt.scatter("benzin_s_etanolom", "benzin_bez_etanola", 
            data=podaci_godina_odabir, s=dimenzije_podaci_godina_odabir)

plt.xlim(0, 800000000)
plt.ylim(0, 200000000)
plt.title("Prodaja benzina bez etanola u odnosu na prodaju " + 
          "benzina s etanolom \nna nivou okruga za {}. godinu"
          .format(godina_odabir))
plt.xlabel("Prodaja benzina s etanolom [l]")
plt.ylabel("Prodaja benzina bez etanola [l]")


# %% Zadatak 8

vred_broj_lokacija = podaci_godina_odabir["broj_lokacija"]

print()
print("Deskriptivne statistike za broj lokacija u okrugu za {}. godinu:"
      .format(godina_odabir))
print(vred_broj_lokacija.describe())

opsezi_broj_lokacija = np.linspace(0, 200, 5)

frek_broj_lokacija = (pd.cut(vred_broj_lokacija, opsezi_broj_lokacija, 
                             right=False, include_lowest=True)
                      .value_counts(sort=False))

print("Učestalost po opsezima za broj lokacija u okrugu za {}. godinu:"
      .format(godina_odabir))
print(frek_broj_lokacija)

labele = frek_broj_lokacija.index.to_series().astype("string")

plt.figure(figsize=(8, 6))
plt.pie(frek_broj_lokacija, explode=np.repeat(0.05, frek_broj_lokacija.size), 
        labels=labele, colors=mpl.colormaps.get_cmap("Accent").colors, 
        autopct="%.2f%%")

plt.title("Raspodela okruga po opsezima broja lokacija za {}. godinu"
          .format(godina_odabir))


# %% Zadatak 9

print()
print("Najveća prodaja prozirnog i obojenog biodizela u okrugu za {}. godinu:"
      .format(godina_odabir))
print(podaci_godina_odabir["biodizel_prozirni_obojeni"].max())

print("Najveća prodaja čistog biodizela u okrugu za {}. godinu:"
      .format(godina_odabir))
print(podaci_godina_odabir["biodizel_čisti"].max())

opsezi_biodizel = np.linspace(0, 300000000, 16)

frek_biodizel_prozirni_obojeni = pd.cut(
    podaci_godina_odabir["biodizel_prozirni_obojeni"], opsezi_biodizel, 
    right=False, include_lowest=True).value_counts()
print("Učestalost po opsezima za prodaju prozirnog i obojenog biodizela " + 
      "u okrugu za {}. godinu:"
      .format(godina_odabir))
print(frek_biodizel_prozirni_obojeni)

frek_biodizel_čisti = pd.cut(
    podaci_godina_odabir["biodizel_čisti"], opsezi_biodizel, 
    right=False, include_lowest=True).value_counts()
print("Učestalost po opsezima za prodaju čistog biodizela " + 
      "u okrugu za {}. godinu:"
      .format(godina_odabir))
print(frek_biodizel_čisti)

plt.figure(figsize=(8, 6))

plt.subplot(121)
plt.hist(podaci_godina_odabir["biodizel_prozirni_obojeni"], opsezi_biodizel)
plt.ylim(0, 80)
plt.title("Prodaja prozirnog i obojenog \nbiodizela u okrugu za {}. godinu"
          .format(godina_odabir))
plt.xlabel("Prodaja prozirnog i \nobojenog biodizela [l]")
plt.ylabel("Učestalost")

plt.subplot(122)
plt.hist(podaci_godina_odabir["biodizel_čisti"], opsezi_biodizel)
plt.ylim(0, 80)
plt.title("Prodaja čistog biodizela \nu okrugu za {}. godinu"
          .format(godina_odabir))
plt.xlabel("Prodaja čistog \nbiodizela [l]")
plt.ylabel("Učestalost")


# %% Zadatak 10

okrug_odabir = lambda e : e.startswith("C")
podaci_godina_okrug_odabir = podaci_godina_odabir.loc[
    podaci_godina_odabir["okrug"].apply(okrug_odabir), :]

print()
print("Odabrani okruzi:")
print(podaci_godina_okrug_odabir["okrug"])
print("Deskriptivne statistike za prodaju prozirnog i obojenog dizela " + 
      "u okrugu za odabrane okruge i {}. godinu:".format(godina_odabir))
print(podaci_godina_okrug_odabir["dizel_prozirni_obojeni"].describe())

kategorije_boje = {"mala": "lightblue", "velika": "orange"}
boje_podaci_godina_okrug_odabir = podaci_godina_okrug_odabir[
    "brojnost_lokacija"].apply(lambda e: kategorije_boje[e])

plt.figure(figsize=(8, 6))
plt.bar("okrug", "dizel_prozirni_obojeni", data=podaci_godina_okrug_odabir, 
        color=boje_podaci_godina_okrug_odabir, tick_label="okrug")

plt.xticks(rotation=45)
plt.ylim(0, 50000000)
plt.title("Prodaja prozirnog i obojenog dizela u okrugu \n" + 
          "za odabrane okruge i {}. godinu".format(godina_odabir))
plt.xlabel("Okrug")
plt.ylabel("Prodaja prozirnog i obojenog dizela [l]")
plt.legend(handles=[
    mpatches.Patch(color=kategorije_boje["mala"],
                   label="mala"),
    mpatches.Patch(color=kategorije_boje["velika"],
                   label="velika")], 
    title="Brojnost lokacija")


# %% Zadatak 11

podaci_godina_agreg = (prodaja.loc[:, ["godina", 
                                       "benzin_bez_etanola",
                                       "benzin_s_etanolom"]]
                       .groupby(["godina"], as_index=False, sort=False).sum())

print()
print("Prodaja benzina bez etanola i benzina s etanolom po godinama:")
print(podaci_godina_agreg)

plt.figure(figsize=(8, 6))
plt.plot("godina", "benzin_bez_etanola", "^:", data=podaci_godina_agreg, 
         alpha=0.7, label="benzin bez etanola")
plt.plot("godina", "benzin_s_etanolom", "o:", data=podaci_godina_agreg, 
         alpha=0.7, label="benzin s etanolom")

plt.ylim(0)
plt.title("Prodaja goriva po godinama")
plt.xlabel("Godina")
plt.ylabel("Prodaja goriva [l]")
plt.legend(title="Vrsta goriva")

plt.figure(figsize=(8, 6))
plt.step("godina", "benzin_bez_etanola", where="mid", 
         data=podaci_godina_agreg, alpha=0.7, linestyle="--", 
         label="benzin bez etanola")
plt.step("godina", "benzin_s_etanolom", where="mid", 
         data=podaci_godina_agreg, alpha=0.7, linestyle="-.", 
         label="benzin s etanolom")

plt.ylim(0)
plt.title("Prodaja goriva po godinama")
plt.xlabel("Godina")
plt.ylabel("Prodaja goriva [l]")
plt.legend(title="Vrsta goriva")

