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()