<jupyter_start><jupyter_text>EDAQuesto notebook verrà usato per l'exploratory data analysis non comprensiva di machine learning<jupyter_code>import numpy as np
import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
import seaborn as sns

#Per usare multi cartelle (cookiecutter)
import sys
sys.path.append('./../src')

import make_dataset as m_d
import EDA

sns.set_style('darkgrid')
sns.set_context("notebook", font_scale=2.5, rc={"lines.linewidth": 2.5})
sns.set(rc={'figure.figsize':(7,6)})


### Per usare multi cartelle (cookiecutter)
#import sys
#sys.path.append('./../src')
#print(sys.path)
#Importiamo il database dei tweets

df=pd.read_csv(m_d.data_path_out / 'twitter_final.csv')
temperature_D=EDA.tempDistrib()

#col_list = list(df)
#col_list[6], col_list[5] = col_list[5], col_list[6]
#df.plot('municipal')
df<jupyter_output><empty_output><jupyter_text>Plots<jupyter_code>#Plot occurences versus tempo
plt.figure(figsize = (18,5))
sns.histplot(data=df, x="hours", bins=48)
plt.show()

#Vista la ciclicità del notte-giorno, l'histogram vien molto brutto; andiam di Nightingale
"""
NightP=EDA.Nightingale_Plot(df["hours"])
NightP.render_notebook()
#Per qualche ragione servon librerie oscure
"""


#Risultato ovvio: la gente twitta meno di notte che di giorno, verso la sera sembra essere il momento preferito
#Non si indivuidano fasce più piccole rispetto a quelle date
    #e il generale limite di dati impedisce l'individuazione appropriata di fasce piccole

from IPython.display import Image
Image(filename='NightGraph.png') 
#Lo lascio come immagine così non serve avere la libreria 

plt.figure(figsize = (18,5))
sns.histplot(data=df[df["month"]==11], x="day", bins=30, color="#FF0000")
sns.histplot(data=df[df["month"]==12], x="day", bins=31, color="#0000FF")
plt.show()
#Nota: noiosi da disjointare in maniera sensata

#Risultato: a gente twitta di più a Dicembre, soprattutto verso la fine (periodo di vacanze)
plt.figure(figsize = (18,5))


temp=[]


for i in df.iterrows():
    if(True and i[1]["hours"]<3.9):  #Mettere false per avere split a mezzanotte
        temp.append( m_d.Wday(i[1]["month"], i[1]["day"]-1) ) #Questo -1 è safe
    else:
        temp.append( m_d.Wday(i[1]["month"], i[1]["day"]) )
order=["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"]
temp=order+temp  #Utile per sortare
#A far bene toglierei 1 da ogni bin ma è chiaro che non sia importante

sns.histplot(data=temp, bins=30, color="#FF0000" )
plt.show()<jupyter_output><empty_output><jupyter_text>**Risultato:** questo è interessante: la gente twitta in maniera piuttosto costante MA:1) all'inizio della settimana lavorativa twitta di più verso la fine della settimana lavorativa \2) nel weekend la gente tende a twittare di più \3) se correggo per i tweets dopo mezzanotte (li considero come giorno prima, e sono molto rilevanti) il lunedì subisce un serio hit (la domenica notte è molto quotata come periodo di tweet) ma rimane comunque sopra al sabato<jupyter_code>#Plot occurences versus temperatura
#Plotto anche la distribuzione temporale della temperatura
plt.figure(figsize = (18,5))

ax=sns.violinplot(data=temperature_D, color="#0000FF", orient='h')
ax=sns.violinplot(data=df, x="temperature", color="#FF0000")

plt.figure(figsize = (18,5))

ax=sns.violinplot(data=df, x="temperature", color="#FF0000")
ax=sns.violinplot(data=temperature_D, color="#0000FF", orient='h')

plt.show()
#Qua violin funziona meglio, distribuzioni più continue
#Nota: non so fare un plot del genere meglio di così (seaborn è buono per analisi base) quindi rip
    #Ho provato scale, alpha niente da fixare<jupyter_output><empty_output><jupyter_text>**Risultato:** in prima approssimazione la distribuzione dei tweets segue la distribuzione temporale di temperatura (e quindi la gente twitta indipendentemente dalla temperatura). In realtà si nota che per temperature molto basse la gente tende a twittare poco (ricompare nell'anticorrelazione lineare, vedi sotto) mentre a temperatura alte twitta un po' di più. Degno di nota è il fatto che a circa 1° la gente twitta particolarmente tanto, magari sintomo di un tweet alla prima nevicata, ma con i dati sulle precipitazioni che non discriminano tra tipo di precipitazione è difficile trarre conclusioni certe<jupyter_code>#Plot occurences versus rain
plt.figure(figsize = (18,5))
sns.violinplot(data=df, x="rain", color="#FF0000")
plt.show()

#Same as before, nella maggioranza dei casi la rain è 0, quindi gli unici casi rilevanti numericamente son quelli
plt.figure(figsize = (18,5))
sns.histplot(data=df, x="language", bins=31, color="#0000FF")
plt.show()

#Italiano domina seguito da inglese, niente di strano
#Interessante sono i pochi tedeschi, ma per tardo autunno non è molto sorprendente
#Importiamo ora la grid
grid=m_d.safe_import("grid")

temp=[]
for i in range (0, len(grid)):
    temp.append( (grid.loc[i]["cellId"]==df["cellId"]).sum() )    
grid["Ntweets"]=temp

temp=[]
for i in range (0, len(grid)):
    temp.append( grid.loc[i]["Ntweets"]**0.07 )
grid["TweetsWeigh"]=temp
#Nota: questo plot lo devo creare pesando il numero di tweets in maniera diversa
#(Converto con distribuzione x^0.07) altrimenti il grafico rimane nero

grid.plot("TweetsWeigh")

#Distribuzione prevedibile, still è un bel plot
fig=plt.figure(figsize = (18,5))
ax = fig.add_subplot(111)
pl=sns.histplot(data=df, x="municipal", bins=31, color="#0000FF")
plt.xticks(rotation=90)
plt.show()
#far la figura più lunga la restringe wtf
#odio ufficialmente seaborne

#Trento domina nettamente, as axpected<jupyter_output><empty_output><jupyter_text>Tweets databaseTracciamo un po di correlazioni all'interno del database inteso per il machine learningLa matrice suggerisce che le relazioni lineari esistono tra numero di tweets di giorni successivi, e temperature medie, almeno in prima battuta (elettricità sarebbe il livello dopo). Visto che abbiam pochi dati restringersi a questo subset di features è probabilmente saggio (meglio aggiungere anche il giorno settimanale, che come abbiam visto influenza molto il numero di tweets)<jupyter_code>df=pd.read_csv(m_d.data_path_out / 'MachineLearningDB.csv')
correlations=df.corr(method='pearson', min_periods=1)
features=list(df.keys())
del features[-3]  #Rimuovo weekday

fig = plt.figure(figsize = (16,16))
ax = fig.add_subplot(111)

cax=ax.matshow(correlations)
fig.colorbar(cax)
ticks = np.arange(0,len(features),1)
ax.set_xticks(ticks)
ax.set_yticks(ticks)

ax.set_xticklabels(features,rotation=45)
ax.set_yticklabels(features)
plt.show()

correlations
cond = (correlations[features[0:22]] > 0.85) & (correlations[features[0:22]] != 1)
correlations_85 = correlations[cond]
correlations_85 = correlations_85.stack()
print('Le features che correlano maggiormente tra di loro sono le seguenti: \n',correlations_85)<jupyter_output>Le features che correlano maggiormente tra di loro sono le seguenti: 
 Tweet1m    Tweet2m      0.855387
           TargetDay    0.867927
Tweet2m    Tweet1m      0.855387
Tavg1m     Tavg1n       0.863198
Tavg2m     Tavg2n       0.871596
Rainmax1m  Rainavg1m    0.886962
Rainmax2m  Rainavg2m    0.886973
Rainavg1m  Rainmax1m    0.886962
           Rainmax1n    0.886962
Rainavg2m  Rainmax2m    0.886973
           Rainmax2n    0.886973
Electro2m  Electro2n    0.854468
Tavg1n     Tavg1m       0.863198
Tavg2n     Tavg2m       0.871596
Rainmax1n  Rainavg1m    0.886962
Rainmax2n  Rainavg2m    0.886973
Electro2n  Electro2m    0.854468
TargetDay  Tweet1m      0.867927
dtype: float64
{'fraction_non_alphanumeric': 0.10812975570684821, 'fraction_numerical': 0.041116005873715125, 'mean_word_length': 5.436426116838488, 'pattern_counts': {'":': 1, '<': 21, '<?xml version=': 0, '>': 21, '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': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '299479', 'license': 'FTL', 'n_tokens_mistral': 2955, 'n_tokens_neox': 2770, 'n_words': 791, 'path': 'Submit/notebooks/EDA.ipynb', 'repo_name': 'devix2/IntroToDS_FinalProject', 'size': '7491'}