6. Prezantimi i të dhënave si tabela

Në këtë mësim do demostrojmë:

  1. si të përfaqësohen tabelat duke përdorur listat;
  2. si të përfaqësohen tabela duke përdorur një model më të efektshëm të siguruar nga libraria pandas;
  3. si të vizualizohen të dhënat e paraqitura si tabela;
  4. si të lexoni tabela nga skedarët lokalë dhe burimet e largëta.

6.1. Prezantimi i tabelave me lista

Mënyra më efikase për të organizuar sasi të mëdha të të dhënave është t'i vendosni ato në një tabelë. Për shembull, kjo tabelë përmban disa fakte themelore për një grup studentësh:

Name Sex Age (yrs) Weight (kg) Height (cm)
Anne f 13 46 160
Ben m 14 52 165
Colin m 13 47 157
Diana f 15 54 165
Ethan m 15 56 163
Fred m 13 45 159
Gloria f 14 49 161
Hellen f 15 52 164
Ian m 15 57 167
Jane f 13 45 158
Kate f 14 51 162

Ne do ta përfaqësojmë secilën rresht në këtë tabelë si listë, dhe pastaj t'i vendosim të gjitha këto lista në një listë të re:

In [1]:
students = [["Anne",    "f", 13, 46, 160],
            ["Ben",     "m", 14, 52, 165],
            ["Colin",   "m", 13, 47, 157],
            ["Diana",   "f", 15, 54, 165],
            ["Ethan",   "m", 15, 56, 163],
            ["Fred",    "m", 13, 45, 159],
            ["Gloria",  "f", 14, 49, 161],
            ["Hellen",  "f", 15, 52, 164],
            ["Ian",     "m", 15, 57, 167],
            ["Jane",    "f", 13, 45, 158],
            ["Kate",    "f", 14, 51, 162]]

Tani mund të marrim me lehtësi informacionin për çdo student në grup. Për shembull, për të parë informacionin në lidhje me Ethan, ne thjesht shkruajmë students [4] (important! Elementi i parë i listës në indeksuar nga 0, kështu që lista e Ethan ka indeksin 4):

In [2]:
students[4]
Out[2]:
['Ethan', 'm', 15, 56, 163]

Nga ana tjetër, kjo mënyrë e përfaqësimit të tabelave është e papërshtatshme sepse nuk është e lehtë të punosh me kolonat e tabelës. Për shembull, nëse do të donim të llogaritnim lartësinë mesatare të studentëve në grup, do të na duhej të shkruanim një program:

In [3]:
sum = 0
for s in students:
    sum += s[4]
float(sum) / len(students)
Out[3]:
161.9090909090909

Kodi funksionon kështu:

së pari inicializojmë shumën e ndryshueshme në 0 (përfundimisht ajo do të përmbajë shumën e lartësive të studentëve);kodi më pas vendos secilin student në grup dhe shton lartësinë e tij në shumë (lartësia e një studenti është numri në indeksin 4 të listës); në fund, ne llogarisim mesataren.Kjo nuk është e vështirë, por gjithashtu nuk është shumë e përshtatshme. Ne kemi nevojë për një strukturë më fleksibël të të dhënave.

6.2. pandas, DataFrame dhe puna me kolonat në tabelë

Libraria pandas është zhvilluar me një manipulim efikas të tabelave në mendje. Le ta importojmë librarinë dhe t'i japim një nofkë:

In [4]:
import pandas as pd

Kjo librari jep një strukturë të dhënash të fuqishme të quajtur DataFrame. Le të fillojmë duke shndërruar të dhënat për grupin e studentëve në një DataFrame:

In [5]:
students_df = pd.DataFrame(students)

Kjo komandë thjesht rregullon të dhënat nga lista students në një DataFrame. Le të shohim si duket një DataFrame:

In [6]:
students_df
Out[6]:
0 1 2 3 4
0 Anne f 13 46 160
1 Ben m 14 52 165
2 Colin m 13 47 157
3 Diana f 15 54 165
4 Ethan m 15 56 163
5 Fred m 13 45 159
6 Gloria f 14 49 161
7 Hellen f 15 52 164
8 Ian m 15 57 167
9 Jane f 13 45 158
10 Kate f 14 51 162

Të gjitha informacionet janë atje, të rregulluara në një tabelë të rregullt. Për ta bërë tabelën më të lexueshme do t'i emërtojmë kolonat e tabelës duke përdorur opsionin columns:

In [7]:
students_df.columns=["Name", "Sex", "Age", "Weight", "Height"]
students_df
Out[7]:
Name Sex Age Weight Height
0 Anne f 13 46 160
1 Ben m 14 52 165
2 Colin m 13 47 157
3 Diana f 15 54 165
4 Ethan m 15 56 163
5 Fred m 13 45 159
6 Gloria f 14 49 161
7 Hellen f 15 52 164
8 Ian m 15 57 167
9 Jane f 13 45 158
10 Kate f 14 51 162

Tani që secila kolonë ka emrin e vet, ne mund të aksesojmë kolonat individuale si kjo:

In [8]:
students_df["Name"]
Out[8]:
0       Anne
1        Ben
2      Colin
3      Diana
4      Ethan
5       Fred
6     Gloria
7     Hellen
8        Ian
9       Jane
10      Kate
Name: Name, dtype: object
In [9]:
students_df["Height"]
Out[9]:
0     160
1     165
2     157
3     165
4     163
5     159
6     161
7     164
8     167
9     158
10    162
Name: Height, dtype: int64

Mund të merrni gjithmonëemrin e të gjitha kolonave në tabelë:

In [10]:
students_df.columns
Out[10]:
Index(['Name', 'Sex', 'Age', 'Weight', 'Height'], dtype='object')

Funksionet e mëposhtme na lehtësojnë llogaritjen e statistikave elementare në kolonat e një DataFrame:

  • sum -- shuma e elementeve në një kolonë;
  • mean -- vlera mesatare (arithmetic mean) e elementëve në një kolonë;
  • median --vlera mesatare e elementeve në një kolonë
  • min -- vlera minimale e elementeve në një kolonë.
  • max -- vlera maksimale e elementeve në një kolonë.

Për shembull, gjatësia e studentit më të shkurtër është:

In [11]:
students_df["Height"].min()
Out[11]:
157

Mosha e studentit më të madh:

In [12]:
students_df["Age"].max()
Out[12]:
15

Gjatësia mesatare e studentëve:

In [13]:
students_df["Height"].mean()
Out[13]:
161.9090909090909

Gjatësia mesatare:

In [14]:
students_df["Height"].median()
Out[14]:
162.0

Can the entire group fit in an elevator which holds at most 600 kg?

In [15]:
if students_df["Weight"].sum() <= 600:
    print("Yes")
else:
    print("No")
Yes

6.3. Vizualimi i të dhënave me DataFrames

Kjo është e lehtë: thjesht zgjidhni kolonat që do të dëshironit t’i vizatoni. Për të parë disa shembuj fillojmë duke ngarkuar librarinë tonë të preferuar:

In [16]:
import matplotlib.pyplot as plt

Për të vizualizuar lartësinë e studentëve në grup, ne thjesht hartojmë një tabelë që tregon emrat dhe gjatësitë e studentëve:

In [17]:
plt.figure(figsize=(10,5))
plt.bar(students_df["Name"], students_df["Height"])
plt.title("The height of students")
plt.show()
plt.close()

Ne mund të vizaulizojmë moshën dhe peshën e studentëve:

In [18]:
plt.figure(figsize=(10,5))
plt.bar(students_df["Name"], students_df["Weight"], color="r", label="Weight")
plt.bar(students_df["Name"], students_df["Age"], color="g", label="Age")
plt.title("Age and weight of the students")
plt.legend()
plt.show()
plt.close()

6.4. Ngarkimi i tabelave nga skedari lokal CSV

Puna me më shumë kohë dhe më pak tërheqëse në analizën e të dhënave është kthimi i të dhënave të papërpunuara në tabela. Ndoshta nuk e keni vënë re se sepse tabelat që kemi përdorur për demonstrim ishin të vogla, por në situata të jetës reale ne zakonisht marrim tabela të mëdha me mijëra rreshta dhe kolona. (A keni dëgjuar ndonjëherë për një pjesë të shkencës së të dhënave të quajturBig Data?)

Sot ne përdorim makina për të mbledhur të dhëna (stacione automatike meteorogjike, vendvotime të kompjuterizuara etj). Makineritë më pas paketojnë të dhënat që ata kanë mbledhur në një format shumë të thjeshtë që më vonë mund t'i ngarkojmë dhe përpunojmë. CSV do të thotë "comma separated values" dhe është një nga format më të thjeshta (dhe më të njohura) për të përfaqësuar tabelat. Skedarët CSV janë skedarë teksti, rreshtat e të cilave korrespondojnë me rreshtat e tabelës, dhe vlerat brenda të njëjtit rresht ndahen me presje ("vlerat e ndara me presje").

Për shembull, kemi një skedar Top 25 YouTubers.csv në dosjen data që ka këtë pamje:

RANK,GRADE,NAME,VIDEOS,SUBSCRIBERS,VIEWES
1,A++,T-Series,13629,105783888,76945588449
2,A,PewDiePie,3898,97853589,22298927681
3,A+,5-Minute Crafts,3341,58629572,14860695079
4,A++,Cocomelon - Nursery Rhymes,441,53163816,33519273951
...
25,A,TheEllenShow,10542,33362512,16519572219

Kjo tabelë përmban informacione në lidhje me 25 kanalet më të mira në YouTube sipas numrit të subsrcibers më 1 korrik 2019. Rreshti i parë i skedarit është rreshti i header që na tregon se tabela ka gjashtë kolona (RANK, GRADE, NAME, VIDEOS, SUBSCRIBERS, VIEWES). Rreshti

4,A++,Cocomelon - Nursery Rhymes,441,53163816,33519273951

do të thotë që kanali i 4-të më i popullarizuar në YouTube (më 1 korrik 2019) ka renditje në YouTube A ++, emri i tij është "Cocomelon - Nursery Rhymes", ka publikuar 441 video në YouTube, ka 53,163,816 subsrcibers dhe 33,519,273,951 shikime.

Funksioni read_csv nga pandas lexon një CSV dhe e kthen në një DataFrame. Për shembull:

In [19]:
import pandas as pd
Top25 = pd.read_csv("data/Top 25 YouTubers.csv")

Ne mund të hedhim një vështrim në tabelë duke përdorur funksionin head (N) i cili tregon rreshtat e parë N të një tabele. Nëse e përdorim funksionin pa argument, ai tregon pesë rreshtat e parë:

In [20]:
Top25.head()
Out[20]:
RANK GRADE NAME VIDEOS SUBSCRIBERS VIEWES
0 1 A++ T-Series 13629 105783888 76945588449
1 2 A PewDiePie 3898 97853589 22298927681
2 3 A+ 5-Minute Crafts 3341 58629572 14860695079
3 4 A++ Cocomelon - Nursery Rhymes 441 53163816 33519273951
4 5 A++ SET India 31923 51784081 36464793233
In [21]:
Top25.head(10)
Out[21]:
RANK GRADE NAME VIDEOS SUBSCRIBERS VIEWES
0 1 A++ T-Series 13629 105783888 76945588449
1 2 A PewDiePie 3898 97853589 22298927681
2 3 A+ 5-Minute Crafts 3341 58629572 14860695079
3 4 A++ Cocomelon - Nursery Rhymes 441 53163816 33519273951
4 5 A++ SET India 31923 51784081 36464793233
5 6 A+ Canal KondZilla 1100 50560964 25446405744
6 7 A+ WWE 42404 46098586 34085586984
7 8 B+ Justin Bieber 134 45873439 625649566
8 9 A Dude Perfect 209 43796634 8354321862
9 10 A+ Badabun 4406 41131131 13175713909

Funksionitail(N) shfaq rreshtat e fundit N në tabelë (ose vetëm 5 nëse nuk jepet asnjë argument):

In [22]:
Top25.tail()
Out[22]:
RANK GRADE NAME VIDEOS SUBSCRIBERS VIEWES
20 21 B- Katy Perry 97 34416819 361332307
21 22 A Felipe Neto 1872 33549096 7458531306
22 23 A JustinBieberVEVO 122 33514535 18873475304
23 24 A Fernanfloo 534 33378699 7201866552
24 25 A TheEllenShow 10542 33362512 16519572219
In [23]:
Top25.tail(7)
Out[23]:
RANK GRADE NAME VIDEOS SUBSCRIBERS VIEWES
18 19 A- elrubiusOMG 809 35324033 7772447040
19 20 B Taylor Swift 166 34920060 255089844
20 21 B- Katy Perry 97 34416819 361332307
21 22 A Felipe Neto 1872 33549096 7458531306
22 23 A JustinBieberVEVO 122 33514535 18873475304
23 24 A Fernanfloo 534 33378699 7201866552
24 25 A TheEllenShow 10542 33362512 16519572219

Le të vizualizojmë numrin e subsrcibers të 25 kanaleve më të mira në YouTube:

In [24]:
plt.figure(figsize=(15,10))
plt.bar(Top25["NAME"], Top25["SUBSCRIBERS"])
plt.title("Top 25 YouTube channels according to the number of subscribers (July 1st, 2019)")
plt.show()
plt.close()

Është rrëmujë sepse emrat e kanaleve janë shumë të gjata. Në këto situata përdorimi i "barh" në vend të "bar" mund të prodhojë rezultate më të mira:

In [25]:
plt.figure(figsize=(10,10))
plt.barh(Top25["NAME"], Top25["SUBSCRIBERS"])
plt.title("Top 25 YouTube channels according to the number of subscribers (July 1st, 2019)")
plt.show()
plt.close()

6.5. Ngarkimi i tabelave nga burime të largëta (remote)

Ju gjithashtu mund të ngarkoni të dhënat nga një burim i largët direkt, pa pasur nevojë të shkarkoni të dhënat në makinën tuaj. Për të ngarkuar një tabelë nga një burim i largët, ju duhet një lidhje interneti (natyrisht!) Dhe ju duhet të dini vendndodhjen ekzakte të tabelës që dëshironi të ngarkoni. Vendndodhja e saktë e çdo burimi në internet sigurohet nga URL (which stands for Universal Resource Locator).

Adresa e Internetit

https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv

përmban një listë të disponueshme publikisht për të gjitha vendet në botë. Ne mund ta lexojmë këtë tabelë duke përdorur direkt read_csv:

In [26]:
countries = pd.read_csv("https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv")
countries.head(10)
Out[26]:
Country Region
0 Algeria AFRICA
1 Angola AFRICA
2 Benin AFRICA
3 Botswana AFRICA
4 Burkina AFRICA
5 Burundi AFRICA
6 Cameroon AFRICA
7 Cape Verde AFRICA
8 Central African Republic AFRICA
9 Chad AFRICA

Tabelat e disponueshme në internet zakonisht nuk janë para-paketuar në një skedar CSV. Ato më së shpeshti futen në një faqe në internet dhe përmbyten nga disa kod shtesë HTML (HTML nënkupton "hyper-text markup language" dhe tregon gjuhën që janë të koduar të gjitha faqet e internetit në Tokë).

Për fat të mirë, funksioni "read_html" mund të marrë një faqe në internet dhe të nxjerrë një tabelë prej saj. Për shembull, kodi vijues lexon listën e të gjitha shteteve të SH.B.A. në një DataFrame direkt nga një faqe në internet e Wikipedia:

In [27]:
US = pd.read_html("https://simple.wikipedia.org/wiki/List_of_U.S._states", header=[0,1])[0]

Faqet në internet janë komplekse dhe mund të përmbajnë disa tabela. Kjo është arsyeja pse read_html kthen një listë të tabelave. Në këtë rast tabela që na duhet është e para në listë, pra indeksimi [0]. Opsioni header = [0,1] nënkupton që dy rreshtat e parë të tabelës përbëjnë kokën. Le të shohim:

In [28]:
US.head()
Out[28]:
Name &postal abbreviation[1] Cities Established[upper-alpha 1] Population[upper-alpha 2][3] Total area[4] Land area[4] Water area[4] Numberof Reps. Unnamed: 8_level_0 Unnamed: 9_level_0 Unnamed: 10_level_0 Unnamed: 11_level_0 Unnamed: 12_level_0
Capital Largest[5] mi2 km2 mi2 km2 mi2 km2 Unnamed: 8_level_1 Unnamed: 9_level_1 Unnamed: 10_level_1 Unnamed: 11_level_1 Unnamed: 12_level_1
0 Alabama AL Montgomery Birmingham Dec 14, 1819 4874747 52420 135767 50645 131171 1775 4597 7.0
1 Alaska AK Juneau Anchorage Jan 3, 1959 739795 665384 1723337 570641 1477953 94743 245384 1.0
2 Arizona AZ Phoenix Feb 14, 1912 7016270 113990 295234 113594 294207 396 1026 9 NaN
3 Arkansas AR Little Rock Jun 15, 1836 3004279 53179 137732 52035 134771 1143 2961 4 NaN
4 California CA Sacramento Los Angeles Sep 9, 1850 39536653 163695 423967 155779 403466 7916 20501 53.0

6.6. Ushtrime

Ushtrimi 1. Shikoni kodin dhe përgjigjuni pyetjeve më poshtë:

In [29]:
import pandas as pd
import matplotlib.pyplot as plt

students = [["Anne",    "f", 13, 46, 160],
            ["Ben",     "m", 14, 52, 165],
            ["Colin",   "m", 13, 47, 157],
            ["Diana",   "f", 15, 54, 165],
            ["Ethan",   "m", 15, 56, 163],
            ["Fred",    "m", 13, 45, 159]]

table = pd.DataFrame(students)
table.columns=["Name", "Sex", "Age", "Weight", "Height"]

print(table["Height"].min(), table["Height"].mean(), table["Height"].median())

plt.figure(figsize=(10,5))
plt.bar(table["Name"], table["Height"])
plt.show()
plt.close()

temp_anomalies = pd.read_csv("data/TempAnomalies.csv", header=None)
countries = pd.read_csv("https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv")
US = pd.read_html("https://simple.wikipedia.org/wiki/List_of_U.S._states", header=[0,1])[0]
157 161.5 161.5
  1. Pse duhet të importojmë dy librari?
  2. Pse përfaqësojmë tabelat sipas DataFrames, dhe jo listat?
  3. Cilët janë emrat e kolonave në tabelën DataFrame `?
  4. Cili është ndryshimi midis min,mean dhe median?
  5. Çfarë duhet të ndryshoni për të bërë që grafiku të përshkruaj peshën e studentëve?
  6. Si do ta ngarkoni skedarin TempAnomalies.csv nëse do të kishte një rresht me header?
  7. A është krijuar DataFrame 'vendet' nga informacionet e ruajtura në çast në kompjuterin tuaj?
  8. Cili është formati i tabelës nga është krijuar dataFrame US?
  9. Çfarë ndodh nëse shkruani https: // thjeshtë.wikipedia.org / wiki / List_of_U.S._states në shfletues?

Ushtrimi 2. Tabela më poshtë përshkruan prodhimin e misrit të një gruri në një rajon bujqësor të Evropës (numrat janë në 1000 tonë):

Year Corn Wheat
2008 6,158 2,095
2009 6,396 2,067
2010 7,207 1,631
2011 6,480 2,076
2012 3,532 1,911

(a) Kthejeni këtë tabelë në një listë dhe krijoni një DataFrame nga lista. Pastaj llogaritni rendimentin maksimal të misrit dhe rendimentin minimal të grurit.

(b) Vizualizoni të dhënat duke përdorur një tabelë.

(c) Llogaritni rendimentin mesatar të misrit; atëherë llogaritni ndryshimin midis rendimentit maksimal dhe atij minimal të grurit.

Ushtrimi 3. Kjo është një përmbledhje e shpenzimeve të një familjeje gjatë një viti (në monedhën vendase):

Item Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
Rent 8,251 8,436 8,524 8,388 8,241 8,196 8,004 7,996 7,991 8,015 8,353 8,456
Electricity 4,321 4,530 4,115 3,990 3,985 3,726 3,351 3,289 3,295 3,485 3,826 3,834
Phone (landline) 1,425 1,538 1,623 1,489 1,521 1,485 1,491 1,399 1,467 1,531 1,410 1,385
Phone (cell) 2,181 2,235 2,073 1,951 1,989 1,945 3,017 2,638 2,171 1,831 1,926 1,833
TV and Internet 2,399 2,399 2,399 2,399 2,399 2,399 2,399 2,399 2,399 2,399 2,399 2,399
Transport 1,830 1,830 1,830 1,830 1,950 1,950 1,450 1,450 1,950 1,950 2,050 2,050
Food 23,250 23,780 24,019 24,117 24,389 24,571 24,736 24,951 25,111 25,389 25,531 25,923
Rest 4,500 3,700 5,100 3,500 2,750 4,250 7,320 8,250 3,270 4,290 3,200 8,390

Kjo tabelë, e prezantuar si listë, duket kështu:

In [30]:
spendings = [
  ["Rent", 8251, 8436, 8524, 8388, 8241, 8196, 8004, 7996, 7991, 8015, 8353, 8456],
  ["Electricity", 4321, 4530, 4115, 3990, 3985, 3726, 3351, 3289, 3295, 3485, 3826, 3834],
  ["Landline", 1425, 1538, 1623, 1489, 1521, 1485, 1491, 1399, 1467, 1531, 1410, 1385],
  ["Cell", 2181, 2235, 2073, 1951, 1989, 1945, 3017, 2638, 2171, 1831, 1926, 1833],
  ["TV and Internet", 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399 ],
  ["Transport", 1830, 1830, 1830, 1830, 1950, 1950, 1450, 1450, 1950, 1950, 2050, 2050],
  ["Food", 23250, 23780, 24019, 24117, 24389, 24571, 24736, 24951, 25111, 25389, 25531, 25923],
  ["Rest", 4500, 3700, 5100, 3500, 2750, 4250, 7320, 8250, 3270, 4290, 3200, 8390]
]

(a) Ktheje në një DataFrame.

(b) Llogarit shpenzimet totale për cdo muaj (sa në Janar, sa në Shkurt, etj).

In [ ]:

Ushtrimi 4. Skedari data/LEB.csv përmban totalin Life Expectancy at Birth e personave të llogaritur në 5 vite.

(a) Ngarko këtët skedar në një DataFrame.

(b) Visualizo të dhënat.

Ushtrimi 5. Tek foto PE studentët praktikonin kërcime të gjata. Secili student kishte tre prova dhe të dhënat mblidhen në LongJump.csv të disponueshme në dosjen data. Rreshti i parë i skedarit është header.

(a) Ngarko këtë skeadr në një DataFrame.

(b) Vizualizoni të dhënat me një tabelë. (Bëhuni krijues.)

In [ ]:

Ushtrimi 6. Në URL e mëposhtme

https://raw.githubusercontent.com/resbaz/r-novice-gapminder-files/master/data/gapminder-FiveYearData.csv

mund të gjeni një tabelë në dispozicion të publikut me listën e vendeve në botë dhe disa parametra të zhvillimit ekonomik të shteteve të përmbledhura në intervalet pesë-vjeçare. Tabela ka kolonat e mëposhtme:

  • country
  • year
  • pop (= population)
  • continent
  • lifeExp (= life expextancy; how many years, on average, is a citizen of that country expected to live)
  • gdpPercap (= GDP per capitem; how much money, on average is US dollars, do citizens of that country earn)

Ngarko këtë tabelë në një DataFrame dhe shfaqni 20 rreshtat e parë, si dhe 10 rreshtat e fundit të tabelës.

In [ ]:

Ushtrimi 7. Shfaq tabelën nga URL

https://www.worldometers.info/world-population/population-by-country/

në një DataFrame dhe shfaq disa rreshta nga tabela.

In [ ]:

In [ ]:

© 2019 Petlja.org Creative Commons License