import pandas as pan #pour les donnÃ©es :gestion des data.frame
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats.mstats as ms

   
   ################### Exercice 1 #########################
df=pan.read_csv("http://math.univ-lyon1.fr/homes-www/dabrowski/nutriage.csv",sep="\t")

df=pan.read_csv("https://math.univ-lyon1.fr/~dabrowski/nutriage.csv",sep="\t")


#1
#the  cafe : quantitatives discrètes
#taille, poids, age quantitatives continues
#sexe, viande, poisson, matgras : qualitatives (les trois dernières ont un ordre "naturel",
# on dit qu'elles sont ordinales)

#2
df['sexe']=df['sexe'].astype('category')

#Pour ne pas se tromper on regarde l'ordre des classes
df['sexe'].cat.categories

df['sexe'].cat.categories=["Femme","Homme"]
# si Python > 3.11.5, utiliser à la place: 
df['sexe'].cat.rename_categories(["Femme","Homme"])

type1=pan.CategoricalDType(categories=["Femme","Homme"],ordered=False)
df['sexe']=df['sexe'].astype(type1)

#Poisson
df['poisson']=df['poisson'].astype('category')
df['poisson'].cat.categories

freq=["jamais","<1/sem.","1/sem.","2-3/sem.","4-6/sem.","1/jour"] #on crée une liste avec les noms de niveaux
df['poisson'].cat.categories=freq #on change les noms

#Autre solution où on indique aussi à Pandas qu'il y a un ordre
freq_type=pan.CategoricalDtype(categories=freq, ordered=True)
df['poisson'].cat.categories=freq #on change les noms
df['poisson']=df['viande'].astype(freq_type)#on passe au type ordonné

#viande
df['viande']=df['viande'].astype('category')  
df['viande'].cat.categories
df['viande'].cat.categories=freq #on change les noms
df['viande']=df['viande'].astype(freq_type)#on passe au type ordonné



#matières grasses
df['matgras']=df['matgras'].astype('category')  
ListeMatGras=["beurre","margarine","arachide","tournesol","olive","Melange","colza","canard"]
df['matgras'].cat.categories=ListeMatGras



#3

df['taille']=df['taille'].astype('float64')
df['poids']=df['poids'].astype('float64')
df['age']=df['age'].astype('float64')
    
#Verification
df.dtypes
print(df["viande"])
print(df)
 ###################Exercice 2#########################

help(pan.crosstab)

#1
table=pan.crosstab(df["sexe"],df["matgras"])
print(table)
#47 femmes de l'échantillon utilisaient de l'huile de Tournesol

#2
tableFreq=pan.crosstab(df["sexe"],df["matgras"], normalize=True,margins=True)
print(tableFreq)
tableFreq.iloc[2,0:8]
tableFreq.iloc[2,3]#le tournesol est consommé par 30.09% des personnes intérrogées

###Autre solution 1
tableMG=pan.crosstab(df["matgras"],columns="Choix de Matières Grasses", normalize=True)
print(tableMG)
tableMG.iloc[3]
###Autre solution 2
tableMG=df["matgras"].value_counts(sort=False)/226
print(tableMG)
tableMG['tournesol']

plt.pie(tableMG.iloc[0:9])


#3

#Solution de base
plt.pie(df["matgras"].value_counts(sort=False))

#Solution améliorée
fig1, ax1 = plt.subplots()
col=["#0099FF", "#33FF99","#FF9900", "#9900FF", "#99FF33","#FF3399","#000000", "#9933FF"]
ax1.pie(df["matgras"].value_counts(sort=False), labels=df['matgras'].cat.categories,colors=col)
fig1.suptitle('Diagramme circulaire de matgras')
plt.show(ax1)


#4 


#Solution de base

tV=df["viande"].value_counts()/226
plt.bar(tV.index,tV)

#solution améliorée
tableViande=pan.crosstab(index=df["viande"],columns="Consommation de Viande",normalize=True)
tableViande.plot.bar()



#5
plt.plot(tableViande.index,np.cumsum(tableViande),color='b')

#Alternative:
plt.plot(tableViande.index,tableViande.cumsum(),color='b')




#6
tableViande=pan.crosstab(index = df["viande"],columns ="freq",normalize=True)
l=len(tableViande);x = np.arange(l);w=0.7
fig, ax = plt.subplots();ax.set_ylim(0,0.4)
ax.bar(x,np.reshape(tableViande.values,l), width=w,
color=col)
ax2=ax.twinx()
ax2.tick_params(axis='y', labelcolor='b')
ax2.set_ylim(0,1)
ax2.plot(x,tableViande.cumsum(),color='b')
fig.suptitle("Diagramme en tuyau d’orgue et fonction de répartition de viande")
ax.set_xticks(x)
ax.set_xticklabels(tableViande.index)
ax.legend(frameon=False)

###################Exercice 3#########################
#1
tableCafe=pan.crosstab(index=df["cafe"],columns="freq",normalize=True).cumsum()


tableCafe.plot.bar(width=0.05)


#2
tableThe=pan.crosstab(index = df["the"],columns="freq",normalize=True).cumsum()

xThe = np.array([-1,*(tableThe.index)])#abcisses aux valeurs et -1
val=np.reshape(tableThe.values,len(tableThe))#valeurs des fréquences cumulées

figThe, axThe = plt.subplots();
axThe.step(xThe,np.array([0,*val]), where='post', color="#556b2f")#trace le diagramme en escalier en ajoutant un point de départ à valeur 0 
#facultatif :
axThe.plot(tableThe.index, val, 'C2o', alpha=0.5)#trace les points de sauts
axThe.set_xticks(xThe)#les valeurs des sauts en abscisse

#3

plotPoids=df["poids"].plot.hist(title='Histogramme de poids')
plt.show(plotPoids)

#4
figAge, axAge = plt.subplots()
axAge.hist(df["age"],[*(65+np.arange(10)*2),90,92], color=col[2],rwidth=0.95,density=True)

###################### Supplément: on peut aussi illustrer l'ajout d'une barre au niveau de la moyenne
figAge, axAge = plt.subplots()
axAge.hist(df["age"],[*(65+np.arange(10)*2),90,92], color=col[2],rwidth=0.95,density=True)
ax2=axAge.twinx()
ax2.bar(np.mean(df["age"]),0.08,color='blue',width=.2)
axAge.set_ylabel('Densité')
figAge.suptitle("Histogramme de la variable age avec Moyenne (en bleu)")
np.mean(df["age"])

#5
plt.plot(df["taille"],df["poids"],'b.')

#solution avec ajout
fig, ax = plt.subplots()
ax.plot(df["taille"],df["poids"],'b.')
ax.set_ylabel("poids")
ax.set_xlabel("taille")
fig.suptitle("Nuage de Points de la taille en fonction de l'âge")


#6
box=df.boxplot(column=['age','poids','taille'])
box.set_title('Diagramme à moustache de age, poids et taille')
plt.show(box)



box2=df.boxplot(column=['the','cafe'])
box2.set_title('Diagramme à moustache des consommations de Thé et Café')
plt.show(box2)
#La consommation de thé a beaucoup de valeurs extrêmes, une écrasante majorité ne consomme jamais de thé et la presque totalité au plus 1 ou 2, d'où une très forte assymétrie de la Moustache
#La consommation de Cafe est beaucoup typique et similaire à celle des variables continues avec peu de valeurs extrêmes.
#En tout cas, le diagramme à moustache suffit à montrer que les deux consommations sont qualitativement très différentes.

###################Exercice 4#########################


#1

x=np.array([1,8,5,1])

#2
y=np.concatenate(([0],1+2*np.array(range(5))))
y=np.concatenate(([0],[i for i in range(10) if i%2==1]))
y=np.concatenate(([0],range(1,10,2))) 

#3
y[2]
y[2:4]
y[-2]#7
y[y<=5]

#4
y[2*np.array(range(3))]
#ou 
y[2*np.arange(3)]
y[y>=1]

#5
y[y>0]#on triche vu que les valeurs y>0 correspondent à x>0
y[1:]


#6
X=np.repeat(x.reshape(1,4),25,axis=0).reshape(100)

np.reshape(np.repeat(x.reshape(1,4),25,axis=0),100)
#Attention: Les commandes suivantes ne donnent PAS ce qu'on demande:
  np.repeat(x,25)#1er essai:mauvais sens

 


