{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Kennsluefni þetta var samið af Valborgu Sturludóttur og er gefið út undir leyfi CC 3.0, heimilt er að afrita, nota, deila og vinna áfram með efnið ef vísað er í höfund, óheimilt er að hagnast á efninu. \n",
"Kennsluefni þetta fylgir bókinni Python fyrir byrjendur - inngangur að forritun sem kom út í fyrstu útgáfu í ágúst 2022. \n",
"Þetta er fyrsta útgáfan af þessari verkefnabók, gefin út í ágúst 2022."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Gagnavinnsla\n",
"\n",
"Í þessari vinnubók kynnumst við því að vinna með mismunandi gögn, laga til gögn og sýna gögn.\n",
"\n",
"Gagnavinnsla er gríðarlega mikilvæg í hinum tæknivædda heimi. Í dag til aragrúi gagna, til þess að eitthvað vitrænt fáist úr þeim þarf sérfræðinga.\n",
"Það sem við ætlum að gera í þessari vinnubók er fyrst að skoða lista af listum sem geyma fyrir okkur gögn sem virðast vera ótengd en við ætlum að draga fram mikilvægustu hlutana svo að þau séu augljósari og auðveldari að vinna með.\n",
"\n",
"Næsta sem við ætlum að gera er að sækja gögn upp úr listanum okkar eftir inntaki frá notanda.\n",
"\n",
"Við viljum fá að vinna með gögn sem eru raunveruleg, því ætlum við að sækja gögn yfir netið og skoða þau.\n",
"\n",
"Að síðustu ætlum við að skoða kóðasafnið matplotlib
til þess að sýna þessi gögn okkar einhvern veginn myndrænt."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Búum til gögn til að vinna með\n",
"\n",
"Við viljum kunna að búa til eitthvað til að gera prófanir á.\n",
"Hér er gagnalisti
sem er mjög sérkennilegur, öll gögnin eru alveg eins.\n",
"\n",
"Öll gögnin eru sem sagt endurtekning á hausnum og við þurfum að laga það."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"gagnalisti = [\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"],\n",
" [\"auðkenni\", \"nafn\", \"skóstærð\", \"fjöldi skópara\", \"hæð\", \"hárlengd\", \"augnlitur\", \"símanúmer\", \"ofnæmi\"]\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"import random\n",
"from pprint import pprint # fyrir fallegri útprentun, þessu má sleppa, en það er notað seinna í vinnubókinni\n",
"\n",
"# Hér er grunnurinn að handahófskenndinni, \n",
"nofn = [\"Anna\", \"Bjarni\", \"Charlie\", \"Dagbjört\", \"Emil\", \"Friðrik\", \"Gréta\", \"Halldóra\", \"Ingvi\", \"Ísabella\", \"Jökull\", \"Kolbeinn\", \"Lísa\", \"Magnús\", \"Númi\", \"Oktavía\", \"Ólavía\", \"Pétur\", \"Rúnar\", \"Stefanía\", \"Trausti\", \"Una\", \"Úlla\", \"Viktoría\", \"Yngvi\", \"Þór\", \"Ævar\", \"Örlygur\"]\n",
"augu = [\"blár\", \"grænn\", \"grár\", \"brúnn\", \"ljós\", \"blágrár\", \"grænbrúnn\"]\n",
"simi = [\"6\", \"7\", \"8\"]\n",
"ofnaemi = [\"já\", \"nei\"]\n",
"\n",
"# Við viljum setja inn gögn í allar línur nema hausinn, þess vegna byrjum við í 1 en ekki 0\n",
"for i in range(1,len(gagnalisti)):\n",
" gagnalisti[i][0] = i\n",
" gagnalisti[i][1] = nofn[i-1]\n",
" gagnalisti[i][2] = random.randint(35, 45)\n",
" gagnalisti[i][3] = random.randint(1, 50)\n",
" gagnalisti[i][4] = str(1.5 + (2.1-1.5)*random.random())[0:4]\n",
" gagnalisti[i][5] = int(random.uniform(0, 100))\n",
" gagnalisti[i][6] = random.choice(augu)\n",
" gagnalisti[i][7] = random.choice(simi) + str(random.randint(100000, 999999))\n",
" gagnalisti[i][8] = random.choice(ofnaemi)\n",
" \n",
"pprint(gagnalisti)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Það vantar gögn!\n",
"\n",
"Við sjáum nú að fólkið í listanum hefur ekkert eftirnafn.\n",
"\n",
"Þetta má bæta með for-lykkju og insert aðferðinni á lista.\n",
"\n",
"Búið fyrst til lista sem þið getið sótt eða búið til eftirnöfn úr til að setja handahófskennd eftirnöfn á fólkið okkar.\n",
"\n",
"Eftirfarandi er beinagrind til að koma ykkur af stað:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"eftirnofn = [??]\n",
"\n",
"for ?? in ??:\n",
" # hér er verið að troða inn nýju staki í listann, fyrsta viðfangið er sætisnúmer staksins í gagnalistanum \n",
" # hitt viðfangið er stakið sem á að setja inn\n",
" gagnalisti[??].insert(??, ??)\n",
" \n",
"pprint(gagnalisti)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Of mikið af gögnum!\n",
"\n",
"Kemur í ljós að við megum alls ekki geyma viðkvæmar upplýsingar um heilsufar fólks (ofnæmi), eitthvað um að gagnagrunnurinn okkar uppfyllir ekki næga öryggisstaðla svo við verðum að henda þeim upplýsingum.\n",
"\n",
"Við þurfum að henda dálkinum úr hausnum líka, til þess að uppfylla kröfur um persónuvernd.\n",
"\n",
"Þetta má gera með for-lykkju og remove aðferðinni eða pop aðferðinni"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for ?? in ??:\n",
" gagnalisti[??].pop(??)\n",
" \n",
"pprint(gagnalisti)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Tilbúið til notkunar\n",
"\n",
"Gagnasafnið okkar er tilbúið og við bjóðum upp á að fletta upp í gagnasafninu okkar, það er hægt að gera með ýmsum hætti en við skulum byrja á að bjóða notandanum að velja einhvern dálk til að skoða.\n",
"\n",
"Við viljum beita input skipun og vera viss um að inntakið passi við það sem við búumst við því annars fáum við villu.\n",
"Við viljum halda áfram að spyrja sömu spurningarinn á meðan við höfum ekki fengið svar sem passar."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"osk = input(\"Hvaða gögn viltu sjá? auðkenni, nafn, skóstærð, fjöldi skópara, hæð, hárlengd, augnlitur, símanúmer, ofnæmi \")\n",
"while (?? in gagnalisti[0]):\n",
" print('vinsamlegst skrifaðu eitt af eftirfarandi')\n",
" osk = ??\n",
"visir = gagnalisti[0].index(osk)\n",
"for stak in gagnalisti:\n",
" print(stak[??])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Þá erum við tilbúin fyrir raunheiminn\n",
"\n",
"Alvöru gögn sem fundust á netinu! Við erum hér með í höndunum skrá, sem inniheldur gögn um dýr aðskilin með kommu (*comma separated values* eða CSV).\n",
"\n",
"Þetta eru tölulegar staðreyndir um hin ýmsu dýr sem við ætlum að skoða, þetta skjal er gagnagrunnur fyrir stokkaspil. Spilið má nálgast á sama stað og grunninn en við ætlum ekki að fara að spila, við ætlum að skoða gögnin.\n",
"\n",
"Skoðið gögnin hérna"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Töfrar\n",
"\n",
"Hér koma smá töfrar. Við sjáum hérna eina leið til þess að lesa gögn upp úr .csv skjali. Gögnin eru fengin með fyrirspurn (e. request) á slóðina, svo eru þau lesin á máta sem við getum notað upp úr fyrirspurninni og þá síðast búum við til orðabók fyrir hverja línu í skjalinu.\n",
"Í skjalinu var haus og við notum hausinn sem lykla í orðabókinni.\n",
"\n",
"Keyrið næstu sellu til að sjá hvernig gögnin líta núna út í Python týpu, annað en hrá textagögn úr hlekknum að ofan."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Ef gögnin spillast eða týnast, keyrið þá þessa sellu aftur\n",
"import csv\n",
"import requests\n",
"\n",
"url = 'https://raw.githubusercontent.com/valborg/statimals-deck-game/147ab658b2ad7e8d3cae9f8f71bff84a000dc345/gagnasafn.csv'\n",
"r = requests.get(url)\n",
"textinn = r.iter_lines(decode_unicode=True)\n",
"lesari = csv.DictReader(textinn, delimiter=',')\n",
"dyra_baekur = list(lesari)\n",
"\n",
"DYR_TIL_AD_PRENTA = 2\n",
"pprint(dyra_baekur[DYR_TIL_AD_PRENTA])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Hvað viljum við gera?\n",
"\n",
"Nú er ekkert vandamál í raun sem þarf að leysa en við getum búið okkur til ansi fjöldbreytt verkefni.\n",
"\n",
"Sjáið hvort þið getið:\n",
"