Sunteți pe pagina 1din 13

Seminar 1 Python

Pandas

Seminar 1

Scop:
- Prelucrari statistice, functii de grup
- Modalitati de grupare groupby si agregare agg a datelor
- Prelucrare seturi de date cu concat si merge
- Exemplificare tipuri de jonctiuni. Jonctiuni cu mai multe seturi de date
- Reprezentari grafice matplotlib
- DataFrame.pivot_table()
- DataFrame.pivot(), DateFrame.melt(), DataFrame.transpose()
- Modalitati de selectie df.coloana, df.loc, df.iloc, query
- Prelucrare dataframe, transformari

Seturi de date:
clienti_leasing.csv
clienti_daune.csv
loadprofile.csv
https://gist.githubusercontent.com/alexdebrie/b3f40efc3dd7664df5a20f5eee85e854/raw/ee3
e6feccba2464cbbc2e185fb17961c53d2a7f5/stocks.csv
https://goo.gl/ioc2Td
http://bit.ly/2cLzoxH

Cerințe: rezolvare probleme similare (vezi pag. 13)

 Prelucrări statistice, funcții de grup, gruparea și agregarea datalor în pachetul pandas

Exemplu 1. Prelucrări statistice simple


import pandas as pd
df = pd.read_csv('clienti_leasing.csv')
pd.set_option("display.max_columns",30)
print(df.head(5))
print('Numarul de clienti')
print(df['ID_CLIENT'].count())
print('Venit maxim')
print(df['VENIT_PER_YEAR'].max())
print('Suma venitului maxim pentru persoanele de sex masculin')
print(df['VENIT_PER_YEAR'][df['SEX'] == 'm'].sum())
print('Numarul valorilor distincte din coloana starea civila')
print(df['MARITAL_STATUS'].value_counts())
print('Numarul total de valori distincte din coloana starea
civila')
print(df['MARITAL_STATUS'].nunique())

Exemplu 2. Statistici descriptive în funcție de tipul coloanei cu describe()


import pandas as pd
df = pd.read_csv('clienti_leasing.csv')
pd.set_option("display.max_columns",30)
print('Statistici descriptive')
print(df['JOB'].describe())
print(df['VENIT_PER_YEAR'].describe())

Exemplu 3. Posibilități grupare


import pandas as pd
Seminar 1 Python
Pandas

df = pd.read_csv('clienti_leasing.csv')
pd.set_option("display.max_columns",30)
print(df.head)
print(df.groupby(['PRESCORING']).groups.keys())
print(len(df.groupby(['PRESCORING']).groups[6]))
print(df.groupby(['CURRENCY']).groups.keys())
print(len(df.groupby(['CURRENCY']).groups['ROL']))

Exemplu 4. Funcțiile max(), min(), mean(), first(), last() pot fi utilizate cu GroupBy
import pandas as pd
df = pd.read_csv('clienti_leasing.csv')
pd.set_option("display.max_columns",30)
df['DATA'] = pd.to_datetime(df['DATA'])
df['MONTH'] = pd.DatetimeIndex(df['DATA']).month
print('Prima inregistrare din coloana CURRENCY pe valori
distincte')
print(df.groupby('CURRENCY').first())
print('Venitul anual insumat pentru fiecare luna')
print(df.groupby(pd.DatetimeIndex(df['DATA']).month)
['VENIT_PER_YEAR'].sum())
print('Valoarea insumata a depozitului pentru ingineri pe sexe')
print(df[df['JOB'] == 'Inginer'].groupby('SEX')
['VENIT_PER_YEAR'].sum())

Exemplu 5. Grupări complexe


import pandas as pd
df = pd.read_csv('clienti_daune.csv')
pd.options.display.max_rows = 999
print('Numarul de marci pentru fiecare tara producatoare')
print(df.groupby(['TARAPRODUCATOR', 'MARCA'])['MARCA'].count())

Exemplu 6. Gruparea și agregarea datelor


import pandas as pd
df = pd.read_csv('clienti_daune.csv')
pd.options.display.max_rows = 999
print(df.groupby(['TARAPRODUCATOR','MARCA']).agg({'VALOARE_DAUNA':
sum, 'ID_CLIENT': "count", 'MODEL': 'first'}))
df1 =
df.groupby(['TARAPRODUCATOR','MARCA']).agg({'VALOARE_DAUNA':sum,
'ID_CLIENT': "count", 'MODEL': 'first'})
df1.to_csv('agregare.csv')

Exemplu 7. Aplicarea unor funcții multiple unei singure coloane din grup
import pandas as pd
df = pd.read_csv('clienti_daune.csv')
df['DATA_CERERE'] = pd.to_datetime(df['DATA_CERERE'])
print(df.groupby(['TARAPRODUCATOR',
'MARCA']).agg({'PRET_MANOPERA': [min, max, sum], 'MODEL': "count",
'DATA_CERERE': [min, 'first', 'nunique']}))
Seminar 1 Python
Pandas

Exemplu 8. Sortarea rezultatelor dupa aplicarea unor funcții multiple


import pandas as pd
df = pd.read_csv('clienti_daune.csv')
df = df.loc[:,["TARAPRODUCATOR","PRET_MANOPERA"]]
grouped_df = df.groupby('TARAPRODUCATOR').agg({'PRET_MANOPERA':
['min','max','mean']})
grouped_df.columns = ['_'.join(col).strip() for col in
grouped_df.columns.values]
grouped_df =
grouped_df.reset_index().sort_values(by="PRET_MANOPERA_max",
ascending=False)
print(grouped_df)

 Prelucrarea seturilor de date cu concat, merge / join dataframes


Concat – lipire seturi cu continut similar pe verticala sau pe orizontala
pd.concat([df_a, df_b])
pd.concat([df_a, df_b], axis=1)

Vom utiliza fișierele .csv – clienti_leasing, clienti_daune, având o coloană comună (id_client),

Exemplu 9. Inner merge sau inner join


import pandas as pd
pd.options.display.max_columns = 10
df = pd.read_csv('clienti_leasing.csv')
df1 = pd.read_csv('clienti_daune.csv')
result = pd.merge(df[['ID_CLIENT','NUME_CLIENT', 'PROFESIA',
'SEX','VENIT_ANUAL', 'VARSTA']],
df1[['ID_CLIENT', 'MARCA', 'PRET_MANOPERA',
'VALOARE_DAUNA']],
on='ID_CLIENT')
print(result)
print('Structura fisier clienti_leasing.csv', df.shape)
print('Structura fisier clienti_daune.csv', df1.shape)
print(df['ID_CLIENT'].isin(df1['ID_CLIENT']).value_counts())

Exemplu 10. Data analytics pe clienti si daune


import pandas as pd
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
df = pd.read_csv('clienti_leasing.csv')
df1 = pd.read_csv('clienti_daune.csv')
result = pd.merge(df[['ID_CLIENT','NUME_CLIENT', 'PROFESIA',
'SEX','VENIT_ANUAL', 'VARSTA']],
df1[['ID_CLIENT', 'VIN','MARCA',
'PRET_MANOPERA', 'VALOARE_DAUNA']],
on='ID_CLIENT')
print('Grupare dupa Id_client si Marca, calcul min, max, suma
pentru Valoare_dauna si numar daune (VIN)')
print(result.groupby(['ID_CLIENT', 'MARCA']).agg({'VALOARE_DAUNA':
[min, max, sum], 'VIN': "count"}))
print('===========================================================
==============================')
Seminar 1 Python
Pandas

print('Afisam primele 5 marci cu cele mai multe daune')


print(result.groupby(['MARCA'])
['VALOARE_DAUNA'].count().nlargest(5))
print(result.groupby(['MARCA'])
['VALOARE_DAUNA'].size().nlargest(5))
print('===========================================================
==============================')
print('Afisam primii 15 clienti cu cele mai multe daune')
print(result.groupby(['ID_CLIENT'])['VIN'].count().nlargest(15))
print('===========================================================
==============================')
print('Afisam primii 15 clienti cu cea mai mare valoare totala a
daunelor')
print(result.groupby(['ID_CLIENT'])
['VALOARE_DAUNA'].sum().nlargest(15))
print('===========================================================
==============================')
print('Grupam dupa Id_client si agregam coloanele numerice pentru
primii 5 clienti')
group = result.groupby('ID_CLIENT')
print(group.agg(['count', 'min', 'max', 'std', 'mean']).head())
print('===========================================================
==============================')

Exemplu 11. Alte grupări (1)


import pandas as pd
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
df = pd.read_csv('clienti_daune.csv')
print('Grupare dupa MARCA, pentru fiecare marca afisam nr de
modele')
print(df.groupby("MARCA")['MODEL'].count())
print("========================================")
print('Grupare dupa MARCA, pentru fiecare marca afisam nr de
modele unice')
print(df.groupby("MARCA")['MODEL'].nunique())
print("========================================")
print('Afisam primele 5 marci cu cele mai multe modele')
print(df.groupby(['MARCA'])['MODEL'].count().nlargest(5))
print("========================================")
print('Grupare dupa MARCA, pentru fiecare marca afisam toate
modelele')
print(df.groupby(["MARCA"])['MODEL'].apply(lambda x: ','.join(x)))
print("========================================")

Exemplu 12. Alte grupări (2)


import pandas as pd
df = pd.read_csv('clienti_daune.csv')
df = df.loc[:,["TARAPRODUCATOR","PRET_MANOPERA"]]
df=df.groupby('TARAPRODUCATOR')['PRET_MANOPERA'].apply(lambda
group_series: group_series.tolist()).reset_index()
print(df)
print('=====================================')
for i in range (0,3):
Seminar 1 Python
Pandas

lista=[]
y=0
for l in df.iloc[i,1]:
if l > 500:
lista.append(l)
y=y+1
print(lista)
print('In ' + str(df.iloc[i,0]) +' sunt peste ' + str(y) + '
preturi mai mari decat 500')
print('=====================================')

Exemplu 13. Alte grupări (3)


import pandas as pd
df = pd.read_csv('clienti_daune.csv')
df = pd.read_csv('clienti_daune.csv')
df = df.loc[:,["MARCA","VALOARE_DAUNA"]]

grouped_df = df.groupby('MARCA')

# you get can a dataframe containing the values for a single group
# using .get_group('group_key')
print(grouped_df.get_group('AUDI'))

Exemplu 14. Left merge sau left join


import pandas as pd
pd.options.display.max_columns = 10
df = pd.read_csv('clienti_leasing.csv')
df1 = pd.read_csv('clienti_daune.csv')
result = pd.merge(df[['ID_CLIENT','NUME_CLIENT', 'PROFESIA',
'SEX','VENIT_ANUAL', 'VARSTA']],
df1[['ID_CLIENT', 'MARCA', 'PRET_MANOPERA',
'VALOARE_DAUNA']],
on='ID_CLIENT',
how='left')
print(result)
print(result.shape)
print('Structura fisier clienti_leasing.csv', df.shape)
print('Structura fisier clienti_daune.csv', df1.shape)
print(df['ID_CLIENT'].isin(df1['ID_CLIENT']).value_counts())

Exemplu 15. Right merge sau right join


import pandas as pd
pd.options.display.max_columns = 10
df = pd.read_csv('clienti_leasing.csv')
df1 = pd.read_csv('clienti_daune.csv')
result = pd.merge(df[['ID_CLIENT','NUME_CLIENT', 'PROFESIA',
'SEX','VENIT_ANUAL', 'VARSTA']],
df1[['ID_CLIENT', 'MARCA', 'PRET_MANOPERA',
'VALOARE_DAUNA']],
on='ID_CLIENT',
how='right')
print(result)
print(result.shape)
Seminar 1 Python
Pandas

print('Structura fisier clienti_leasing.csv', df.shape)


print('Structura fisier clienti_daune.csv', df1.shape)
print(df['ID_CLIENT'].isin(df1['ID_CLIENT']).value_counts())

Exemplu 16. Full outer merge sau full outer join


import pandas as pd
pd.options.display.max_columns = 10
df = pd.read_csv('clienti_leasing.csv')
df1 = pd.read_csv('clienti_daune.csv')
result = pd.merge(df[['ID_CLIENT','NUME_CLIENT', 'PROFESIA',
'SEX','VENIT_ANUAL', 'VARSTA']],
df1[['ID_CLIENT', 'MARCA', 'PRET_MANOPERA',
'VALOARE_DAUNA']],
on='ID_CLIENT',
how='outer')
print(result)
print(result.shape)
print('Structura fisier clienti_leasing.csv', df.shape)
print('Structura fisier clienti_daune.csv', df1.shape)
print(df['ID_CLIENT'].isin(df1['ID_CLIENT']).value_counts())

Exemplu 17. Full outer merge sau full outer join cu indicația _merge
import pandas as pd
pd.options.display.max_columns = 10
df = pd.read_csv('clienti_leasing.csv')
df1 = pd.read_csv('clienti_daune.csv')
result = pd.merge(df[['ID_CLIENT','NUME_CLIENT', 'PROFESIA',
'SEX','VENIT_ANUAL', 'VARSTA']],
df1[['ID_CLIENT', 'MARCA', 'PRET_MANOPERA',
'VALOARE_DAUNA']],
on='ID_CLIENT',
how='outer',
indicator=True)
print(result)
print(result.shape)
print('Structura fisier clienti_leasing.csv', df.shape)
print('Structura fisier clienti_daune.csv', df1.shape)
print(df['ID_CLIENT'].isin(df1['ID_CLIENT']).value_counts())

Exemplu 18. Merge utilizând trei seturi de date


import pandas as pd
df = pd.read_csv('clienti_leasing.csv')
df1 = pd.read_csv('clienti_daune.csv')
df2 = pd.read_csv('cars.csv')
result = pd.merge(df[['ID_CLIENT','NUME_CLIENT', 'PROFESIA',
'SEX','VENIT_ANUAL', 'VARSTA']],
df1[['ID_CLIENT', 'MARCA', 'PRET_MANOPERA',
'VALOARE_DAUNA']],
on='ID_CLIENT',
how='outer')
df2.rename(columns={"Motor": "CAPACITATE_MOTOR"}, inplace=True)
Seminar 1 Python
Pandas

result = pd.merge(result[['ID_CLIENT','NUME_CLIENT', 'MARCA']],


df2,
left_on='MARCA',
right_on='MARCA_CARS',
how='left')
print(result)
print(result.shape)

Exemplu 19. Groupby și agg utilizând setul rezultat


import pandas as pd
pd.set_option('display.max_columns', 10)
df = pd.read_csv('clienti_leasing.csv')
df1 = pd.read_csv('clienti_daune.csv')

result = pd.merge(df[['ID_CLIENT','NUME_CLIENT', 'PROFESIA',


'SEX','VENIT_ANUAL', 'VARSTA']],
df1[['ID_CLIENT', 'MARCA',
'MODEL','DATA_CERERE', 'PRET_MANOPERA',
'OPERATII_REALIZATE','VALOARE_DAUNA']],
on='ID_CLIENT',
how='outer')
print(result.groupby(["ID_CLIENT","MARCA", "MODEL"]).agg({
"PRET_MANOPERA": [sum,"mean"],
"VALOARE_DAUNA": [sum,"mean"],
"OPERATII_REALIZATE": "count"
}))
result['DATA_CERERE'] = pd.to_datetime(result['DATA_CERERE'])
result['MONTH'] = pd.DatetimeIndex(result['DATA_CERERE']).month
result['YEAR'] = pd.DatetimeIndex(result['DATA_CERERE']).year
print(result.groupby(["YEAR","MONTH"]).agg({
"PRET_MANOPERA": [sum,"mean"],
"VALOARE_DAUNA": [sum,"mean"],
"OPERATII_REALIZATE": "count"
}))

Exemplu 20. Grafic cu gruparea și sortarea datelor cu matplotlib.pyplot


import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('clienti_leasing.csv')
plot_data=df[df['SEX']=='m']
plot_data=plot_data.groupby('PROFESIA')['VENIT_ANUAL'].sum()
plot_data.sort_values().plot(kind='bar', color = 'lightpink')
plt.show()
Seminar 1 Python
Pandas

Exemplu 21. Reprezentare grafică cu bare cu matplotlib.pyplot


import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import cm
pd.set_option("display.max_columns",10)
df = pd.read_csv('clienti_leasing20.csv')
print(df['AGE'])
#all_colors = list(plt.cm.colors.cnames.keys())
colors = cm.hsv( df['AGE']/ float(max(df['AGE'])))
df['AGE'].plot(kind='bar',color=colors)
plt.xlabel('ID_CLIENT')
plt.ylabel('AGE')
plt.show()

Exemplu 22. Reprezentare grafică cu bare cu error bars


import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('clienti_daune.csv')
df = df.loc[:,["FURNIZOR","PRET_MANOPERA"]]

plt.clf()
Seminar 1 Python
Pandas

ax = plt.gca()

# plot the means


df.groupby('FURNIZOR').mean().plot(kind='bar',color='lightblue',ax
=ax)

# generate a dataframe with means and standard deviations


grouped_df=df.groupby('FURNIZOR').agg(["mean","std"])

# flatten column names


grouped_df.columns = ['_'.join(col).strip() for col in
grouped_df.columns.values]

for i,(index,row) in enumerate(grouped_df.iterrows()):


name = row.name
mean = row['PRET_MANOPERA_mean']
stddev = row['PRET_MANOPERA_std']

# plot the vertical line for this group


ax.vlines(x=i,ymin=mean-stddev,ymax=mean+stddev)

plt.show()
print("The average PRET_MANOPERA for each FURNIZOR. The black bars
shows how different, on average, prices are from the average in
that group")
print("This helps people understand if the average can be trusted
as a good summary of the data or variance is too high.")
Seminar 1 Python
Pandas

pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean',


fill_value=None, margins=False, dropna=True, margins_name='All', observed=False) → 'DataFrame

Sursa: https://pbpython.com/pandas-pivot-table-explained.html

vs.

pandas.pivot(data, index=None, columns=None, values=None) → 'DataFrame'

pandas.melt(data, id_vars=None, value_vars=None, var_name=None, value_name='value',


col_level=None) → 'DataFrame'

Sursa: https://cmdlinetips.com/2019/06/reshaping-dataframes-with-pandas-melt-and-wide_to_long/

Exemplu 23: DataFrame.pivot_table


import pandas as pd
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
Seminar 1 Python
Pandas

df = pd.read_csv('clienti_daune.csv')

print(pd.pivot_table(df, values='VALOARE_DAUNA',
index=["REGIUNEPRODUCATOR"],columns=['AN_FABRICATIE'],aggfunc=[sum
,max],margins = True))

Exemplu 24: DataFrame.pivot


import pandas as pd
stocks =
pd.read_csv('https://gist.githubusercontent.com/alexdebrie/b3f40ef
c3dd7664df5a20f5eee85e854/raw/ee3e6feccba2464cbbc2e185fb17961c53d2
a7f5/stocks.csv')
print(stocks)
stocks_p=stocks.pivot(index='symbol', columns='date',
values=['volume','close'])
print(stocks_p)
Combinatia dintre index si columns trebuie sa fie unica! Pivot functioneaza cu un singur index, altfel
utilizam pivot_tabel!

Exemplu 25: Melt si Pivot (1)


import pandas as pd
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)

df = pd.read_csv('clienti_leasing20.csv')

df_melted = pd.melt(df, id_vars=["ID_CLIENT"],


value_vars=["NAME_CLIENT", "JOB"], var_name="Attribute",
value_name="Value")

print(df_melted)

df_unmelted = df_melted.pivot(index='ID_CLIENT',
columns='Attribute').reset_index()

print(df_unmelted)

Exemplu 26: Melt si Pivot (2)


import pandas as pd
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
df = pd.read_csv("loadprofile.csv")
df_melt = df.melt(id_vars="meterID", var_name="Hour")
#print(df1_melt)
df_pt= pd.pivot_table(df_melt, values="value",
index=["meterID","Hour"], columns=None, aggfunc='mean',
margins=True, margins_name='All')
print(df_pt)

Exemplu 27: DataFrame.melt


import pandas as pd
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
Seminar 1 Python
Pandas

data_url = "https://goo.gl/ioc2Td"
df = pd.read_csv(data_url)
print(df.shape)
lifeExp = df.loc[:, df.columns.str.contains('^life|^c')]
print(lifeExp.shape)
print(lifeExp.head(3))
lifeExp_melt = lifeExp.melt(id_vars=["continent", "country"],
var_name="year",
value_name="lifeExp")
print("==============================================")
print(lifeExp_melt)

Exemplu 28: DataFrame.Transpose()


import pandas as pd
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
df = pd.read_csv("loadprofile.csv")
df_p = df.drop(columns
=['recommended','Residential_tariff_allocation'], axis=1)
df_t = df_p.T
print(df_t)

Exemplu 29. Prelucrare DataFrame


pd.set_option("display.max_columns",40)
pd.set_option("display.max_rows",120)
df = pd.read_csv("loadprofile.csv")
#df_f va avea initial o coloana meter ID preluata din df
df_f=df.loc[:,['meterID']]
#print(df_f)
# construim coloane in df_f aftfel incat df_f va contine
consumurile orare pentru o zi calculate din df_p ca medie a
consumului orar pentru o anumita ora indiferent de ziua saptamanii
for i in range(0,24):
hour='H'+str(i)
df_f[hour]=0
for j in range(0,7):
col=i+j*24
df_f[hour]=df_f[hour]+df.iloc[:,col]
df_f[hour]=df_f[hour]/7
print(df_f)

Exemplu 30: Modalitati de selectie


import pandas as pd
df = pd.read_csv("clienti_leasing20.csv")

df1 = df[(df.AGE > 40) & (df.JOB=="Inginer") | (df.JOB ==


"Economist") ]
print(df1)

df2=df.loc[(df['AGE']>40) & (df['JOB'] == 'Inginer') | (df['JOB']


== 'Economist'),:]
print(df2)
Seminar 1 Python
Pandas

df3=df.query('JOB in ["Inginer","Economist"] & AGE > 40')


print(df3)

Referințe
https://matplotlib.org/index.html
https://www.shanelynn.ie/summarising-aggregation-and-grouping-data-in-python-pandas/
https://www.shanelynn.ie/merge-join-dataframes-python-pandas-index-1/
http://queirozf.com/entries/pandas-dataframe-groupby-examples
https://chrisalbon.com/python/data_wrangling/pandas_join_merge_dataframe/
https://cmdlinetips.com/2018/12/pivot-table-in-python-pandas/
https://pbpython.com/pandas-pivot-table-explained.html
https://kite.com/blog/python/pandas-pivot-table/
https://cmdlinetips.com/2019/06/reshaping-dataframes-with-pandas-melt-and-wide_to_long/

Exerciții
1) Să se reprezinte grafic (de tip pie) valoarea medie a daunelor pentru al doilea semestru pentru
marcile Audi si Ford pentru fiecare an de fabricatie
2) Sa se grupeze dupa tara producatoare si sa afiseze valoarea medie a pretului manoperei

3) Sa se grupeze dupa tara producatoare si sa afiseze tara producatoare si toate tagurile fiecarei marci
din tara producatoare respctiva. Sa se calculeze de cate ori apare tagul bad pentru fiecare tara
producatoare.
4) Să se creeze setul format din user_usage și supported_devices și să se reprezinte grafic (bare
verticale) traficul însumat (coloana monthly_mb) pentru fiecare brand (coloana Retail Branding).
5) Să se afișeze, utilizând fișierul phone_data.csv, durata însumata pentru fiecare lună și durata
însumată pentru un anumit tip de rețea (mobile) pentru fiecare lună.

6) Sa se construiasca un pivot table utilizand datele: http://bit.ly/2cLzoxH

7) Sa se reprezinte grafic sub forma de bare 3 marci din Europa care au cele mai mici daune totale.

S-ar putea să vă placă și