This shows you the differences between two versions of the page.
isrm:laboratoare:new:01a [2022/03/07 09:44] mbarbulescu [[02] Prelucrare fișiere] |
isrm:laboratoare:new:01a [2024/10/02 14:07] (current) dragos.niculescu |
||
---|---|---|---|
Line 12: | Line 12: | ||
Rularea succesiva cu argumente variabile/dinamice va putea fi automatizata prin intermediul unui script ''Bash''. In mod ideal, acest script ar trebui sa salveze datele de interes intr-un fisier (.CSV preferabil) pentru a putea fi folosit ulterior pentru a obtine grafice. | Rularea succesiva cu argumente variabile/dinamice va putea fi automatizata prin intermediul unui script ''Bash''. In mod ideal, acest script ar trebui sa salveze datele de interes intr-un fisier (.CSV preferabil) pentru a putea fi folosit ulterior pentru a obtine grafice. | ||
- | Pentru realizarea graficelor, ne vom folosi de limbajul [[https://www.python.org/downloads/|Python]], de modulul de ''Python'' [[https://matplotlib.org/|matplotlib]] si de pachetul [[https://jupyter.org/|Jupyter Notebook]] pentru o vizualizare mai usoara a graficelor. ''Jupyter Notebook'' este o aplicatie care porneste un server web local si care permite rularea de cod (''Python'', ''Java'', etc) in cadrul unei pagini web locale care poarta numele de ''notebook''. | + | Pentru realizarea graficelor, ne vom folosi de limbajul [[https://www.python.org/downloads/|Python]], de modulul de ''Python'' [[https://matplotlib.org/|matplotlib]] si eventual de pachetul [[https://jupyter.org/|Jupyter Notebook]] pentru o vizualizare mai usoara a graficelor. ''Jupyter Notebook'' este o aplicatie care porneste un server web local si care permite rularea de cod (''Python'', ''Java'', etc) in cadrul unei pagini web locale care poarta numele de ''notebook''. O variantă |
+ | specifică VScode este rularea celulelor de tip notebook direct din Python | ||
+ | |||
+ | ===== A. Python cells în VScode ===== | ||
+ | * Codul Python poate fi organizat în secțiuni care pot fi rulate independent în python, dacă sunt prefixate de | ||
+ | <code python> | ||
+ | # %% | ||
+ | </code> | ||
+ | * în vscode, cu <Ctrl>+<Enter> se poate reevalua celula curentă | ||
+ | * Avantajul este că nu mai e necersară folosirea jupyter, iar codul python poate deasemenea fi rulat de la prompt | ||
+ | <code bash> | ||
+ | python3 ./plot.py | ||
+ | </code> | ||
- | ===== Jupyter notebook ===== | + | ===== B. Jupyter notebook ===== |
Pentru a lansa aplicatia de Jupyter Notebook, rulati urmatoarea comanda: | Pentru a lansa aplicatia de Jupyter Notebook, rulati urmatoarea comanda: | ||
Line 35: | Line 47: | ||
Odata intrati pe pagina web, putem trece la crearea unui notebook (butonul **New** -> **Python3**) | Odata intrati pe pagina web, putem trece la crearea unui notebook (butonul **New** -> **Python3**) | ||
- | ===== Github classroom ===== | ||
- | In cadrul laboratoarelor de ISRM, vom folosi Github classroom pentru a urca rezolvarile exercitiilor, pentru a primi feedback pe rezolvari/interpretari si pentru a primi nota pe laborator. | ||
- | Inainte de a porni cu laboratorul, urmati pasii mentionati [[https://ocw.cs.pub.ro/courses/smd/laboratoare/00#github_classroom_repository|aici]]. | ||
- | |||
- | Workflow-ul cu git va fi similar cu cel de [[https://ocw.cs.pub.ro/courses/smd/laboratoare/00#versioning|aici]]. | ||
- | |||
- | Fisierele de interes care vor trebui urcate intr-un pull request de Git incepand cu al treilea laborator sunt urmatoarele: | ||
- | * scripturi bash sau alte fisiere prin care automatizati rularea | ||
- | * fisierele de output in care salvati rezultatele obtinute in urma rularii scripturilor | ||
- | * graficele (fisiere .png) / notebook-ul Jupyter aferent laboratorului | ||
- | * un fisier README in care interpretati/analizati rezultatele obtinute | ||
===== Plotarea datelor simple ===== | ===== Plotarea datelor simple ===== | ||
Line 63: | Line 64: | ||
Pe baza acestor date, graficul poate fi construit folosind urmatorul template (pe care il puteti folosi si la restul laboratoarelor): | Pe baza acestor date, graficul poate fi construit folosind urmatorul template (pe care il puteti folosi si la restul laboratoarelor): | ||
- | <code python> | + | <code python> |
+ | # %% plot.py exemplu plotare | ||
import copy | import copy | ||
import numpy as np | import numpy as np | ||
Line 71: | Line 73: | ||
# Calea absoluta catre fisierul de date din care citim | # Calea absoluta catre fisierul de date din care citim | ||
# TODO - trebuie inlocuita cu calea corecta | # TODO - trebuie inlocuita cu calea corecta | ||
- | DATA_FILE = '/home/student/plotting_data1.csv' | + | DATA_FILE = './plotting_data1.csv' |
columns = ['x', 'y'] | columns = ['x', 'y'] | ||
Line 84: | Line 86: | ||
sim_data = np.genfromtxt(DATA_FILE, delimiter=' ', skip_header=2, names=columns, dtype=None) | sim_data = np.genfromtxt(DATA_FILE, delimiter=' ', skip_header=2, names=columns, dtype=None) | ||
+ | # %% | ||
def plot_data(sim_data): | def plot_data(sim_data): | ||
data = copy.deepcopy(sim_data) | data = copy.deepcopy(sim_data) | ||
Line 100: | Line 103: | ||
ax.plot(data['x'], data['y'], label='My plot') | ax.plot(data['x'], data['y'], label='My plot') | ||
ax.legend() | ax.legend() | ||
- | | ||
plt.show() | plt.show() | ||
+ | # dacă nu rulăm interactiv, în loc de show() putem salva plotul | ||
+ | # plt.savefig('plot.png') | ||
+ | # %% | ||
if __name__ == '__main__': | if __name__ == '__main__': | ||
plot_data(sim_data) | plot_data(sim_data) | ||
Line 114: | Line 119: | ||
<code python> | <code python> | ||
- | import copy | + | ... |
- | import numpy as np | + | |
- | import matplotlib | + | |
- | import matplotlib.pyplot as plt | + | |
- | + | ||
- | # Calea absoluta catre fisierul de date din care citim | + | |
- | # TODO - trebuie inlocuita cu calea corecta | + | |
- | DATA_FILE = '/home/student/plotting_data1.csv' | + | |
- | columns = ['x', 'y'] | + | |
- | + | ||
- | # Citim datele din fisier | + | |
- | # Argumentul delimiter precizeaza care este delimitatorul dintre coloane | + | |
- | # Argumentul skip_header precizeaza cate linii nu vor fi citite pornind cu inceputul fisierului | + | |
- | # Argumentul names este unul foarte util deoarece permite asocierea de nume pentru coloanele din fisier si | + | |
- | # de asemenea duce la un acces foarte usor al datelor in script. In acest exemplu, names va fi egal cu ['x', 'y'] | + | |
- | # ceea ce inseamna ca putem accesa valorile din prima coloana prin sim_data['x']. | + | |
- | # Argumentul dtype setat specifica modul in care vor fi interpretate coloanele (string-urile ca string-uri, float-urile ca float-uri). | + | |
- | # In absenta acestui argument, valorile din coloane vor fi interpretate ca float. | + | |
- | sim_data = np.genfromtxt(DATA_FILE, delimiter=' ', skip_header=2, names=columns, dtype=None) | + | |
- | + | ||
- | def plot_data(sim_data): | + | |
- | data = copy.deepcopy(sim_data) | + | |
- | + | ||
- | # Apelul subplots poate fi folosit pentru a crea mai multe subgrafice in cadrul aceluiasi grafic sau in cadrul unor grafice diferite | + | |
- | # Prin figsize se specifica dimensiunea graficului | + | |
- | fig, ax = plt.subplots(figsize=(12,12)) | + | |
- | # Valori stilistice pentru grafic | + | |
- | ax.grid(color='b', alpha=0.5, linestyle='dashed', linewidth=0.5) | + | |
- | # Denumirile axelor Ox si Oy, precum si titlul graficului | + | |
- | plt.xlabel('X values') | + | |
- | plt.ylabel('Y values') | + | |
- | plt.title('A very nice looking plot') | + | |
- | + | ||
- | # Aici este construit efectiv graficul. Campul label va fi folosit in cadrul legendei graficului | + | |
ax.plot(data['x'], data['y'], label='My plot') | ax.plot(data['x'], data['y'], label='My plot') | ||
ax.plot(data['y'], data['x'], label='My secondary plot') | ax.plot(data['y'], data['x'], label='My secondary plot') | ||
- | ax.legend() | + | ... |
- | + | ||
- | plt.show() | + | |
- | + | ||
- | + | ||
- | if __name__ == '__main__': | + | |
- | plot_data(sim_data) | + | |
</code> | </code> | ||
==== Date cu erori ==== | ==== Date cu erori ==== | ||
Line 190: | Line 156: | ||
Vom plota astfel: | Vom plota astfel: | ||
<code python> | <code python> | ||
+ | # %% plot_battery.py to plot data in battery.csv | ||
import copy | import copy | ||
import numpy as np | import numpy as np | ||
import matplotlib | import matplotlib | ||
import matplotlib.pyplot as plt | import matplotlib.pyplot as plt | ||
+ | |||
# Calea absoluta catre fisierul de date din care citim | # Calea absoluta catre fisierul de date din care citim | ||
# TODO - trebuie inlocuita cu calea corecta | # TODO - trebuie inlocuita cu calea corecta | ||
- | DATA_FILE = '/home/student/battery.dat' | + | DATA_FILE = './battery.csv' |
- | columns = ['resistance', 'power', 'power_error'] | + | #columns = ['resistance', 'power', 'power_error'] |
- | + | ||
- | # Citim datele din fisier | + | # %% |
- | sim_data = np.genfromtxt(DATA_FILE, delimiter=' ', skip_header=2, names=columns, dtype=None) | + | # Citim datele din fisier ca și cum nu am avea numele coloanelor |
+ | sim_data = np.genfromtxt(DATA_FILE, delimiter=' ', skip_header=2, dtype=None) | ||
+ | # %% | ||
def plot_data(sim_data): | def plot_data(sim_data): | ||
data = copy.deepcopy(sim_data) | data = copy.deepcopy(sim_data) | ||
+ | |||
fig, ax = plt.subplots(figsize=(12,12)) | fig, ax = plt.subplots(figsize=(12,12)) | ||
ax.grid(color='b', alpha=0.5, linestyle='dashed', linewidth=0.5) | ax.grid(color='b', alpha=0.5, linestyle='dashed', linewidth=0.5) | ||
Line 211: | Line 180: | ||
plt.ylabel('Y values') | plt.ylabel('Y values') | ||
plt.title('A very nice looking plot') | plt.title('A very nice looking plot') | ||
- | + | ||
- | ax.errorbar(data['resistance'], [1000 * x for x in data['power']], yerr=[1000 * x for x in data['power_error']], fmt='-o', label='My plot') | + | # columns are 0=resistance, 1=power, 2=error |
+ | ax.errorbar(data[:,0], 1000*data[:,1], yerr=1000*data[:,2], fmt='-o', label='My plot') | ||
ax.legend() | ax.legend() | ||
- | | + | |
+ | #plt.savefig('plot_battery.png') | ||
plt.show() | plt.show() | ||
- | + | ||
+ | |||
if __name__ == '__main__': | if __name__ == '__main__': | ||
plot_data(sim_data) | plot_data(sim_data) | ||
- | </code> | + | |
+ | </code> | ||
Valorile puterii sunt stocate în Watt în fișierul de date, dar au | Valorile puterii sunt stocate în Watt în fișierul de date, dar au | ||
Line 228: | Line 200: | ||
+ | ===== MS Teams assignments ===== | ||
+ | In cadrul laboratoarelor de ISRM, vom folosi MS Teams assignments pentru a urca rezolvarile exercitiilor, pentru a primi feedback pe rezolvari/interpretari si pentru a primi nota pe laborator. | ||
+ | |||
+ | Fisierele de interes care vor trebui urcate in MS Teams incepand cu al doilea laborator sunt urmatoarele: | ||
+ | * scripturi bash sau alte fisiere prin care automatizati rularea. Va exista un fișier run.sh care rulează toate subpunctele și generează toate graficele. | ||
+ | * fisierele de output in care salvati rezultatele obtinute in urma rularii scripturilor | ||
+ | * notebook-ul Jupyter aferent sau scripturile .py asociate fiecărui subpunct | ||
+ | * graficele obținute - fisiere .png (incluse în notebook dacă se merge pe acea variantă) | ||
+ | * un fisier README in care interpretati/analizati rezultatele obtinute | ||
+ | * exemplu fișier run.sh | ||
+ | <code bash> | ||
+ | # data generation, specific to each lab: | ||
+ | cp ~/Downloads/plotting_data1.csv . | ||
+ | cp ~/Downloads/battery.csv . | ||
+ | | ||
+ | # generating graphs in png files | ||
+ | python3 ./plot.py | ||
+ | python3 ./plot_battery.py | ||
+ | </code> | ||
+ | * pregătirea arhivei de submis: | ||
+ | <code bash> | ||
+ | cd ns-3-dev | ||
+ | zip -r lab01-NUME-Prenume.zip ./lab01 | ||
+ | adding: lab01/ (stored 0%) | ||
+ | adding: lab01/run.sh (stored 0%) | ||
+ | adding: lab01/plot_battery.png (deflated 25%) | ||
+ | adding: lab01/plot.py (deflated 52%) | ||
+ | adding: lab01/plotting_data1.csv (deflated 25%) | ||
+ | adding: lab01/battery.csv (deflated 65%) | ||
+ | adding: lab01/plot_battery.py (deflated 43%) | ||
+ | adding: lab01/README.md (stored 0%) | ||
+ | adding: lab01/plot.png (deflated 24%) | ||
+ | </code> | ||
+ | * upload lab01-NUME-Prenume.zip | ||
+ | | ||
===== Prelucrarea datelor în linie de comandă ===== | ===== Prelucrarea datelor în linie de comandă ===== | ||
Line 515: | Line 522: | ||
- | ==== [OPȚIONAL] Trasare de grafice cu gnuplot ==== | + | <spoiler [OPȚIONAL] Trasare de grafice cu gnuplot> |
Vom folosi fișierele de aici: [[https://github.com/systems-cs-pub-ro/uso/tree/master/lab09/draw-plots]] | Vom folosi fișierele de aici: [[https://github.com/systems-cs-pub-ro/uso/tree/master/lab09/draw-plots]] | ||
Line 534: | Line 541: | ||
Tot aici se găsește și un script gnuplot, ''draw-overhead-for-kpps.gnu'' care trasează graficul dependenței overhead-ului față de viteza de trafic pentru aplicația ''memwalk''. | Tot aici se găsește și un script gnuplot, ''draw-overhead-for-kpps.gnu'' care trasează graficul dependenței overhead-ului față de viteza de trafic pentru aplicația ''memwalk''. | ||
- | <spoiler Click pentru explicații legate de conținutul scriptului ''draw-overhead-for-kpps.gnu''> | ||
Conținutul scriptului este: | Conținutul scriptului este: | ||
<file gnuplot draw-overhead-for-kpps.gnu> | <file gnuplot draw-overhead-for-kpps.gnu> | ||
Line 565: | Line 571: | ||
* fișierul de intrare este ''memwalk-overhead-for-kpps'' | * fișierul de intrare este ''memwalk-overhead-for-kpps'' | ||
* tipul de grafic este ''linespoints'', însemnând că se trasează și puncte și linii care unesc punctele | * tipul de grafic este ''linespoints'', însemnând că se trasează și puncte și linii care unesc punctele | ||
- | </spoiler> | ||
Pentru a rula scriptul folosim comanda<code> | Pentru a rula scriptul folosim comanda<code> | ||
Line 622: | Line 627: | ||
În acest moment avem un grafic care indică dependența overhead-ului de viteza traficului pentru două aplicații. Datele au fost prelucrate din două fișiere de intrare în format CSV, conținând două coloane: prima cu viteza traficulului (în //kilopackets per second//) și a doua cu overhead-ul cauzat de aplicație (în secunde). Am trasat două grafice de tipul //linespoints// (puncte și linii între puncte), am plasat legenda în partea din centru dreapta a graficului, am creat etichete pentru legendă și am configurat pentru axa ''Oy'' limitele ''0'' și ''150''. | În acest moment avem un grafic care indică dependența overhead-ului de viteza traficului pentru două aplicații. Datele au fost prelucrate din două fișiere de intrare în format CSV, conținând două coloane: prima cu viteza traficulului (în //kilopackets per second//) și a doua cu overhead-ul cauzat de aplicație (în secunde). Am trasat două grafice de tipul //linespoints// (puncte și linii între puncte), am plasat legenda în partea din centru dreapta a graficului, am creat etichete pentru legendă și am configurat pentru axa ''Oy'' limitele ''0'' și ''150''. | ||
- | <spoiler Click pentru un model de script finalizat> | + | |
În final scriptul final gnuplot va avea o formă similară celui de mai jos<file gnuplot draw-overhead-for-kpps.gnu> | În final scriptul final gnuplot va avea o formă similară celui de mai jos<file gnuplot draw-overhead-for-kpps.gnu> | ||
# Run using: gnuplot draw-overhead-for-kpps.gnu | # Run using: gnuplot draw-overhead-for-kpps.gnu | ||
Line 641: | Line 646: | ||
'transcode-overhead-for-kpps.csv' with linespoints title 'transcode' | 'transcode-overhead-for-kpps.csv' with linespoints title 'transcode' | ||
</file> | </file> | ||
+ | |||
+ | Un mic ghid de gnuplot găsiți aici: http://www.gnuplotting.org/plotting-data/ | ||
+ | |||
</spoiler> | </spoiler> | ||
- | <spoiler Click pentru informații despre utilitare de trasare de grafice> | + | <spoiler [OPȚIONAL] alte utilitare de trasare de grafice> |
<note> | <note> | ||
O gamă foarte largă de funcționalități de prelucrare a datelor (statistică și grafică) este furnizată de [[http://www.r-project.org/|limbajul R]]. R oferă un mediu de dezvoltare a aplicațiilor de prelucrarea statistică; are un limbaj propriu cu ajutorul căruia se pot prelucra date, în principal numerice și statistice. Funcționalitățile oferite sunt vaste de la lucru pe vectori și matrice, la operații pe date tabelare, agregare de date, trasare de grafice în diferite formate. [[http://www.r-project.org/|Site-ul oficial]] conține documentație de instalare, utilizare și configurare a R. | O gamă foarte largă de funcționalități de prelucrare a datelor (statistică și grafică) este furnizată de [[http://www.r-project.org/|limbajul R]]. R oferă un mediu de dezvoltare a aplicațiilor de prelucrarea statistică; are un limbaj propriu cu ajutorul căruia se pot prelucra date, în principal numerice și statistice. Funcționalitățile oferite sunt vaste de la lucru pe vectori și matrice, la operații pe date tabelare, agregare de date, trasare de grafice în diferite formate. [[http://www.r-project.org/|Site-ul oficial]] conține documentație de instalare, utilizare și configurare a R. | ||
Line 653: | Line 661: | ||
</spoiler> | </spoiler> | ||
- | Un mic ghid de gnuplot găsiți aici: http://www.gnuplotting.org/plotting-data/ | + | |
====== Task-uri ====== | ====== Task-uri ====== |