Exploratory Data Analysis 1

#uvoz biblioteka

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sb
from pathlib import Path

#podesavanje ispisa (na dve decimale)
pd.set_option('display.float_format', lambda x: '%.2f' % x)
DATA_PATH = Path("city_temperature.csv")

##ucitavanje info
df = pd.read_csv(DATA_PATH)
#dimenzije
print("Dimenzije:", df.shape)
print(df.head()) #display na jupyter
print("\nInfo:")
print(df.info())
print("\nBroj jedinstvenih po koloni:")
print(df.nunique()) #display na jupyter

#prikaz memorije, 1e6 = 1.000.000 (milion)
print("\n Memorija u MB:", df.memory_usage(deep=True).sum()/1e6)

##provera i tretiranje nedostajucih vrednosti
#njihov broj
NANs = df.isnull().sum()
print(NANs)

#koliki je udeo u tome
udeo = df.isnull().sum()/len(df) * 100 #radi prikaza u procentima
print("Nan: ",udeo,"%", sep="")

#deskriptivne statistike
print(df.describe()) #display na jupyter

#tretiranje

n_before = (df["AvgTemperature"] == -99).sum()
df.loc[df["AvgTemperature"] == -99, "AvgTemperature"] = np.nan
#(u koloni ce se menjati -99 sa {n_before} uzoraka).

#nulti dan u mesecu
n_before = (df["Day"] == 0).sum()
df.loc[df["Day"] == 0, "Day"] = np.nan
#(u koloni ce se menjati nulti dan sa {n_before} uzoraka).

print("Duplikati potpuno iste vrste:", df.duplicated().sum())

#sve godine ponaosob ali samo jednom.
print(df['Year'].unique())

#state se izbacuje iz daljeg razmatranja, 1 = kolona
df = df.drop("State", axis=1)

#radi popune prosecne temperature, s obzirom na sortiranost baze, samo ce se
#popuniti poslednjom validnom vrednoscu
#→ df['AvgTemperature'].fillna(value, inplace=True) ←
 
df["AvgTemperature"] = df["AvgTemperature"].ffill()

#brisanje onih uzoraka sto nedostaje i na kraju ispis onog sto je nestalo
df = df.dropna(axis=0)
print(df.isnull().sum())

##univarijantna analiza promenljive avgtemperature i kategorija
#pripremanje grafikona
plt.figure(figsize=(6,4))
#pripremanje histograma
plt.hist(df["AvgTemperature"], bins=50) #i to u 50 "kofa"
plt.title("Histogram")
plt.xlabel("AvgTemperature")
plt.ylabel("Count")
plt.show()

#boxplot
plt.figure(figsize=(4,5))
plt.boxplot(df["AvgTemperature"], vert=True)
plt.title("Boxplot")
plt.ylabel("AvgTemperature")
plt.show()

#kategorizacija
top_k = 15

vc_country = df["Country"].value_counts().head(top_k)
plt.figure(figsize=(8,4))
plt.bar(vc_country.index.astype(str), vc_country.values)
plt.title("Top",top_k,"zemalja po broju zapisa")
plt.xticks(rotation=45, ha="right")
plt.tight_layout(); plt.show()

##korelacije i scatter plot

#izdvajaju se numericke iz df
num_df = df[["AvgTemperature", "Month", "Year"]]
#pa se pravi korelaciona matrica
corr = num_df.corr(method="pearson")

#pa se bkv pravi prikaz korelacione matrice
plt.figure(figsize=(6,4))
sb.heatmap(corr, annot=True, fmt=".3f", cmap="vlag", square=True)
plt.title("Corr")
plt.tight_layout()
plt.show()

#scatter plot
#grupise se po regionu (kontinentu) i mesecu
g_rm = df.groupby(["Region","Month"], as_index=False)["AvgTemperature"].mean()

#pravi se pivot od te grupe, bitno je
pivot = g_rm.pivot(index="Month", columns="Region", values="AvgTemperature")
print(pivot) #display na jupyteru

#izdvajanje evrope i aus
g_eu = pivot["Europe"]
g_au = pivot["Australia/South Pacific"]

corr_value = g_eu.corr(g_au)
print("Korelacija (Evropa i Australija):", corr_value)

plt.figure(figsize=(10,5))
plt.scatter(g_eu, g_au, marker="o")
plt.title("AvgTemperature za Evropu i Australiju po mesecima")
plt.xlabel("AvgTemp Evropa"); plt.ylabel("AvgTemp Australija")
plt.xlim([min(min(g_eu),min(g_au))-10,max(g_eu)+10]), plt.ylim([min(min(g_eu),min(g_au))-10,max(g_au)+10])
plt.tight_layout()
plt.show()