# Pomoćni sadržaj

# Korišćeni podaci
#
# Skup podataka "Weather"
# - portal otvorenih podataka Beverli Hilsa (SAD)
# - meteorološki podaci za Beverli Hils (SAD)
#   - pružalac podataka: Grad Beverli Hils (SAD)
#   - odeljenje koje održava podatke: Odeljenje za informacione tehnologije
#   - datum najnovijeg ažuriranja: januar 2021.
#   - format podataka: CSV
#   - podskup: podaci za 2020. godinu
# 
# Internet strana:
# https://www.beverlyhills.org/opendata/datasets/weather/


# %% Biblioteke

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


# %% Zadatak 1

meteo = pd.read_csv("Weather2020.csv", parse_dates=["Date"], 
                    encoding="latin_1")

meteo.dropna(inplace=True)

print()
print("Skup podataka:")
print(meteo)

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


# %% Zadatak 2

meteo = meteo.loc[:, ["Date", "Avg Temperature", "Avg Humidity", 
                      "Avg Wind Speed"]]

meteo.rename(columns={
    "Date": "datum",
    "Avg Temperature": "temperatura_prosek",
    "Avg Humidity": "vlaga_prosek",
    "Avg Wind Speed": "vetar_prosek"
    }, inplace=True)

print()
print("Skup podataka:")
print(meteo)

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


# %% Zadatak 3

meteo["dan"] = meteo["datum"].dt.day

MESEC = {1: "januar", 2: "februar", 3: "mart", 4: "april",
         5: "maj", 6: "jun", 7: "jul", 8: "avgust",
         9: "septembar", 10: "oktobar", 11: "novembar", 12: "decembar"}

meteo["mesec"] = meteo["datum"].dt.month.replace(MESEC)

print()
print("Skup podataka:")
print(meteo)

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


# %% Zadatak 4

meteo["temperatura_prosek_c"] = meteo["temperatura_prosek"].apply(
    lambda e: 5 * (float(e.split()[0]) - 32) / 9)

meteo["vlaga_prosek_proc"] = meteo["vlaga_prosek"].apply(
    lambda e: float(e.split()[0]))

MPH_U_MUS = 0.44707

meteo["vetar_prosek_mus"] = meteo["vetar_prosek"].apply(
    lambda e: float(e.split()[0]) * MPH_U_MUS)

meteo = meteo.apply(lambda k: np.around(k, 2) 
                    if k.name in ["temperatura_prosek_c", "vetar_prosek_mus"] 
                    else k)

meteo.drop(columns=["temperatura_prosek", "vlaga_prosek", "vetar_prosek"], 
           inplace=True)

print()
print("Skup podataka:")
print(meteo)

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


# %% Zadatak 5

meteo_mesec_agreg = (meteo.loc[:, 
                              ["mesec", "temperatura_prosek_c", 
                               "vlaga_prosek_proc", "vetar_prosek_mus"]]
                     .groupby(["mesec"], sort=False).agg(np.mean))

print()
print("Prosečne vrednosti po mesecima:")
print(meteo_mesec_agreg)

temp_prosek_maks_mesec_agreg = meteo_mesec_agreg["temperatura_prosek_c"].max()

meteo_mesec_agreg_temp_maks = meteo_mesec_agreg.loc[
    meteo_mesec_agreg["temperatura_prosek_c"] == 
    temp_prosek_maks_mesec_agreg, :]

print("Prosečne vrednosti za prosečno najtopliji mesec:")
print(meteo_mesec_agreg_temp_maks)


# %% Zadatak 6

print()
print("Najviša prosečna temperatura:")
print(meteo["temperatura_prosek_c"].max())

plt.figure(figsize=(8, 6))
plt.scatter("vlaga_prosek_proc", "temperatura_prosek_c", data=meteo)

plt.xlim(0, 100)
plt.ylim(0, 40)
plt.title("Odnos prosečne temperature i prosečne vlažnosti")
plt.xlabel("Prosečna vlažnost [%]")
plt.ylabel("Prosečna temperatura [°C]")


# %% Zadatak 7

meseci = ["oktobar", "novembar", "decembar"]
meteo_odabir = meteo.loc[meteo["mesec"].isin(meseci), :]

print()
print("Odabrani podaci za mesece {}:".format(meseci))
print(meteo_odabir.loc[:, "dan":"vetar_prosek_mus"])

vred_temp = meteo_odabir["temperatura_prosek_c"]

print("Deskriptivne statistike za prosečnu temperaturu tokom meseci {}:".
      format(meseci))
print(vred_temp.describe())

opsezi_temp = np.linspace(0, 30, 4)

frek_temp = pd.cut(vred_temp, opsezi_temp, right=False, 
                   include_lowest=True).value_counts(sort=False)

print("Učestalost po opsezima za prosečnu temperaturu tokom meseci {}:".
      format(meseci))
print(frek_temp)

labele = frek_temp.index.to_series().astype("string").apply(
    lambda x: x + " °C")

plt.figure(figsize=(8, 6))
plt.pie(frek_temp, explode=np.repeat(0.05, frek_temp.size), labels=labele, 
        colors=cm.get_cmap("Accent").colors, autopct="%.1f%%")

plt.title("Raspodela dana po opsezima prosečne temperature \nza mesece {}".
          format(meseci))


# %% Zadatak 8

print()
print("Najveća prosečna brzina vetra:")
print(meteo["vetar_prosek_mus"].max())

opsezi_vetar = np.linspace(0, 5.5, 23)
print("Opsezi za prosečnu brzinu vetra:")
print(opsezi_vetar)

meteo_jul = meteo.loc[meteo["mesec"] == "jul", :]
meteo_decembar = meteo.loc[meteo["mesec"] == "decembar", :]

frek_vetar_jul = pd.cut(meteo_jul["vetar_prosek_mus"], opsezi_vetar, 
                        right=False, include_lowest=True).value_counts()
print("Učestalost po opsezima za prosečnu brzinu vetra tokom jula:")
print(frek_vetar_jul)

frek_vetar_decembar = pd.cut(meteo_decembar["vetar_prosek_mus"], 
                             opsezi_vetar, right=False, 
                             include_lowest=True).value_counts()
print("Učestalost po opsezima za prosečnu brzinu vetra tokom decembra:")
print(frek_vetar_decembar)

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

plt.subplot(121)
plt.hist(meteo_jul["vetar_prosek_mus"], opsezi_vetar)
plt.ylim(0, 15)
plt.title("Prosečna brzina vetra u julu")
plt.xlabel("Prosečna brzina vetra [m/s]")
plt.ylabel("Učestalost")

plt.subplot(122)
plt.hist(meteo_decembar["vetar_prosek_mus"], opsezi_vetar)
plt.ylim(0, 15)
plt.title("Prosečna brzina vetra u decembru")
plt.xlabel("Prosečna brzina vetra [m/s]")
plt.ylabel("Učestalost")


# %% Zadatak 9

meteo_maj = meteo.loc[meteo["mesec"] == "maj", :]

print()
print("Podaci za dane u maju:")
print(meteo_maj)

vlaga_prosek_medijana = meteo["vlaga_prosek_proc"].median()

print("Medijana za prosečnu vlažnost:")
print(vlaga_prosek_medijana)

kategorije_boje = {"do medijane": "lightblue", "iznad medijane": "orange"}

boje = meteo_maj["vlaga_prosek_proc"].apply(
    lambda e: kategorije_boje["do medijane"] if e <= vlaga_prosek_medijana 
    else kategorije_boje["iznad medijane"])

plt.figure(figsize=(8, 6))
plt.bar("dan", "vlaga_prosek_proc", data=meteo_maj, 
        color=boje, tick_label="dan")

plt.ylim(0, 100)
plt.title("Prosečna vlažnost tokom maja")
plt.xlabel("Dan u mesecu")
plt.ylabel("Prosečna vlažnost [%]")
plt.legend(handles=[
    mpatches.Patch(color=kategorije_boje["iznad medijane"], 
                   label="iznad medijane"),
    mpatches.Patch(color=kategorije_boje["do medijane"], 
                   label="do medijane")], 
    title="Nivo prosečne vlažnosti")


# %% Zadatak 10

plt.figure(figsize=(8, 6))
plt.plot("dan", "temperatura_prosek_c", "^:",
         data=meteo.loc[meteo["mesec"] == "januar", :], 
         alpha=0.7, label="januar")
plt.plot("dan", "temperatura_prosek_c", "o:",
         data=meteo.loc[meteo["mesec"] == "oktobar", :], 
         alpha=0.7, label="oktobar")

plt.ylim(0)
plt.title("Prosečna temperatura tokom meseca")
plt.xlabel("Dan u mesecu")
plt.ylabel("Prosečna temperatura [°C]")
plt.legend(title="Mesec")

plt.figure(figsize=(8, 6))
plt.step("dan", "temperatura_prosek_c",
         data=meteo.loc[meteo["mesec"] == "januar", :], 
         where="mid", alpha=0.7, linestyle="--", label="januar")
plt.step("dan", "temperatura_prosek_c",
         data=meteo.loc[meteo["mesec"] == "oktobar", :], 
         where="mid", alpha=0.7, linestyle="-.", label="oktobar")

plt.ylim(0)
plt.title("Prosečna temperatura tokom meseca")
plt.xlabel("Dan u mesecu")
plt.ylabel("Prosečna temperatura [°C]")
plt.legend(title="Mesec")

