9. Renditja, filtrimi dhe analiza e frekuencës

Në këtë leksion ne demonstrojmë:

  1. si të renditni rreshtat e tabelës;
  2. si të filtrohen rreshtat e një tabele që plotësojnë disa kritere; dhe
  3. si të kryhet analiza e frekuencës në rreshtat e një tabele.

9.1. Renditja

Kujtoni se për të renditur një sekuencë do të thotë të rendisni anëtarët e saj në një mënyrë në rritje (ose në rënie). Të renditni rreshtat e një tabele do të thotë të rirregulloni rreshtat në mënyrë që vlerat në një kolonë të veçantë të renditen. Tani do të tregojmë se si të renditim shpejt tabelat duke përdorur bibliotekën pandas. Le të ngarkojmë së pari librarinö:

In [1]:
import pandas as pd

Shikoni shembullin që kemi analizuar tashmë në ligjëratat e mëparshme:

In [2]:
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]]
students_df = pd.DataFrame(students)
students_df.columns=["Name", "Sex", "Age", "Weight", "Height"]
students_ix=students_df.set_index("Name")

Tabela duket si kjo:

In [3]:
students_ix
Out[3]:
Sex Age Weight Height
Name
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

Funksioni sort_values rendit rreshtat e një tabele në mënyrë që vlerat në një kolonë të veçantë të renditen. Emri i kolonës që duam të renditemi quhet kriteri sorting. Ne specifikojmë kriterin e klasifikimit duke përdorur opsionin by si kjo:

In [4]:
students_by_height = students_ix.sort_values(by="Height")
students_by_height
Out[4]:
Sex Age Weight Height
Name
Colin m 13 47 157
Jane f 13 45 158
Fred m 13 45 159
Anne f 13 46 160
Gloria f 14 49 161
Kate f 14 51 162
Ethan m 15 56 163
Hellen f 15 52 164
Ben m 14 52 165
Diana f 15 54 165
Ian m 15 57 167

Rendi i paracaktuar i renditjes_ është ascending, që do të thotë që rreshtat e tabelës do të riorganizohen në mënyrë që vlerat në kolonën "Height" të rriten. Nëse dëshirojmë të renditim tabelën në mënyrë që rreshti i parë të përmbajë studentin më të lartë, ne duhet të thërrasim funksionin me një opsion shtesë ascending = False:

In [5]:
students_by_height = students_ix.sort_values(by="Height", ascending=False)
students_by_height
Out[5]:
Sex Age Weight Height
Name
Ian m 15 57 167
Ben m 14 52 165
Diana f 15 54 165
Hellen f 15 52 164
Ethan m 15 56 163
Kate f 14 51 162
Gloria f 14 49 161
Anne f 13 46 160
Fred m 13 45 159
Jane f 13 45 158
Colin m 13 47 157

Më në fund, le të vizualizojmë lartësinë dhe peshën e studentëve në tabelën e renditur (vini re se tabela është renditur sipas lartësisë, por kjo nuk do të thotë se kolonat e mbetura janë gjithashtu të renditura):

In [6]:
import matplotlib.pyplot as plt
plt.figure(figsize=(10,5))
plt.bar(students_by_height.index, students_by_height["Height"], label="Height")
plt.bar(students_by_height.index, students_by_height["Weight"], label="Weight")
plt.title("The height and the weight of students in the group")
plt.legend()
plt.show()
plt.close()
<Figure size 1000x500 with 1 Axes>

9.2. Filtrimi i të dhënave

Shpesh duhet të kalojmë nëpër një tabelë dhe të veçojmë rreshtat që plotësojnë disa kritere. Për shembull, nëse dëshirojmë të përqendrohemi në të dhënat vetëm për femrat, ne mund t'i filtrojmë këto rreshta dhe t'i paketojmë ato në një tabelë të re si kjo:

girls = students_ix[students_ix.Sex == "f"]
In [7]:
girls = students_ix[students_ix.Sex == "f"]
girls
Out[7]:
Sex Age Weight Height
Name
Anne f 13 46 160
Diana f 15 54 165
Gloria f 14 49 161
Hellen f 15 52 164
Jane f 13 45 158
Kate f 14 51 162

Kjo do të veçojë studentët me peshë më shumë se 50 kg:

In [8]:
over_50kg = students_ix[students_ix.Weight > 50]
over_50kg
Out[8]:
Sex Age Weight Height
Name
Ben m 14 52 165
Diana f 15 54 165
Ethan m 15 56 163
Hellen f 15 52 164
Ian m 15 57 167
Kate f 14 51 162

Ne gjithashtu mund të kombinojmë kriteret. Për shembull, nëse dëshirojmë të përqendrohemi te djemtë me peshë jo më shumë se 55 kg, duhet të kombinojmë dy kritere:

Weight <= 55  dhe  Sex == "m".

Libraria pandas përdor simbolin&për të kombinuar kriteret në rastet kur të dy duhet të jenë të përmbushur:

In [9]:
boys_55kg = students_ix[(students_ix.Weight <= 55) & (students_ix.Sex == "m")]
boys_55kg
Out[9]:
Sex Age Weight Height
Name
Ben m 14 52 165
Colin m 13 47 157
Fred m 13 45 159

Le të vizualizojmë gjatësinë dhe peshën e këtyre djemve:

In [10]:
plt.figure(figsize=(6,6))
plt.bar(boys_55kg.index, boys_55kg["Height"], label="Height")
plt.bar(boys_55kg.index, boys_55kg["Weight"], label="Weight")
plt.title("Boys with not more than 55 kg")
plt.legend()
plt.show()
plt.close()

Skedari data / LongestRiversOfEurope.csv përmban listën e 25 lumenjve më të gjatë në Evropë. Kjo tabelë ka pesë kolona:

  • River = emri i lumit,
  • Length = gjatësia e lumit në km,
  • Countries = një varg me të gjitha vendet ku rrjedh lumi,
  • Mouth = deti / oqeani / liqeni ku derdhet lumi, dhe
  • Via = "(directly)" nëse lumi rrjedh direkt në det / oqean / liqen; përndryshe emri i lumit përmes të cilit derdhet në det / oqean / liqen.

Le ta ngarkojmë skedarin në një DataFrame, ta indeksojmë atë me kolonën "River" dhe të shfaqim linjat e para të tabelës:

In [11]:
rivers = pd.read_csv("data/LongestRiversOfEurope.csv").set_index("River")
rivers.head()
Out[11]:
Length Countries Mouth Via
River
Western Dvina 1020 "Belarus; Latvia; Russia; Lithuania; Estonia" Gulf of Riga (directly)
Elbe–Vltava 1252 "Czech Republic; Germany" North Sea (directly)
Elbe 1091 "Czech Republic; Germany" North Sea (directly)
Loire 1013 "France" Atlantic Ocean (directly)
Danube 2860 "Germany; Austria; Slovakia; Hungary; Croatia;... Black Sea (directly)

Lista e vendeve përmes të cilave rrjedh lumi përfaqësohet nga një string. Nëse dëshirojmë të filtrojmë të gjithë lumenjtë që rrjedhin, të themi, Gjermania, duhet të kontrollojmë nëse string i ruajtur në Countries përmban "Germany" si një substring:

In [12]:
rivers[rivers.Countries.str.contains("Germany")]
Out[12]:
Length Countries Mouth Via
River
Elbe–Vltava 1252 "Czech Republic; Germany" North Sea (directly)
Elbe 1091 "Czech Republic; Germany" North Sea (directly)
Danube 2860 "Germany; Austria; Slovakia; Hungary; Croatia;... Black Sea (directly)
Rhine 1236 "Switzerland; Liechtenstein; Austria; Germany;... North Sea (directly)

9.3. Analiza e frekuencës

Kujtoni që frequency Analysis shkurtohet për të llogaritur sa herë secila vlerë ndodh në sekuencë. Libraria pandas ka një funksion të dobishëmvalue_counts që mund ta bëj për ne. Për shembull, le të numërojmë djemtë dhe vajzat në tabelën e mësipërme:

In [13]:
students_ix["Sex"].value_counts()
Out[13]:
f    6
m    5
Name: Sex, dtype: int64

Pra value_counts zbuloi se në këtë tabelë ka 6 rreshta që kanë "f"në kolonën "Sex "dhe 5 rreshta që kanë "m" në kolonën "Sex". Prandaj, janë 6 vajza dhe 5 djem në grup. Pra value_counts zbuloi se në këtë tabelë ka 6 rreshta që kanë "f"në kolonën "Sex "dhe 5 rreshta që kanë "m" në kolonën "Sex". Prandaj, janë 6 vajza dhe 5 djem në grup.

Kur bëhet fjalë për moshën e studentëve në grup kemi situatën e mëposhtme:Kur bëhet fjalë për moshën e studentëve në grup kemi situatën e mëposhtme:

In [14]:
students_ix["Age"].value_counts()
Out[14]:
15    4
13    4
14    3
Name: Age, dtype: int64

Janë 4 studentë të moshës 15, 4 studentë të moshës 13 dhe 3 studentë të moshës 14 vjeç.

Mund të vendosim rezultatin e funksionit value_counts në një variabël për referencë të mëtejshme:

In [15]:
freq = students_ix["Sex"].value_counts()
freq
Out[15]:
f    6
m    5
Name: Sex, dtype: int64

Ne mund të kemi lehtësisht qasje në artikujt që janë identifikuar në kolonën "Sex" dhe frekuencat e tyre:

freq.index

jep listën e sendeve, ndërsa

freq.values

jep frekuencat e tyre.

In [16]:
print("Items identified in the column:", freq.index)
print("Their frequences:", freq.values)
Items identified in the column: Index(['f', 'm'], dtype='object')
Their frequences: [6 5]

Struktura e grupit sipas gjinisë mund të vizualizohet kështu:

In [17]:
import matplotlib.pyplot as plt
freq = students_ix["Sex"].value_counts()
plt.figure(figsize=(6,6))
plt.pie(freq.values, labels=freq.index)
plt.title("The structure of the group by gender")
plt.show()
plt.close()

Në mënyrë analoge, ne mund të vizualizojmë strukturën e grupit sipas moshës:

In [18]:
freq = students_ix["Age"].value_counts()
plt.figure(figsize=(6,6))
plt.pie(freq.values, labels=freq.index)
plt.title("The structure of the group by age")
plt.show()
plt.close()

Si një shembull i fundit le të gjejmë shpërndarjen e vendeve sipas kontinenteve. Në URL-në vijuese

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

ju mund të gjeni një listë të disponueshme publikisht për të gjitha vendet në botë. Le të fillojmë duke ngarkuar listën në një DataFrame:

In [19]:
countries = pd.read_csv("https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv")
countries.head(5)
Out[19]:
Country Region
0 Algeria AFRICA
1 Angola AFRICA
2 Benin AFRICA
3 Botswana AFRICA
4 Burkina AFRICA

Numri i vendeve për çdo kontinent tani mund të përcaktohet lehtësisht:

In [20]:
countries["Region"].value_counts()
Out[20]:
AFRICA           54
EUROPE           47
ASIA             44
NORTH AMERICA    23
OCEANIA          14
SOUTH AMERICA    12
Name: Region, dtype: int64

dhe vizualizohet:

In [21]:
by_continents = countries["Region"].value_counts()
plt.figure(figsize=(8,8))
plt.pie(by_continents.values, labels=by_continents.index)
plt.title("The distributiuon of countries by continents")
plt.show()
plt.close()

9.4. Ushtrime

Ushtrimi 1. Dosja data / LongestRiversOfEurope.csv përmban listën e 25 lumenjve më të gjatë në Evropë. Kjo tabelë ka pesë kolona:

  • River = emri i lumit,
  • Length = gjatësia e lumit në km,
  • Countries = një varg me të gjitha vendet ku rrjedh lumi,
  • Mouth = deti / oqeani / liqeni ku derdhet lumi, dhe
  • Via = "(direkt)" nëse lumi rrjedh direkt në det / oqean / liqen; përndryshe emri i lumit përmes të cilit derdhet në det / oqean / liqen.

(a) Vendosni skedarin në një DataFrame, indeksoni atë në kolonën "River" dhe shfaqni rreshtat e parë të tabelës.

(b) Renditni tabelën sipas gjatësisë në mënyrë që lumi më i gjatë në Evropë të jetë në majë.

(c) Sa prej 25 lumenjve më të gjatë të Evropës rrjedhin nëpër Rusi, sa në Gjermani dhe sa përmes Lihtenshtajnit?

(d) Për një tabelë të re që përbëhet vetëm nga ato lumenj që rrjedhin drejtpërdrejt në një det / oqean / liqen, hiqni rreshtin "Via" dhe shkruani tabelën në skedarin data/FLowDirectly.csv

Ushtrimi 2. Këtu janë fakte ushqyese për disa ushqime deti:

Product (100g) Nutritive value (kcal) Carbohydrates (g) Proteins (g) Fats (g)
Tuna 116 0 26 1
Hake 88 0 17.2 0.8
Trout 119 0 18 5
Salmon 116 0 20 3.5
Mackerel 205 0 19 14
Sardines 135 0 18 5
Hеrring 158 0 18 9
Cod 82 0 18 0.7
Catfish 95 0 16.4 2.8
Carp 127 0 17.6 5.6
Gilthead 115 0 16.5 5.5
Eel 184 0 18.4 11.7
Shrimp 106 1 20 2
Mussels 86 4 12 2
Prawns 71 1 13 1
Squid 92 3 15.6 1.3
Octopus 81 0 16.4 0.9
Lobster 112 0 20 1.5

Kjo tabelë mund të përfaqësohet në një listë si kjo:

In [22]:
sea_food = [
  ["Tuna", 116, 0, 26, 1],
  ["Hake", 88, 0, 17.2, 0.8],
  ["Trout", 119, 0, 18, 5],
  ["Salmon", 116, 0, 20, 3.5],
  ["Mackerel", 205, 0, 19, 14],
  ["Sardines", 135, 0, 18, 5],
  ["Hеrring", 158, 0, 18, 9],
  ["Cod", 82, 0, 18, 0.7],
  ["Catfish", 95, 0, 16.4, 2.8],
  ["Carp", 127, 0, 17.6, 5.6],
  ["Gilthead", 115, 0, 16.5, 5.5],
  ["Eel", 184, 0, 18.4, 11.7],
  ["Shrimp", 106, 1, 20, 2],
  ["Mussels", 86, 4, 12, 2],
  ["Prawns", 71, 1, 13, 1],
  ["Squid", 92, 3, 15.6, 1.3],
  ["Octopus", 81, 0, 16.4, 0.9],
  ["Lobster", 112, 0, 20, 1.5]]

(a) Kthejeni këtë listë në një DataFrame, emërtoni kolonat siç duhet dhe indeksoni tabelën.

(b) Renditni tabelën sipas vlerës ushqyese dhe vizualizoni të dhënat duke përdorur një tabelë.

(c) Bëni analizën e frekuencës së kësaj tabele sipas sasisë së karbohidrateve dhe vizualizoni rezultatin tuaj përmes një pie chart.

(d) Vendosni të gjithë ushqimin e detit pa karbohidrate dhe më pak se 10 g yndyrna për 100 g në një tabelë të re.

Ushtrimi 3. Në një leksion të 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) Ngarkoje në një DataFrame.

(b) Shtoni një tabelë të re "Max" në tabelë dhe për secilin student llogarit kërcimin më të mirë.

(c) Renditni tabelën sipas "Max" dhe tregoni pesë rreshtat e parë të tabelës së renditur.

(d) Gjeni ata studentë që kanë bërë të paktën një kërcim faull. Hedhjet e gabimeve regjistrohen si 0.

Ushtrimi 4. Lista e mëposhtme përmban disa informacione themelore për një grup studentësh: mbiemrin, emrin, emrin e studentit, klasën ku marrin pjesë dhe mesataren e notave të tyre:

In [23]:
student = [
    ["Peterson",    "Peter",   "0308003800019", "m", 8, 4.52],
    ["Janesdottir", "Jane",    "1210003805026", "f", 8, 5.00],
    ["Annesdottir", "Anne",    "1105004805019", "f", 7, 4.11],
    ["Verasdottir", "Vera",    "2901005705011", "f", 6, 5.00],
    ["Georgsson",   "George",  "1504005700012", "m", 6, 3.12],
    ["Michaelson",  "Michael", "1506004400056", "m", 7, 2.51],
    ["Michaelson",  "Peter",   "1506004400057", "m", 7, 2.48],
    ["Smith",       "Nathan",  "2109003800046", "m", 8, 3.58],
    ["Smith",       "Jane",    "2109003805021", "f", 8, 4.21]
]

(a) Kthejeni në një DataFrame.

_(b)_Vizualizoni strukturën gjinore të grupit me një tabelë pie.

(c) Vizualizoni strukturën moshore të grupit me një tabelë pie (bazoni analizën tuaj në klasën ku merr pjesë studenti).

(d) Cila kolonë është zgjidhja më e mirë për një kolonë indeksi?

(e) Vendosni të gjithë nxënësit e klasës së 8-të në një tabelë të re.

(f) Vendosni të gjithë djemtë, nota mesatare e të cilëve është më pak se 4.50 në një tabelë të re.

Ushtrimi 5. Në URL më poshtë:

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 të gjitha vendeve në botë dhe disa parametra të zhvillimit ekonomik për secilin vend. Tabela ka gjashtë kolonat:

  • country
  • year = viti në të cilin llogariten parametrat ekonomikë
  • pop = population
  • continent
  • lifeExp = jetegjatësia
  • gdpPercap = GDP per popullsi

(a) Ngarkoje këtë tabelë në një DataFrame.

(b) Vendosni të gjitha të dhënat që i referohen vendit tuaj në një tabelë të re (përdorni një kriter filtrimi si ky: table[table.country == "Serbia"]) dhe shkraujeni në një skedar.

(c) Shfaqni ndryshimin e jetëgjatësisë së vendit tuaj në kohë me një grafik vijash

(d) Shfaqni ndryshimet në PBB në vendin tuaj me një tabelë me kolona.

© 2019 Petlja.org Creative Commons License