Documente Academic
Documente Profesional
Documente Cultură
Sem Python 2.ip JupyterLab
Sem Python 2.ip JupyterLab
Seminar Python 2
1 Operații cu fișiere în Python
Funcția built-in open() returnează un obiect file (fișier). Citirea din fișiere text se face cu metodele
read() , readline() și readlines() .
Funcția open() are două argumente importante: numele fișierului și modul de deschidere:
"r" – read only – implicit. Deschide fișierul pentru citire; dă eroare dacă fișierul nu există.
"r+" – citire și scriere (actualizare);
"a" - append: adăugare (scriere) la sfârșitul fișierului; dacă nu există, fișierul este creat;
"w" - write only: deschide pentru scriere; dacă nu există, fișierul este creat; dacă există, conținutul
este șters;
"x" - create: creează un fișier; dă eroare dacă fișierul există deja.
Metoda read() citește tot conținutul fișierului și returnează un șir (string). Se poate specifica numărul
maxim de caractere de citit: read(100)
Metoda readline() citește și returnează o linie (încheiată cu caracterul \n ). Returnează un șir
vid dacă s-a atins sfârșitul de fișier (EOF).
readlines() citește toate liniile din fișier într-o listă de șiruri.
In [ ]:
path="" #setați calea către fișierele de date, după caz
#Exemplul 1.a
f = open(path+"Data1.txt", "r")
print(f.read())
f.close()
In [ ]:
#Exemplul 1.b: citire 100 caractere
f = open(path+"Data1.txt", "r")
print(f.read(100))
In [ ]:
#Exemplul 1.c
print(f.readline( )) #readline() se oprește la sfârșit de linie
print(f.readline())
f.close()
In [ ]:
#Exemplul 1.d
f = open(path+"Data1.txt", "r")
Al doilea argument (mode) poate specifica tipul fișierului: "t" - Text - implicit, fișier text. "b" -
https://hub.gke2.mybinder.org/user/iintorsureanu-psw-sem-python-2-8sad50n4/lab/tree/Sem-Python-2.ipynb 1/13
3/3/22, 8:38 AM Sem-Python-2
In [ ]:
#Exemplul 2: utilizare "with"
with open(path+'Data1.txt') as f:
lines=f.readlines() #rcitește toate liniile într-o listă
print(len(lines), 'linii citite din fișier.')
Metoda write() scrie un șir de caractere în fișier. Delimitatorii de linie sunt inserați automat.
In [ ]:
#Exemplul 3: Adaugă date din Data2.txt în Data1.txt
f1 = open(path+'Data1.txt', 'a')
f2 = open(path+'Data2.txt', 'r')
for line in f2:
f1.write(line)
f1.close(); f2.close()
print(len(open(path+'Data1.txt').readlines()), 'linii în Data1.txt.')
2 Pachetul pandas
Pandas conține obiecte și funcții pentru prelucrarea datelor tabelare (asemănătoare cu foile de
calcul sau bazele de date relaționale); oferă mecanisme avansate de indexare și funcții de procesare
complexe. Pentru o prezentare mai detaliată v. acest link.
Obiectele DataFrame conțin un index - implicit acesta conține valori întregi (0, 1, ...) asociate fiecărui
rând. Prin intermediul indexului se pot accesa anumite rânduri. Atributul index permite accesarea
indexului (ca obiect).
Citirea datelor csv într-un obiect DataFrame se face cu metoda read_csv() . Metode similare
există pentru citirea din alte formate: read_excel() , read_json() , read_sql() .
https://hub.gke2.mybinder.org/user/iintorsureanu-psw-sem-python-2-8sad50n4/lab/tree/Sem-Python-2.ipynb 2/13
3/3/22, 8:38 AM Sem-Python-2
Metodele head() and tail() returnează primele, respectiv ultimele n (implicit 5) rânduri.
In [ ]:
#Exemplul 4: import date din Csv, afișarea unor informații despre DataFrame
import pandas
df = pandas.read_csv(path+'clienti_leasing20.csv')
print(df.index)
print('-'*40)
print(df.columns)
print('-'*40)
print(df.head())
print('-'*40)
#print(df.tail())
iloc : localizare după index - accesarea datelor folosind indecși întregi ai rândurilor și
coloanelor (asemănător cu elementele dintr-o matrice);
loc : accesarea datelor după nume de coloane și etichete de rînduri (sau index).
a. Utilizarea iloc
In [ ]:
#Exemplul 5: tilizarea iloc pentru a afișa anumite rânduri
import pandas as pd
pd.set_option('display.width', 120) #setare lățime de afișare (caractere)
df = pd.read_csv(path+'clienti_leasing20.csv')
print(df.iloc[2], '\n', type(df.iloc[2])) #afișare rândul 3 ==> obiect Series
print('-'*40)
print(df.iloc[[1,3,5]], '\n', type(df.iloc[[1,3,5]])) #anumite rânduri (ca listă),
# ==> obiect DataFrame
Pentru a selecta anumite coloane se indică un al doilea element în lista aferentă iloc .
In [ ]:
#Exemplul 6
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv')
print(df.iloc[2, 0]) #valoarea din rândul 3, prima coloană
print('-'*40)
print(df.iloc[[1,3,5], [0,2]]) #anumite rânduri și coloane
Notația slice poate fi folosită pentru a specifica rânduri/coloane multiple. Atributul iloc cu slice se
comportă conform mecanismului obișnuit (include limita inferioară, dar nu include limita superioară
- v. Seminar 1, Liste).
https://hub.gke2.mybinder.org/user/iintorsureanu-psw-sem-python-2-8sad50n4/lab/tree/Sem-Python-2.ipynb 3/13
3/3/22, 8:38 AM Sem-Python-2
print('-'*40)
print(df.iloc[7:10, 2:5]) # rânduri 7 - 9, coloane 2 - 4
#print(df.iloc[0, :]) #primul rând, toate coloanele
In [ ]:
#Exemplul 8: Utilizare loc pentru afișare rânduri (înregistrări)
# și coloane, după nume (etichetă)
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv')
print(df.loc[ : ,'NAME_CLIENT'])
Notația slice se poate folosi cu .loc (nume de coloane), dar rezultatul va include limita superioară
din slice (!)
In [ ]:
#Exemplul 9: Utilizare .loc cu slice
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv')
In [ ]:
#Exemplul 10.a
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv')
https://hub.gke2.mybinder.org/user/iintorsureanu-psw-sem-python-2-8sad50n4/lab/tree/Sem-Python-2.ipynb 4/13
3/3/22, 8:38 AM Sem-Python-2
Expresia df['AGE']==35 generează un obiect Series - vector de valori bool, conținând True/False
pentru fiecare rând, în funcție de condiție. Această serie este dată ca argument în df.loc pentru a
selecta rândurile care au o valoare asociată True. Pentru mai multe informații despre indexarea
booleană, v. acest link.
In [ ]:
#Exemplul 10.b
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv')
Pentru formularea unor condiții complexe se utilizează operatorii logici: | pt. SAU, & pt ȘI, ~ pt
negație. Expresiile trebuiesc grupate în paranteze ().
In [ ]:
#Exemplul 11: Afișare clienți cu vârsta = 35, care sunt bărbați
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv')
print(df.loc[(df['AGE']==35)&(df['SEX']=='m'),['NAME_CLIENT','JOB','SEX','AGE']])
In [ ]:
#Exemplul 12: Afișare clienți care nu sunt ingineri
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv')
Metodele de prelucrare a șirurilor de caractere se pot accesa prin atributul .str al obiectului
Series. În general, acestea au aceleși nume ca metodele clasei string: str.len(), str.lower(),
str.upper(), str.strip(), str.startswith(), str.endswith() etc.
In [ ]:
#Exemplul 13: Afișare clienți al căror nume se termină cu 'a'
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv')
print(df.loc[df['NAME_CLIENT'].str.endswith("a"),['NAME_CLIENT','SEX']])
In [ ]:
#Exemplul 14:Afișare clienți al căror nume începe cu 'Ha'
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv')
print(df.loc[df['NAME_CLIENT'].str.startswith("Ha"),['NAME_CLIENT','SEX']])
In [ ]:
#Exemplul 15: Afișare clienți care sunt ingineri sau profesori
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv')
print(df.loc[df['JOB'].isin(['Engineer', 'Professor']),['NAME_CLIENT','SEX', 'JOB']])
https://hub.gke2.mybinder.org/user/iintorsureanu-psw-sem-python-2-8sad50n4/lab/tree/Sem-Python-2.ipynb 5/13
3/3/22, 8:38 AM Sem-Python-2
In [ ]:
#Exemplul 16: Modificarea venitului pentru primul rând
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv')
print(df.loc[0, 'INCOME_PER_YEAR'])
df.loc[0,'INCOME_PER_YEAR'] = 30000
print(df.loc[0, 'INCOME_PER_YEAR'])
In [ ]:
#Exemplul 17: Modificare condiționată: crește veniturile mai mici decât 5000,
# dacă vârsta e mai mare decât 30.
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv')
# situație inițială:
print(df1.loc[(df1['INCOME_PER_YEAR']<5000)&(df1['AGE']>30),
['NAME_CLIENT','INCOME_PER_YEAR', 'AGE']])
print('-'*40)
# actualizare venit :
df1.loc[(df1['INCOME_PER_YEAR']<5000)&(df1['AGE']>30),'INCOME_PER_YEAR']=10000
# situație finală:
print(df1.loc[(df1['INCOME_PER_YEAR']==10000)&(df1['AGE']>30),
['NAME_CLIENT','INCOME_PER_YEAR', 'AGE']])
In [ ]:
#Exemplul 18: the describe() method
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv',
usecols=['NAME_CLIENT','JOB','SEX','CURRENCY','INCOME_PER_YEAR','DATE','AGE'])
print(df.describe())
#print(df.describe(include="all"))
In [ ]:
#Exemplul 19: Statistici descriptive pentru venit (INCOME_PER_YEAR)
https://hub.gke2.mybinder.org/user/iintorsureanu-psw-sem-python-2-8sad50n4/lab/tree/Sem-Python-2.ipynb 6/13
3/3/22, 8:38 AM Sem-Python-2
#import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv',
usecols=['NAME_CLIENT','JOB','SEX','CURRENCY','INCOME_PER_YEAR','DATE','AGE'])
In [ ]:
#Exemplul 20: Afișarea și modificarea tipului de date al coloanelor
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv')
print(df.dtypes) # ce tip au coloanele AGE, DATE ?
print('-'*40)
In [ ]:
#Exemplul 21: Înlocuirea valorilor lipsă
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20missing.csv',
usecols=['NAME_CLIENT','JOB','SEX','CURRENCY','INCOME_PER_YEAR','DATE','AGE'])
In [ ]:
#Exemplul 22: Înlocuirea valorilor lipsă cu media valorilor
#import pandas as pd
df = pd.read_csv(path+'clienti_leasing20missing.csv',
usecols=['NAME_CLIENT','JOB','SEX','CURRENCY','INCOME_PER_YEAR','DATE','AGE'])
mean_age = int(df['AGE'].mean())
df['AGE'] = df['AGE'].fillna(value = mean_age)
print(df.AGE)
Ștergerea de rânduri și coloane se fae cu metoda drop() . Argumentul axis indică dacă se vor
șterge rânduri ( axis=0 ) sau coloane ( axis=1 ). drop() returnează un nou DataFrame. Dacă se
utilizează argumentul inplace=True , se modifică obiectul curent.
In [ ]:
https://hub.gke2.mybinder.org/user/iintorsureanu-psw-sem-python-2-8sad50n4/lab/tree/Sem-Python-2.ipynb 7/13
3/3/22, 8:38 AM Sem-Python-2
df = pd.read_csv(path+'clienti_leasing20.csv')
In [ ]:
#Exemplul 24: Ștergere rânduri (înregistrări)
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv')
# Șterge rânduri 3, 5, 8
df4 = df.drop([3,5,8], axis=0)
print(df4.head(10))
Indexul implicit al rândurilor (nr. întreg) poate fi înlocuit cu valori din coloane ale DataFrame-ului,
folosind metoda set_index() .
In [ ]:
#Exemplul 25
import pandas as pd
pd.set_option('display.width', 120)
df = pd.read_csv(path+'clienti_leasing20.csv')
https://hub.gke2.mybinder.org/user/iintorsureanu-psw-sem-python-2-8sad50n4/lab/tree/Sem-Python-2.ipynb 8/13
3/3/22, 8:38 AM Sem-Python-2
In [ ]:
#Exemplul 26:
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv',
usecols = ['NAME_CLIENT','JOB'],
skiprows = [6,7,9])
print(df)
In [ ]:
#Exemplul 27: Restricționează nr. de rânduri citite (nrows)
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv',
nrows=6,
usecols = ['NAME_CLIENT','INCOME_PER_YEAR'])
print(df)
Metoda sort_values() returnează un obiect DataFrame nou, sortat. Pt. mai multe detalii v. acest
link.
In [ ]:
#Exemplul 28: Exemple de sortare
import pandas as pd
df = pd.read_csv(path+'clienti_leasing20.csv')
In [ ]:
#Exemplul 29
import pandas as pd
df = pd.read_csv('clienti_leasing20.csv')
https://hub.gke2.mybinder.org/user/iintorsureanu-psw-sem-python-2-8sad50n4/lab/tree/Sem-Python-2.ipynb 9/13
3/3/22, 8:38 AM Sem-Python-2
In [ ]:
#Exemplul 30: Utilizare csv.reader
import csv
with open(path+'clienti_leasing20.csv', 'r', newline='') as f:
reader = csv.reader(f)
for row in reader:
print (row)
In [ ]:
#Exemplul 31: Citirea unei coloane din fișier .csv
import csv
with open(path+'clienti_leasing20.csv', 'r', newline='') as f:
reader = csv.reader(f)
for row in reader:
print (row[1])
In [ ]:
#Exemplul 32: Citire coloane
#import csv
with open(path+'clienti_leasing20.csv', 'r', newline='') as f:
reader = csv.reader(f)
for row in reader:
print (row[1],row[7]) # col. NAME_CLIENT și AGE
#print(row[0:3]) # primele 3 col.
Funcția built-in enumerate() se utilizează pentru a genera un contor automat la iterarea cu for
... in ... . Este aplicabilă și pentru iterarea rândurilor într-un obiect reader. (v. și doc.
enumerate() ).
In [ ]:
#Exemplul 33: utilizare enumerate() pentru a citi primele 10 înreg.
#import csv
with open(path+'clienti_leasing20.csv', 'r', newline='') as f:
reader = csv.reader(f)
for i, row in enumerate(reader):
print(row)
if(i >= 10):
break
În același scop se poate folosi și un obiect islice din modulul itertools (v. doc. islice).
In [ ]:
#Exemplul 34: Citirea primelor 10 înreg. cu islice
#import csv
from itertools import islice
https://hub.gke2.mybinder.org/user/iintorsureanu-psw-sem-python-2-8sad50n4/lab/tree/Sem-Python-2.ipynb 10/13
3/3/22, 8:38 AM Sem-Python-2
In [ ]:
#Exemplul 35: Citirea coloanelor csv în liste
id_client = []
name_client = []
sex = []
with open(path+'clienti_leasing20.csv', 'r', newline='') as f:
reader = csv.reader(f)
for row in reader:
id_client.append(row[0])
name_client.append(row[1])
sex.append(row[3])
print(id_client)
print(name_client)
print(sex)
In [ ]:
#Exemplul 36: Citire date din csv și procesare (afișare cu format)
#import sys
#print(sys.version) #afișază versiune python
#import csv
with open(path+'angajati.txt', newline='') as f:
reader = csv.reader(f, delimiter=',') # specificare delimitator
line_count = 0
for row in reader:
if line_count == 0:
#print('Nume coloane: {}'.format(", ".join(row))) #Python version < 3.6
print(f'Nume coloane: {", ".join(row)}') #Python 3.6+ ! vezi sys.version()
line_count += 1
else:
#print('\t{} lucrează in dep.: {}, născut în: {}'.format(row[0],row[1],row[
print(f'\t{row[0]} lucrează in dep.: {row[1]}, născut în: {row[2]}.') #Pyth
line_count += 1
#print('S-au procesat {} linii.'.format(line_count)) #Python ver. < 3.6
print(f'S-au procesat {line_count} linii.') #Python 3.6+
Obiectul csv.DictReader poate fi folosit în locul lui reader pentru a citi date într-un dicționar.
(v. doc. csv.DictReader)
In [ ]:
#Exemplul 37: Citire date din fișier csv în dicționar.
# Prima linie din fișier conține numele de câmpuri (coloane)
#import csv
with open(path+'angajati.txt', newline='') as f:
reader = csv.DictReader(f, delimiter=',')
for row in reader:
print(row)
In [ ]:
#Exemplul 38: utilizare DictReader, se specifică delimitatorul ';'
#import csv
with open(path+'angajati1.txt', newline='') as f:
reader = csv.DictReader(f, delimiter =';')
for row in reader:
print(row)
https://hub.gke2.mybinder.org/user/iintorsureanu-psw-sem-python-2-8sad50n4/lab/tree/Sem-Python-2.ipynb 11/13
3/3/22, 8:38 AM Sem-Python-2
Scrierea într-un fișier csv se face cu obiectele csv.writer sau csv.DictWriter , folosind
metoda writerow() .
In [ ]:
#Exemplul 39: utilizare csv.writer, writerow()
#import csv
with open(path+'angajati.csv', mode='w', newline='') as f: #creare fișier
writer = csv.writer(f)
writer.writerow(['Nume', 'Departament', 'Luna'])
writer.writerow(['Cosmin Antonescu', 'Marketing', 'Noiembrie'])
writer.writerow(['Eugenia Marin', 'Vanzari', 'Iulie'])
In [ ]:
#Exemplul 40: utilizare csv.DictWriter
#import csv
with open(path+'angajati1.csv', mode='w', newline='') as f:
fieldnames = ['Nume', 'Departament', 'Luna']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'Nume': 'Constantinescu Andrei', 'Departament': 'Contabilitate', '
writer.writerow({'Nume': 'Iliescu Emil', 'Departament': 'IT', 'Luna': 'mai'})
with open('clienti_daune100.json') as f:
data = json.load(f) # încărcare date într-o listă de dicționare
pprint(data[0]) # afișare prima înreg.
In [ ]:
#Exemplul 42: Procesare date json
# Calculul frecvenței de apariție a cuvintelor în câmpul "Dauna"
import json
from pprint import pprint
https://hub.gke2.mybinder.org/user/iintorsureanu-psw-sem-python-2-8sad50n4/lab/tree/Sem-Python-2.ipynb 12/13
3/3/22, 8:38 AM Sem-Python-2
for rec in data:
word_list=word_list + rec['Dauna'].lower().split()
print(word_list[:100], '...', len(word_list), 'cuvinte în total.' )
Referințe
Pandas Documentation, https://pandas.pydata.org/docs/getting_started/index.html
J. VanderPlas, Python Data Science Handbook -
https://jakevdp.github.io/PythonDataScienceHandbook/
https://realpython.com/python-csv/
https://www.shanelynn.ie/python-pandas-read_csv-load-data-from-csv-files/
https://www.shanelynn.ie/select-pandas-dataframe-rows-and-columns-using-iloc-loc-and-ix/
5 Exerciții
1) Să se creeze un nou set de date din clienti_leasing500.csv, având coloanele name_client,
deposit_amount și prescoring, dacă val_credits_ron = 0 și deposit_amount > 1000 și să se modifice
coloana prescoring = 6 dacă deposit_amount > 5000. Salvați setul modificat într-un nou fișier csv.
In [ ]:
2) La exemplul 42 se vor afișa cuvintele a căror frecvență de apariție >= 30, eliminându-se cuvintele
the, and, to, a.
In [ ]:
https://hub.gke2.mybinder.org/user/iintorsureanu-psw-sem-python-2-8sad50n4/lab/tree/Sem-Python-2.ipynb 13/13