01 - Adatfájl beolvasása, maszkolás, rendezés

Olvasd be a data könyvtárban található cities.csv nevű fájlt! (A beolvasás előtt érdemes szövegszerkesztőben megnézni, hogyan néznek ki a sorok.) Ez a világ összes 15.000 főnél népesebb városának koordinátáit, országát, illetve népességét tartalmazza.

Keresd meg benne Európa összes 2.000.000-nál népesebb városát! Írasd ki őket lakosság szerint csökkenő sorrendbe rendezve!

Európát definiálja a következő téglalap:

  • délnyugati sarok (hosszúság, szélesség): -20.2,34.5
  • északkeleti sarok (hosszúság, szélesség): 42.7,72.4

02 - Adatfájlok beolvasása, egyszerű átlagszámítás

  • Olvassuk be a data/T_adat.csv fájlt pandas adattáblaként, majd számítsuk ki az évenkénti átlaghőmérsékletet az egyes hónapokra vonatkozó oszlopok átlagaként. Ábrázoljuk a kapott átlagértékeket az évszám függvényében.

  • Olvassuk be a data/co2_adat.txt fájlt pandas adattáblaként. A fájlban a sor elején elhelyezett "#" karakterek azokat a sorokat jelölik, melyek az értelmezést segítő megjegyzések, de az adatokat tartalmazó táblázatnak nem részei. Ábrázoljuk az évszám függvényében az évi átlagos $CO_2$-koncentrációt.

03 - Korreláció

Vessük össze az előző feladatban beolvasott két adattáblát.

  • Fésüljük össze a két adattáblát az éveket tartalmazó oszlop értékei alapján úgy, hogy csak azokhoz az évekhez tartozó sorok maradjanak meg, melyekhez mindkét táblázatban szerepel adat.

  • Az így kapott összefésült táblázatban nézzük meg, hogy a korábban kiszámolt éves átlaghőmérséklet mennyire korrelál az átlagos $CO_2$-koncentrációval. (Számoljunk korrelációt!) Ábrázoljuk az éves átlaghőmérsékletet a $CO_2$-koncentráció függvényében.

04 - Harry Potter

A data/hpattributes.txt a Harry Potter könyvek különböző szereplőinek adatait (id, schoolyear, gender, house) tartalmazzák a szereplők nevei nélkül. A nevek a data/hpnames.txt fájlban találhatók a megfelelő id-kkal ellátva.

(nemek: 1 - férfi, 2 - nő; házak: 1 - Griffendél, 2 - Hugrabug, 3 - Hollóhát, 4 - Mardekár)

  • Fésüljük össze a két adattáblát az "id" oszlop segítségével és írjuk ki a Hollóhátba járó diákokat a koruk szerint növekvő sorrendben, vagyis a legfiatalabbtól indulva.

  • Mennyi a Griffendélbe járó diákok átlagos életkora (2017-ben)? (A diákok 11 évesen kezdik a tanulmányaikat.)

  • Írjuk ki a táblázatban szereplő 5 leggyakoribb évet gyakoriság szerint csökkenő sorrendben.

05 - Figyelmetlen titkárnők

Gyakran előfordul, hogy olyan adatbázisokból kell értelmezhető eredményeket gyártani, amiket különböző helyeken, különböző elveket szem előtt tartva, kézzel gépeltek be. Ráadásul sok adat kézi bevitelekor számtalan figyelmetlenségi hiba is előfordul. Az ilyenek kezdeti kigyomlálása nagyon fontos lépése az adatelemzésnek.

A titkarno1.csv és a titkarno2.csv fájlokban tárolt adattáblákban magyar emberek alapvető személyi adatai találhatók, mint a név, születési dátum, nem, állampolgárság és TAJ-szám.

  • Az első titkárnő:
    • Az oszlopokat ";" jellel választja el egymástól,
    • a hiányzó adatokat a cellába tett "-" jellel jelzi,
    • a dátumokat a nap/hó/év formátumban (pl. 02/05/2016) jegyzi le,
    • a nem oszlopban a férfiakat "M" vagy "m", a nőket "F" vagy "f" betűvel jelöli,
    • az állampolgárság oszlopban a magyar állampolgárságot a "magyar", a "magy", illetve a "magy." sztringek valamelyikével jelöli.
  • A második titkárnő:
    • Az oszlopokat tabulátorral választja el egymástól,
    • a hiányzó adatok helyén vagy 0, vagy 1 vagy 2 szóközt üt,
    • a dátumokat az év/hó/nap formátumban (pl. 2016/05/02) jegyzi le,
    • a nem oszlopban a férfiakat a "ffi" vagy a "férfi" sztringek valamelyikével, a nőket a "nő" sztringgel jelöli,
    • az állampolgárság oszlopban a magyar állampolgárságot a "HUN" vagy "hun" sztringekkel jelöli.
  • Olvassuk be mindkét adattáblát (használjuk az encoding kulcsszóhoz a 'latin' értéket), majd fűzzük őket egy egységes formátumú adattáblába az alábbi szempontokat szem előtt tartva:
    • Ne legyenek se olyan sorok, se olyan oszlopok, melyekben az összes érték hiányzik.
    • A dátumok egységes formátumúak legyenek.
    • Egy oszlopon belül az azonos jelentésű dolgokat egyetlen érték kódolja. (Tehát pl. a "magyar", a "magy", a "magy.", a "HUN" és a "hun" állampolgárokra az állampolgárság oszlop azonos értéket tartalmazzon.)
    • Töröljük azokat a sorokat, ahol a név oszlopban nincs értelmezhető érték.
    • Az összes hiányzó értéket NaN-nal jelöljük.
    • Ha kettő vagy több embernek megegyezik a TAJ-száma, az összes ilyen embert töröljük a táblázatból.
  • Hány soros lesz az így kapott adattábla?
  • Ki a legfiatalabb és a legidősebb ember az adattáblában és ők hány évesek?

☠ 06 - apply

Olvassuk be a mintapéldákban tárgyalt data/json_example fájlt a mintapéldában bemutatott módon:

import pandas as pd
import json

d=[json.loads(s) for s in open("data/json_example").readlines()]
df = pd.DataFrame.from_dict(d)
  • Tegyük fel, hogy az azonos keresőszavakra érkezett találatok közül mindig a legnagyobb ID-jú a helyes. Az összes többit dobjuk is el az adattáblából.

  • Ezek után generáljunk egy új, "result long names" nevű oszlopot, ami a results oszlop értékéből kibányászott összes "long_name" értéket (mindegyiket egyszer) tartalmazza vesszőkkel elválasztva, sztringként. (Először írjuk meg a függvényt, ami a "long_name" értékek kiválasztását szolgálja egy adott sorra, majd ezt alkalmazzuk az összes sorra az apply() segítségével.)

  • Írjuk ki az összes olyan query-t, amire a "result long names" oszlop tartalmazza a "Sare Pol" sztringet.

☠ 07 - Érettségi adatok

Olvasd be egy pandas DataFrame-be a mintapéldában is használt érettségikről szóló adatfájlt!

Az ember gyakran hallja, hogy a lányok szóban jobban teljesítenek, mint a fiúk. Vegyük évenként csoportosítva az emelt szintű érettségik szóbeli pontszámának átlagát a lányokra és a fiúkra egy DataFrame-be, ábrázoljuk ezeket a DataFrame plot metódusának segítségével oszlopdiagramon! Megjelenik-e a nemek közötti különbség a szóbeli pontszámában?

☠ 08 - IMDB

A data/movie_metadata.csv fájl az IMDB adatbázisának egy viszonylag kis részletét tartalmazza. Az alábbi feladatok ábrázolás részeit a seaborn csomaggal valósítsuk meg.

  • Keressük meg az összes magyar nyelvű film címét.
  • Ábrázoljuk boxploton a különböző nyelvű filmekre az "imdb_score" értékét.
  • Ábrázoljuk a korrelációs mátrix alsó háromszögmátrixát a "num_critic_for_reviews", "duration", "director_facebook_likes", "cast_total_facebook_likes", "gross", "num_voted_users", "budget", "title_year" és "imdb_score" oszlopokra. Miket tapasztalunk?
  • Ki a top 10 legtöbbet likeolt színész a facebookon? (Ne felejtsük el, hogy a színészek az "actor_1_name", az "actor_2_name" és az "actor_3_name" oszlopokban is előfordulhatnak.)

☠ 09 - Gapminder

Reprodukáljuk részben a Gapminder projekt nevű interaktív gazdasági és szociális adatokat megjelenítő interaktív eszközét!

Készítsünk az itt megtalálható adatok alapján egy pandas adatbázist ami tartalmazza az országok várható életkor adatait és a GDP adatait. Ezen kívül minden országról tároljuk el a következő atribútumokat:

  • össz népesség
  • fő vallás
  • melyik kontinensen van

Ábrázoljuk minden országban a várható életkort a GDP függvényében. Az országokat jellemző marker méretét állítsuk be a népességük alapján. A markerek szinezését, hasonlóan a Gapminderhez lehessen változtatni. Egy legördülő menü alapján döntse el a program hogy az országokat vallás vagy kontinens alapján szinez.

☠ 10 - Dátumok kezelése, JSON

A Twitter szociális hálózaton a publikus üzeneteket egy részét bárki ingyen letöltheti. Ezekből néhányat megtalálhatsz a data/twitter_sample.gz fájlban.

Először olvasd be a tömörített fájl sorait egy listába a következő parancs segítségével:

import gzip
l=[json.loads(str(s).strip("\r\n")) for s in gzip.open("../data/twitter_sample.gz",mode="rt").readlines()]

A created_at nevű oszlop tartalmazza az üzenetek feladási dátumát. Ábrázold ez alapján, melyik percben hány darab tweetet adtak fel a felhasználók! Használd a datetime modul strptime() és strftime() függvényeit, melyeknek itt és itt tudsz utánaolvasni.

Figyelj arra, hogy nem minden sorban van created_at mező, az adatot nem tartalmazó sorokat ki kell dobni az adatokból!