Ma 100500 XNUMX adattudományi kurzus létezik, és régóta köztudott, hogy az adattudományban a legtöbb pénzt az adattudományi kurzusokon lehet keresni (miért ásni, ha lehet lapátokat eladni?). Ezeknek a kurzusoknak a fő hátránya, hogy semmi közük a valódi munkához: senki nem ad tiszta, feldolgozott adatokat a szükséges formátumban. És amikor elhagyja a tanfolyamot, és elkezdi megoldani a valódi problémát, sok árnyalat jelenik meg.
Ezért elindítunk egy jegyzetsorozatot „Mi lehet a baj az adattudományban”, amely valós eseményeken alapul, amelyek velem, bajtársaimmal és kollégáimmal történtek. A tipikus Data Science feladatokat valós példák segítségével elemezzük: hogyan történik ez valójában. Kezdjük ma az adatgyűjtési feladattal.
És az első dolog, amibe az emberek belebotlanak, amikor elkezdenek valódi adatokkal dolgozni, az az, hogy összegyűjtik a számunkra legrelevánsabb adatokat. A cikk legfontosabb üzenete:
Szisztematikusan alábecsüljük az adatok gyűjtéséhez, tisztításához és előkészítéséhez szükséges időt, erőforrásokat és erőfeszítéseket.
És ami a legfontosabb, megbeszéljük, mit tegyünk ennek megakadályozása érdekében.
Különböző becslések szerint a tisztítás, átalakítás, adatfeldolgozás, jellemző tervezés stb. az idő 80-90%-át, az elemzés 10-20%-át vesz igénybe, miközben szinte minden oktatási anyag kizárólag az elemzésre fókuszál.
Nézzünk meg egy egyszerű analitikai problémát három változatban tipikus példaként, és nézzük meg, mik a „nehezítő körülmények”.
Példaként ismét megvizsgáljuk az adatgyűjtés és a közösségek összehasonlításának feladatának hasonló változatait:
Két Reddit alreddit
Két szakasza a Habr
Az Odnoklassniki két csoportja
Feltételes megközelítés elméletben
Nyissa meg az oldalt, és olvassa el a példákat, ha egyértelmű, szánjon néhány órát az olvasásra, néhány órát a kódra a példák és a hibakeresés segítségével. Adjon hozzá néhány órát a gyűjtéshez. Dobj be néhány órát tartalékba (szorozd meg kettővel és adj hozzá N órát).
Kulcspont: Az időbecslések feltételezéseken és találgatásokon alapulnak arra vonatkozóan, hogy mennyi ideig tart.
Az időelemzést a fent leírt feltételes probléma alábbi paramétereinek becslésével kell kezdeni:
Mekkora az adatok mérete, és mennyit kell belőlük fizikailag összegyűjteni (*lásd alább*).
Mennyi az egyik lemez gyűjtési ideje, és mennyit kell várni, mielőtt begyűjtheti a másodikat?
Fontolja meg olyan kód írását, amely elmenti az állapotot, és elindítja az újraindítást, ha (nem ha) minden meghiúsul.
Állapítsa meg, hogy szükségünk van-e engedélyre, és állítsa be az API-n keresztüli hozzáférés megszerzésének idejét.
Állítsa be a hibák számát az adatok összetettségének függvényében - értékelje ki egy adott feladathoz: struktúra, hány transzformáció, mit és hogyan kell kinyerni.
Javítsa ki a hálózati hibákat és a nem szabványos projektviselkedéssel kapcsolatos problémákat.
Mérje fel, hogy a szükséges funkciók szerepelnek-e a dokumentációban, és ha nem, akkor hogyan és mennyi szükséges a megoldáshoz.
A legfontosabb dolog az, hogy az idő becsléséhez - valójában időt és erőfeszítést kell szánni az "erőben lévő felderítésre" - csak akkor lesz megfelelő a tervezés. Ezért bármennyire is kényszerítik Önt arra, hogy „mennyi ideig tart az adatgyűjtés” – szánjon magának egy kis időt egy előzetes elemzésre, és érveljen azzal, hogy az idő mennyiben fog változni a probléma valós paramétereitől függően.
És most konkrét példákat mutatunk be, ahol ezek a paraméterek megváltoznak.
Kulcspont: A becslés a munka terjedelmét és összetettségét befolyásoló kulcstényezők elemzésén alapul.
A találgatásokon alapuló becslés akkor jó megközelítés, ha a funkcionális elemek elég kicsik, és nincs sok olyan tényező, amely jelentősen befolyásolhatja a probléma tervezését. De számos adattudományi probléma esetén az ilyen tényezők rendkívül sokasodnak, és ez a megközelítés alkalmatlanná válik.
A Reddit közösségek összehasonlítása
Kezdjük a legegyszerűbb esettel (mint később kiderül). Általánosságban, hogy őszinte legyek, szinte ideális esetünk van, nézzük meg a komplexitási ellenőrzőlistánkat:
Van egy ügyes, világos és dokumentált API.
Rendkívül egyszerű, és ami a legfontosabb, a tokent automatikusan megkapja.
Egy közösség, amely elemzi és adatokat gyűjt a redditen (még a python wrapper használatát elmagyarázó YouTube-videókhoz is) Például.
A szükséges módszerek valószínűleg az API-ban találhatók. Sőt, a kód kompaktnak és letisztultnak tűnik, az alábbiakban egy olyan funkció látható, amely összegyűjti a bejegyzésekhez fűzött megjegyzéseket.
def get_comments(submission_id):
reddit = Reddit(check_for_updates=False, user_agent=AGENT)
submission = reddit.submission(id=submission_id)
more_comments = submission.comments.replace_more()
if more_comments:
skipped_comments = sum(x.count for x in more_comments)
logger.debug('Skipped %d MoreComments (%d comments)',
len(more_comments), skipped_comments)
return submission.comments.list()
Annak ellenére, hogy ez a legjobb eset, mégis érdemes figyelembe venni számos fontos tényezőt a való életből:
API-korlátok - kénytelenek vagyunk kötegekben venni az adatokat (alvás a kérések között stb.).
Gyűjtési idő – a teljes elemzéshez és összehasonlításhoz jelentős időt kell félretennie ahhoz, hogy a pók végigmenjen a subredditen.
A botnak egy szerveren kell futnia – nem futtathatja egyszerűen a laptopján, berakhatja a hátizsákjába, és folytathatja a dolgát. Szóval mindent VPS-en futtattam. A habrahabr10 promóciós kód használatával további 10%-ot takaríthat meg a költségekből.
Egyes adatok fizikai hozzáférhetetlensége (az adminisztrátorok számára láthatóak vagy túl nehezen gyűjthetőek) – ezt figyelembe kell venni, elvileg nem lehet minden adatot megfelelő időben begyűjteni.
Hálózati hibák: A hálózatépítés fájdalmas.
Ez élő valós adat – soha nem tiszta.
Természetesen ezeket az árnyalatokat be kell építeni a fejlesztésbe. A konkrét órák/napok a fejlesztési tapasztalattól vagy hasonló feladatokon végzett munkavégzéstől függenek, azonban azt látjuk, hogy itt a feladat tisztán mérnöki jellegű, és nem igényel további testmozgásokat a megoldásához - minden nagyon jól felmérhető, ütemezhető és elvégezhető.
Habr szakaszok összehasonlítása
Térjünk át egy érdekesebb és nem triviális esetre a Habr szálainak és/vagy szakaszainak összehasonlítására.
Nézzük meg összetettségi ellenőrzőlistánkat - itt, hogy megértsük az egyes pontokat, egy kicsit bele kell ásni magába a feladatba, és kísérleteznie kell.
Először azt hiszed, hogy van API, de nincs. Igen, igen, a Habrnak van API-ja, de egyszerűen nem érhető el a felhasználók számára (vagy lehet, hogy egyáltalán nem működik).
Ezután elkezdi elemezni a html-t - „import kérések”, mi lehet a hiba?
Egyébként hogyan kell elemezni? A legegyszerűbb és leggyakrabban használt megközelítés az azonosítókon át történő iteráció, vegye figyelembe, hogy ez nem a leghatékonyabb, és különböző eseteket kell kezelnie – íme egy példa a valódi azonosítók sűrűségére az összes létező között.
A HTML-be csomagolt nyers adatok az internet tetején fájdalmasak. Például egy cikk értékelését szeretné összegyűjteni és menteni: kiszakította a pontszámot a html-ből, és úgy döntött, hogy számként menti el további feldolgozás céljából:
1) az int(score) hibát dob: mivel a Habré-n mínusz van, mint például a „–5” sorban - ez en kötőjel, nem mínusz (váratlanul, ugye?), így valamikor életre kellett keltennem az elemzőt egy ilyen szörnyű javítással.
Lehetséges, hogy nincs dátum, plusz és mínusz (amint fentebb a check_date függvényben látjuk, ez történt).
2) Nem szabadult speciális karakterek – jönni fognak, fel kell készülni.
3) A szerkezet a poszt típusától függően változik.
4) A régi bejegyzések **fura szerkezetű** lehetnek.
Lényegében a hibakezelést és azt, hogy mi történhet vagy nem, kezelni kell, és nem lehet biztosan megjósolni, hogy mi fog elromlani, és hogyan lehet máshol a szerkezet, és mi fog leesni, csak meg kell próbálni és figyelembe venni az értelmező által kiadott hibák.
Aztán rájössz, hogy több szálban kell elemezni, különben az egyben történő elemzés 30+ órát vesz igénybe (ez pusztán egy már működő egyszálas értelmező végrehajtási ideje, ami alszik és nem esik semmilyen tiltás alá). BAN BEN ezt cikket, ez valamikor hasonló sémához vezetett:
Összes ellenőrző lista összetettség szerint:
Hálózati munka és html elemzés iterációval és azonosító szerinti kereséssel.
Heterogén szerkezetű dokumentumok.
Sok helyen könnyen leeshet a kód.
Meg kell írni || kód.
Hiányzik a szükséges dokumentáció, kódpéldák és/vagy közösség.
A feladat becsült ideje 3-5-ször hosszabb lesz, mint a Redditből történő adatgyűjtésé.
Az Odnoklassniki csoportok összehasonlítása
Térjünk át a leírt technikailag legérdekesebb esetre. Számomra pont azért volt érdekes, mert első ránézésre elég triviálisnak tűnik, de egyáltalán nem az lesz - amint bottal böksz rá.
Kezdjük a nehézségi listánkkal, és vegyük észre, hogy sok közülük sokkal nehezebbnek bizonyul, mint elsőre tűnik:
Van API, de szinte teljesen hiányoznak a szükséges funkciók.
Bizonyos funkciókhoz levélben kell hozzáférést kérni, vagyis a hozzáférés megadása nem azonnali.
Rettenetesen dokumentált (eleve az orosz és az angol kifejezések keverednek mindenhol, és teljesen következetlenül - néha csak sejteni kell, hogy valahol mit akarnak tőled), ráadásul a tervezés nem alkalmas pl. , a funkció, amire szükségünk van.
Megköveteli a munkamenetet a dokumentációban, de valójában nem használja – és az API-módok minden bonyodalmát nem lehet megérteni azon kívül, hogy turkálunk, és reméljük, hogy valami sikerülni fog.
Nincsenek példák és nincs közösség, az információgyűjtésben az egyetlen támasz egy kicsi csomagolás Pythonban (sok használati példa nélkül).
A szelén tűnik a legmegfelelőbb megoldásnak, mivel sok szükséges adat zárolva van.
1) Vagyis az engedélyezés fiktív felhasználón keresztül történik (és kézzel történő regisztráció).
2) A Selenium esetében azonban nincs garancia a helyes és megismételhető munkára (legalábbis az ok.ru esetében biztosan).
3) Az Ok.ru webhely JavaScript-hibákat tartalmaz, és néha furcsán és következetlenül viselkedik.
4) Lapozást, elemek betöltését stb.
5) Az API-hibákat, amelyeket a burkoló ad, kínosan kell kezelni, például így (egy kísérleti kód):
def get_comments(args, context, discussions):
pause = 1
if args.extract_comments:
all_comments = set()
#makes sense to keep track of already processed discussions
for discussion in tqdm(discussions):
try:
comments = get_comments_from_discussion_via_api(context, discussion)
except odnoklassniki.api.OdnoklassnikiError as e:
if "NOT_FOUND" in str(e):
comments = set()
else:
print(e)
bp()
pass
all_comments |= comments
time.sleep(pause)
return all_comments
6) Végül a Selenium + API tűnik a legracionálisabb lehetőségnek.
Szükséges az állapot mentése és a rendszer újraindítása, sok hiba kezelése, beleértve a webhely inkonzisztens viselkedését - és ezeket a hibákat meglehetősen nehéz elképzelni (hacsak nem professzionálisan írod az elemzőket).
Ennek a feladatnak a feltételes időbecslése 3-5-szöröse lesz, mint a Habr-ból történő adatgyűjtésnél. Annak ellenére, hogy a Habr esetében frontális megközelítést alkalmazunk HTML elemzéssel, OK esetén pedig kritikus helyeken tudunk dolgozni az API-val.
Álláspontja
Bármennyire is szükséges egy terjedelmes adatfeldolgozó csővezeték modul „helyszíni” (ma tervezzük!) határidejének becslése, a végrehajtási idő szinte soha nem becsülhető meg minőségileg is a feladat paramétereinek elemzése nélkül.
Kicsit filozófiaibb értelemben az agilis becslési stratégiák jól működnek a mérnöki feladatoknál, de a kísérletibb és bizonyos értelemben „kreatív” és feltáró jellegű, azaz kevésbé kiszámítható problémák nehézségeket okoznak, mint a hasonló témák példáiban. amit itt megbeszéltünk.
Természetesen az adatgyűjtés csak ékes példa – általában hihetetlenül egyszerű és technikailag nem bonyolult feladat, és az ördög gyakran a részletekben rejlik. És pontosan ezen a feladaton tudjuk megmutatni a lehetséges lehetőségek teljes skáláját, hogy mi hibázhat, és pontosan mennyi ideig tarthat a munka.
Ha további kísérletek nélkül rápillantunk a feladat jellemzőire, akkor a Reddit és az OK hasonlónak tűnik: van API, python wrapper, de lényegében óriási a különbség. Ezekből a paraméterekből ítélve a Habr-féle pars bonyolultabbnak tűnik, mint az OK-nak – a gyakorlatban azonban ennek éppen az ellenkezője van, és pontosan ez derül ki egyszerű kísérletekkel a probléma paramétereinek elemzésére.
Tapasztalataim szerint az a leghatékonyabb megközelítés, ha hozzávetőlegesen megbecsüljük magához az előzetes elemzéshez és az egyszerű első kísérletekhez szükséges időt, elolvasva a dokumentációt – ezek segítségével pontos becslést adhatunk a teljes munkára. Az elterjedt agilis módszertan kapcsán kérem, hogy készítsen egy jegyet a „feladat paraméterek becslésére”, amely alapján felmérhetem a „sprinten” belül mit lehet teljesíteni, és pontosabb becslést tudok adni mindegyikre. feladat.
Ezért a leghatékonyabb érvnek az tűnik, amely megmutatja egy „nem műszaki” szakembernek, hogy mennyi idő és erőforrás fog változni a még értékelendő paraméterek függvényében.