Nagy mennyiségű adatok feldolgozásánál elengedhetetlen dolog a számítógépek memóriáján (RAM) kívül a külső tárolókon (merevlemezek, egyéb adathordozók) tárolt file-ok használata is. A python beépített filekezelő függvényei¶ Ebben a fejezetben a python egyéb moduloktól független, alapvető fileműveleteket biztosító függvényeivel fogunk megismerkedni. Ezen függvények egy file tartalmát többnyire karakterláncok formájában kezelik, ezért konkrét formátumú adatok beolvasása, illetve kiírása némi bonyodalommal jár, melyeket legtöbbször valamilyen specifikusan az adott feladatra megírt függvény tesz lehetővé.
Előszöris az open() függvény segítségével megnyitjuk a beolvasni kívánt file-t. Az open() függvény egy előkészítő függvény, amely arra készíti fel a rendszert, hogy az adott merevelemezen (vagy más adattárolón) fellelhető file-lal dolgozni tudjunk. A fenti kódsor hatására a file1 változón keresztül férhetünk hozzá a file tartalmához. Figyelem, ne keverjük össze a file1 és az egeszfile változókat!
'#1. oszlop ev ho T[ev] napfolt_szam\n#2. oszlop honap\n#3. oszlop az ido evben merve \n#4. Ha megnézzük magát a file-t, akkor látható hogy tényleg ezek a dolgok vannak benne. A read() függvény előre specifikált számú karakter olvasását is lehetővé teszi. Látjuk tehát hogy a read() utasítás hatására könyörtelenül haladunk végig a file karakterein: úgy tűnhet, ha már egyszer valamit beolvastunk, akkor azt többé már nem tudjuk! A tell() függvényt alkalmazva a file1 változóra megkaphatjuk az aktuális folyampozíciót. A seek() parancs segítségével a file egy tetszőleges helyére ugorhatunk. A seek(n) függvény alkalmazásával a file n-edik karakterére ugrunk. Az alábbi parancs tehát a 5.
Hogy véletlenül se felejtsük el bezárni a file-t pythonban van egy kényelmes/hasznos konstrukció a with . Ez meghívja az adott objektum __enter__() es __exit__() tagfüggvényeit. Nagyon sok esetben az adatfile-okban hordozott információ táblázatszerűen van rendezve. Az file minden sora hasonló tagolással csoportosítja a számunkra értékes adatokat. ['#1. '#2. '#3. '#4. '#5. '#6. Amint látjuk, az első hat sor a '#' karakterrel kezdődik, és minden ilyen sor azt mondja meg hogy a tényleges adatok megfelelő oszlopa mit tartalmaz.
Egy karakterláncot a split() parancs segítségével adott karakterek mentén fel tudunk vágni egy listába. Az eredmény tehát egy lista mely tartalmazza az értékes adatokat, ugyan még mindig karakterláncok formájában! Az egyes elemeket lebegőpontos számmá a már ismert float() függvénnyel konvertálhatjuk. Nagy fájlok olvasása esetén nem érdemes, és néha nem is lehetséges, hogy egyszerre beolvassuk az egész fájlt a memóriába.
Mentés¶ Az adatok beolvasása mellett sokszor lehet szükség a feldolgozott információ újbóli kiírására. Erre a python az adatfolyam típusú változókra alkalmazott write() függvényt kínálja. Nyissunk meg egy file-t, amelybe írni szeretnénk, ezt az open() függvény mode kulcsszavas paraméterén keresztül tudjuk jelezni a mode='w' beállítással. Ha már meglévő file-hoz szeretnénk további karaktereket fűzni, akkor az open() függvény mode paraméterének mode='a' beállításával jelezzük ezt. Írjuk ki a mérési idő (meresi_ido) és a napfoltok számát tartalmazó (num_napfolt) adatokat a már fent létrehozott data/out_mentes1.dat file-ba. A beolvasáshoz hasonlóan a kiíratásnál is van lehetőség egész sorok kiírására. Ezt, talán nem túl meglepő módon a writelines() függvény valósítja meg.
Különös karakterek karakterláncokban¶ A fentiekben már többször is találkoztunk a sortörést jelölő '\n' karakterrel. Ehhez hasonlóan van néhány más úgynevezett literális karakter, amelynek speciális jelentése van. hexadecimális karakter hh..
Amint korábbiakban is láttuk, a numpy csomag array típusú változói számos előnyös tulajdonsággal rendelkeznek a sima list típusú változókhoz képest. A numpy csomag biztosít néhány hasznos filekezelő rutint, melyek az array tipusú változók file-ba kiírására, illetve file-okból történő beolvasására használhatóak. Elemezzük Felix Baumgartner ugrásának adatait. Az ugrás megtett út-idő adatait a data/h_vs_t file-ban találjuk. (Vizsgáljuk meg magát a file-t is! ) A file két oszlopnyi számot tartalmaz. Az első oszlop az idő s-ben, a második oszlop az adott időben mért magasság m-ben. Ábrázoljuk az adatokat!
Az ugrással kapcsolatban egy igen fontos kérdés volt, hogy vajon sikerült-e szabadesésben átlépni a hangsebességet? Vizsgáljuk meg, hogy ezen adatok alapján vajon átlépte-e Felix Baumgartner a hanghatárt! Először is szükség van a sebesség időfüggésére. Ezt a magasság--idő függvény numerikus deriváltjával fogjuk most meghatározni. $$\left . Definiáljunk most egy függvényt, mely két ugyanolyan hosszú tömb x és y adataiból legenerálja a két tömb numerikus derviáltját. d = zeros(n) # változó inicializálás. A wikipédián található adatok alapján a hangsebesség 25km magasságban valamivel 300 m/s alatt van.
Numpy bináris I/O¶ Nagy tömbök kiíratása szöveges fájlokba nagyon lassú lehet. Írjuk ki binárisan. Előfordulhat, hogy nem egy egyszerű táblázatot, vagy más fájlban könnyen reprezentálható dolgot akarunk lementeni. Nyitunk egy fájlt és abba tudunk írni. Töltsük be. Képek¶ Pythonban nagyon könnyen lehet képekkel is dolgozni. Képek manipulálásakor figyeljünk arra, hogy tipikusan uint8 típusú számokból állnak. Miután meghatároztuk a DNS térszerkezetét a fenti kék ábrából elmenthetjük a képet!
Egzotikus fájlok kezelése pythonban¶ A hdf fájlok¶ A Hierarchical Data Format vagy röviden hdf, egy széles körben elterjedt formátum nagymennyiségű tudományos adatok tárolására, és megosztására. Két fontos verziója használatos, melyek nem igazán kompatibilisek. A HDF5 fájlok esetében az értékes adatokat csoportokba, és alcsoportokba lehet rendezni, melyek között lehetőség van hivatkozásokat tenni. A HDF5 fájlok belső szerkezete két fő egységből építhető fel, mint ahogy az ábrán is látszik. Leíró részek azaz metadatok illetve maguk az adatok. Maga a HDF5 fájl belső csoportosítása hasonlóan hívható meg, mint egy hagyományos könyvtárstruktúra. Itt is definiálva van a "root" csoport, aminek alcsoportjai vannak, melyeknek (mint a könyvtárainknak) neveket adjhatunk. A h5py.File függvénnyel tudjuk a hdf5 állományokat megnyitni. Ebben a lépésben el kell dönteni, hogy olvasni, vagy írni szeretnénk a fájlt (lehet mindkettő is).
A HDF5 fájlok nagyon hatékonyan tudják a bonyolult adatszerkezeteket tárloni. A hatékony adattárolást nagyban segíti, hogy az adattömbök különböző relációkat és összefüggéseket is eltárolhatnak. A values() metódust alkalmazva látható, hogy ebben a mintafájlban csak 1 adatcsoport van, melynek a neve DS1. Fits fájlok (Flexible Image Transport System)¶ A fits a modern csillagászat legelterjetteb képformátuma. A fits állományoknak alapvetően 2 fő része van. Az egyik a fejléc, ami a kép elemezéséhez szolgáló információkat tárolja, míg a másik a ténylegesen megfigyelt adatsor. Ebből a két fő részegységből szegmensek építhetőek, és összefűzhetőek 1 fits állományba. Ezeket a szegmenseket hívjuk, HDU-nak (Header/Data Units). Egy fits állomány több HDU-ból is állhat. Szokás az első hdu-t az elsődleges (Primary), majd a többi hdu-t a kiterjesztett (Extend) jelzővel illetni. "BINTABLE": Binárisan (számunkra nem olvasható) tárolt többdimenziós adattábla. Ezen tárolási módban, az egyes cellákban is lehetőség van egy komplett tömb tárolására. A fits fájlok feldolgozásához szükség van az astropy csomagra. Ebből a gigász modulból is az astropy.io kezeli a fits képeket. A mellékelt adatok közt található a data/HorseHead.fits. Ennek a betöltött adatsornak több tulajdonsága is van. Az egyik ilyen, hogy megnézhetjük a benne levő HDU-kat. No. Ha kiválasztunk egy szegmenst, akkor lehetőség van megnézni a fejléc tartalmát a header opcióval. Magát a képi információt a data opcióval lehet kiolvasni a szegmensből. A csillagészatban használ fits állományok nagy előnye, hogy a képi információ mellet a fejléc olyan fontos információkat is tartalmaz, mint kép készítésének körülményei, illetve a kép pontos égi koordináták szerinti helyzetéről is vannak adatok.
Mindezek a modulok főleg gépi tanulásnál használják, bár a szimplább, itt bemutatott dolgokra is képesek. Ugyan úgy megtalálható bennük egy n dimenziós mátrix reprezentációjára használható adattípus, csak ndarray helyett tensor néven. A főbb különbség a performancián jön csak ki, ugyan is míg a NumPy csak CPU-n tud számolni, addig az említett két modulban szerepel GPU támogatás is, ami bizonyos esetekben gyorsabb. A kisebb mátrixműveletek elvégézésénél még a NumPy nyer sebességben, még GPU-n se verik meg, viszont ez főleg annak köszönhető, hogy a CPU sokkal gyorsabban eléri az adatot, mint a GPU.
Minden sor címkézve is van, ugyan úgy mint egy dictionary-ben. A model különlegessége az, hogy semmit nem számol addig, amíg meg nem kérjük rá külön a compute() függvényével. Így például főleg olyan esetekben használják, amikor több gépre osztanak le valamilyen műveletet. Bár kevesebb funkciót támogat mint a pandas, az alap (pl. Alapértelmezetten összeköti a pontokat, de a plot függvény
3. A subplot függvénynek 3 paramétere van. Így például a bar függvénnyel tudunk oszlopdiagrammokat készíteni. Készítsd el a foo függvényt, ami 2 mátrixot és egy string-et vár paraméterként. Ellenőrizd le, hogy a két mátrix alakja ugyan olyan. Ha nem, alaktísd át az egyiket (ha azonos elemszámúak akkor az elsőt, amúgy a nagyobbat) úgy, hogy megegyezzen az elemszámuk (a nagyobbat alakítsd vektorrá és vágd le a végét) és az alakuk is. Olvasd be a data1.csv és data2.csv fájlokat egy-egy változóba. Fűzd össze a két fájl tartalmát (a második fájl utolsó oszlopa nem egyezik meg az első fájl utolsó oszlopával, így először nevezd át a DataFrame-en belül). Töröld ki azokat a sorokat, ahol az "ip_address" oszlop üres. Töltsd ki a "gender" oszlop üres sorait úgy, hogy mindenhova az "Attack Helicopter" szó kerüljön. Az említett függvények további opcionális paramétereinek áttekintése (pl. Készíts el egy ábrát, amin az összes tanult grafikon szerepel).
Ezen kívül még mindegyik grafikont kirajzoló függvénynek használd legalább 2 opcionális paraméterét. A felhasznált adatok és címkék szabadon választhatóak, de legyenek valami értelmes mennyiségben (ne 3 érték szerepeljen egy hisztogrammon).

Ezen felül találhatók további példák és megjegyzések a különböző formátumú adatok, például a hdf5 és fits fájlok kezeléséről, a numpy és más modulok összehasonlításáról, valamint a gépi tanuláshoz szükséges adattípusokról és szelekciókról.
Adatbekérés felhasználótól – Python tutorial magyar felirattal – CodeBerry Programozóiskola
Az olvasott és írt adatok gyakorlati példáin keresztül látható, hogy a külső adathordozók használata elengedhetetlen a nagy adatmennyiségek esetén. A különböző formátumok (CSV, binary, HDF5, FITS, képek) mind-mind lehetővé teszik az adatok hatékony tárolását és feldolgozását. Az alapvető fileműveletek megértése nélkülözhetetlen a hatékony feldolgozás megértéséhez és alkalmazásához a valós adatproblémák megoldásában.
- Beolvasás és írás alapjai: open(), read(), write(), readlines(), writelines(), with.
- Szöveges vs bináris I/O, nagy tömbök kezelése és a memóriahatékonyság.
- Numpy, hdf5, fits és képfeldolgozás: miért hasznosak, hogyan használhatók.
- Gépi tanulásra felkészülés: tensorok, GPU-támogatás, performancia-összehasonlítás.
- Részletes példák: adatok összefűzése, hiányzó értékek kezelése, konverziók és átalakítások.