TĂ€napĂ€eval on olemas 100500 Data Science'i kursust ja on ammu teada, et enim raha saab teenida just Data Science'i kursustega (miks kaevata, kui saab labidaid mĂŒĂŒa?). Nende kursuste peamine miinus on see, et need ei oma mitte midagi pistmist reaalse tööga: keegi ei anna teile katkematuid, töödeldud andmeid vajaliku formaadina. Ja kui te kursustega lĂ”petate ja hakkate lahendama tĂ”elist probleemi, selguvad palju nĂŒansse.
SeetĂ”ttu alustame mĂ€rkmike seeriat "Mis vĂ”ib Data Science'iga valesti minna", mis on pĂ”hinenud minu, minu sĂ”prade ja kolleegide tegelikel juhtumitel. Vaatame reaalseid nĂ€iteid tĂŒĂŒpilistest Data Science'i ĂŒlesannetest: kuidas see tegelikult kĂ€ib. Alustame tĂ€na andmete kogumise ĂŒlesandega.
Ja esimene asi, millele inimesed, kes hakkavad töötama reaalsete andmetega, takerduvad, on selle samade meie jaoks asjakohaste andmete kogumine. Selle artikli peamine sÔnum:
Me alahindame sĂŒsteemselt aega, ressursse ja pingutusi andmete kogumiseks, puhastamiseks ja ettevalmistamiseks.
Ja kÔige tÀhtsam, arutame, mida teha, et seda vÀltida.
Erinevate hinnangute kohaselt kulub andmete puhastamisele, töötlemisele, omaduste inseneerimisele jne 80-90% ajast, samas kui analĂŒĂŒsile vaid 10-20%, kuigi praktiliselt kogu Ă”ppeaine keskendub ainult analĂŒĂŒsile.
Vaatame, kuidas tĂŒĂŒpiline lihtne analĂŒĂŒs ĂŒlesanne kĂ€ib kolmes variandis ja nĂ€eme, millised vĂ”ivad olla "leebed asjaolud".
Ja nĂ€iteks vaatame taas sarnaseid andmete kogumise ĂŒlesande variatsioone ja vĂ”rreldes kogukondi:
- Kahest Redditi subreddidist
- Kahest Habra osast
- Kahest Klassikaaslaste grupist
Teoreetiline lÀhenemine
Ava veebileht ja loe nÀiteid, kui on selge, pane paar tundi lugemiseks, paar tundi koodi nÀidetele ja tÔrkeotsingule. Lisa paar tundi kogumisele. Lisa paar tundi varuks (korda kahel ja lisa N tundi).
Peamine punkt: ajahinnang pÔhineb oletustel ja arvamistel selle kohta, kui kaua see aega vÔtab.
Aja analĂŒĂŒsi alustamiseks on vajalik hinnata jĂ€rgmisi parameetreid tingimuslikuks ĂŒlesandeks, nagu eespool kirjeldatud:
- Mis on andmete maht ja kui palju tuleb fĂŒĂŒsiliselt koguda (*vt allpool*).
- Kui kaua vĂ”tab ĂŒhe salvestuse kogumine ja kui kaua tuleb oodata, enne kui saab koguda teise.
- Koodide kirjutamise kinnitamine, mis salvestab oleku ja alustab uuesti, kui (ja mitte kui) kÔik kukub.
- Selgitada vÀlja, kas meil on vaja autentimist ja hÔlmata API-juurdepÀÀsu saamise aega.
- Logige veateateid andmete keerukuse funktsioonina - hinnake konkreetse ĂŒlesande alusel: struktuur, mitu muundurit, mida ja kuidas ekstrakteerime.
- Hinnake vÔrgu vigu ja probleemid projekti ebatavalise kÀitumise tÔttu.
- Hinnake, kas vajalikud funktsioonid on dokumentatsioonis olemas ja kui ei, siis kui palju ja milliseid lahendusi on vaja.
Oluline on see, et aja hindamiseks peate tegelikult kulutama aega ja vaeva «lahingu uurimiseks» - ainult siis on teie planeerimine adekvaatne. SeetĂ”ttu, kui teid surutakse ĂŒtlema «kui palju aega on vaja andmete kogumiseks» - leidke aega esialgseks analĂŒĂŒsiks ja argumenteerige, et aeg varieerub sĂ”ltuvalt ĂŒlesande tegelikest parameetritest.
Ja nĂŒĂŒd nĂ€itame konkreetseid nĂ€iteid, kus sellised parameetrid muudavad.
Oluline punkt: hindamine pĂ”hineb vĂ”tmetegurite analĂŒĂŒsil, mis mĂ”jutavad töö mahtu ja keerukust.
Hindamine, mis pĂ”hineb oletustel - see on hea lĂ€henemine, kui funktsionaalsed elemendid on piisavalt vĂ€ikesed ja tegureid, mis vĂ”ivad ĂŒlesande struktuuri olulisel mÀÀral mĂ”jutada, ei ole liiga palju. Kuid paljude Data Science'i ĂŒlesannete puhul muutub selliseid tegureid ÀÀrmiselt palju ja selline lĂ€henemine muutub ebapiisavaks.
Redditi kogukondade vÔrdlemine
Alustame kĂ”ige lihtsama juhtumiga (kuidas hiljem selgub). Ăldiselt, kui olla tĂ€iesti aus, on meie ees praktiliselt ideaalne juhtum, kontrollime meie keerukuse kontrollnimekirja:
- On olemas korras, arusaadav ja dokumenteeritud API.
- E ÀÀretult lihtne ja peamine, et token saadakse automaatselt.
- Jah â palju nĂ€idiseid.
- Kogukond, mis tegeleb andmete analĂŒĂŒsi ja kogumisega Redditis (kuni YouTube'i videoteni, mis selgitavad, kuidas kasutada python wrapper'it) .
- Meie vajalikud meetodid tÔenÀoliselt eksisteerivad API-s. Veelgi enam, kood nÀeb vÀlja kompaktne ja puhas, allpool on nÀide funktsioonist, mis kogub postituste kommentaare.
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()
VÔetud mugavuste utiliitide valik.
Kuigi meil on parim vÔimalik olukord, tuleb siiski arvesse vÔtta mitmeid olulisi tegureid reaalsest elust:
- API piirangud â oleme sunnitud andmeid partiide kaupa vĂ”tma (ootama pĂ€ringute vahel jne).
- Kogumise aeg â pĂ”hjalikuks analĂŒĂŒsiks ja vĂ”rdlemiseks peab arvestama mĂ€rkimisvÀÀrset aega, et Ă€mblik saaks alajaotuse lĂ€bi vaadata.
- Pott peab töötama serveris â te ei saa seda lihtsalt sĂŒlearvutisse kĂ€ivitada, seljakotti panna ja asju ajama minna. SeetĂ”ttu jooksutasin kĂ”ik VPS-is. Kasutades kupongi habrahabr10, saate sÀÀsta veel 10% hinnast.
- MĂ”nede andmete fĂŒĂŒsiline kĂ€ttesaamatus (need on nĂ€htavad administraatoritele vĂ”i liiga keerulised koguda) â seda tuleb arvesse vĂ”tta, mitte kĂ”ik andmed ei pruugi normaalse ajaga kergesti kĂ€tte saada.
- VĂ”rgutöö vead: töötamine vĂ”rgus â see on piin.
- Need on elavad tĂ”elised andmed â need ei ole kunagi puhtad.
Muidugi tuleb arvesse vĂ”tta nĂ€idatud nĂŒansse arendusse. Konkreetne tundide/pĂ€evade arv sĂ”ltub arenduse kogemusest vĂ”i sarnaste ĂŒlesannete tĂ€itmise kogemusest, kuid me nĂ€eme, et see ĂŒlesanne on rangelt inseneritehniline ega nĂ”ua tĂ€iendavaid pingutusi lahendamiseks â kĂ”ike saab vĂ€ga hĂ€sti hinnata, ĂŒles kirjutada ja teha.
Habrasektsioonide vÔrdlemine
Liigume edasi huvitavama ja mittetriviaalsete juhudeni, vÔrreldes vooge ja/vÔi Habrasektsioone.
Kontrollime meie keerukuse kontrollnimekirja â siin, et mĂ”ista iga punkti, tuleb veidi katsetada ĂŒlesande ja eksperimenteerida.
- Esmalt arvate, et API on olemas, aga seda ei ole. Jah, Habril on API, kuid see ei ole kasutajatele juurdepÀÀsetav (vĂ”ib-olla ei tööta isegi ĂŒldse).
- Siis hakkate lihtsalt html-i parseerima â "import requests", mis vĂ”ib valesti minna?
- Ja kuidas tegelikult parseerida? Lihtsaim ja kĂ”ige sagedamini kasutatav lĂ€henemine on ID-de kaupa iteratsioon, olgu öeldud, et see ei ole kĂ”ige tĂ”husam ja tuleb töödelda erinevaid juhtumeid â siin on nĂ€iteks tĂ”eliste ID-de tihedus kĂ”igi olemasolevate seas.

VĂ”etud artiklist. - Toorand andmed, mis on HTML-i sisse mĂ€hitud ĂŒle vĂ”rgu, on tĂ”eline peavalu. NĂ€iteks, kui soovite koguda ja salvestada artikli ratingit: lĂ”ikate skoori HTML-ist vĂ€lja ja otsustate selle edasise töötlemise jaoks numbrina salvestada.Â
1) int(score) viskab vea: kuna Habr's on miinus, nagu nĂ€iteks reas "â5" â see on lĂŒhike sidekriips, mitte miinuse mĂ€rk (ootamatu, eks?), seega pidin mingil hetkel parseri ellu Ă€ratama sellise Ă”udse fikseerimisega.
proovi: score_txt = post.find(class_="score").text.replace(u"â","-").replace(u"+","+") score = int(score_txt) if check_date(date): post_score += scoreKuupĂ€evade, plusside ja miinuste olemasolu vĂ”ib ĂŒldse puududa (nagu me nĂ€eme ĂŒleval funktsioonis check_date ja selliseid juhtumeid on olnud).
2) Escapetumatud erimĂ€rgid â need tulevad, peab olema valmis.
3) Struktuur muutub sĂ”ltuvalt postituse tĂŒĂŒbist.
4) Vanad postitused vÔivad olla **veidra struktuuriga**.
- Sisuliselt tuleb veateate kĂ€sitlemine ja see, mis vĂ”ib vĂ”i ei pruugi juhtuda, lĂ€bi mĂ”elda; ei saa kindlalt ennustada, mis lĂ€heb valesti ja milline struktuur veel on ning kus midagi vĂ”ib laguneda â tuleb lihtsalt proovida ja arvestada parsinud veaolukordadega.
- Siis mĂ”istate, et tuleb lĂ”imida mitme protsessi, vastasel juhul kulub ĂŒhe protsessiga parsimiseks ĂŒle 30 tunni (see on puhtalt tööaja jĂ€lgimisega seotud ĂŒheprotsessilise parsingu aeg, mis magab ja ei satu allapoole mingeid banne). artiklis viis see mingil hetkel sellise skeemini:

KokkuvÔtteks keerukuse kontrollnimekiri:
- Töö vÔrgu ja HTML-i parseerimisega, ID-de kaupa iteratsioon ja lÀbimine.
- Dokumendid on heterogeense struktuuriga.
- Palju kohti, kus kood vÔib kergesti kokku kukkuda.
- On vajalik kirjutada || kood.
- Puuduvad vajalikud dokumendid, koodinÀited ja/vÔi kogukond.
Konditsionaalne ajahinnang selle ĂŒlesande jaoks on 3-5 korda suurem kui andmete kogumine Redditist.
VÔrdlus klassikaaslaste gruppidega.
Liigume edasi huvitavamate tehniliste juhtumitega, mis on loetletud. Minu jaoks oli see huvitav just seetĂ”ttu, et esmapilgul nĂ€eb see vĂ€lja piisavalt triviaalne, kuid see pole sugugi nii â niipea, kui te sellesse pulga torkate.
Alustame meie keerukuse kontrollnimekirjast ja mÀrkige, et paljud neist osutub oluliselt keerulisemaks, kui nad alguses nÀivad:
- API on olemas, kuid selles puuduvad peaaegu tÀielikult vajalikud funktsioonid.
- Teatud funktsioonide jaoks tuleb ligipÀÀsu kĂŒsida e-posti teel, see tĂ€hendab, et ligipÀÀsu andmine ei ole kohene.
- See dokumentatsioon on kohutav (alustame sellest, et segunevad vene ja ingliskeelsed terminid, tĂ€iesti ebajĂ€rjekindlalt â mĂ”nikord tuleb lihtsalt arvata, mida teilt kuskil soovitakse) ja veelgi enam, see ei sobi andmete saamiseks, nĂ€iteks .
- NĂ”uab dokumentatsioonis seanssi, kuid tegelikkuses ei kasuta seda â ja puudub igasugune vĂ”imalus kĂ”iki API reĆŸiimide nĂŒansse mĂ”ista, vĂ€lja arvatud klĂ”psamine ja lootmine, et midagi töötab.
- Puuduvad nÀidised ja kogukond, ainus tugikoht teabe kogumiseks on vÀike Pythonis (ilma paljude kasutusnÀidisteta).
- Töötav variant tundub olevat Selenium, kuna paljud vajalikud andmed on lukustuse all.
1) See tÀhendab, et autentimine toimub vale kasutaja kaudu (ja registreerimine kÀsitsi).2) Siiski, Seleniumi kasutamisel puuduvad garantiid korrektseks ja korduvaks tööks (seda vÀhemalt ok.ru puhul kindlasti).
3) OĐ.ru leht sisaldab JavaScripti vigu ja kĂ€itub mĂ”nikord kummaliselt ja ebajĂ€rjekindlalt.
4) Tuleb tegeleda lehekĂŒlgede jagamisega, elementide laadimisega jne ...
5) API vead, mis wrapper tagastab, tuleb vÔimalikult painlikult töödelda, nÀiteks nii (katkend eksperimentaalsest koodist):
def get_comments(args, context, discussions): pause = 1 if args.extract_comments: all_comments = set() #mÔistlik on jÀlgida juba töödeldud arutelusid 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_commentsMinu lemmikviga oli:
OdnoklassnikiError("Error(code: 'None', description: 'HTTP error', method: 'discussions.getComments', params: âŠ)")6) LĂ”ppkokkuvĂ”ttes tundub variant Selenium + API olema kĂ”ige mĂ”istlikum valik.
- On vajalik oleku sĂ€ilitamine ja sĂŒsteemi taaskĂ€ivitamine, paljude vigade töötlemine, sealhulgas saidi ebajĂ€rjekindel kĂ€itumine â need vead on ĂŒsna keerulised ette kujutada (kui te peaksite professionaalselt kirjutama parsi, muidugi).
Selle ĂŒlesande ajakulu hinnang on 3-5 korda kĂ”rgem kui andmete kogumine Habrist. Kuigi Habriga, kasutatakse mehaanilist lĂ€henemist HTML-i pĂ€ringutele, siis OĐ puhul saame kriitilistes kohtades töötada API-ga.
JĂ€reldused
Kuidas te ei peaks hindama âkohapealâ (tĂ€na on ju planeerimine!) mahuka andmetöötlusprotsessi pipelaini, on tĂ€itmise aeg praktiliselt kunagi isegi kvaliteetselt hindamiseks vĂ”imalik, ilma ĂŒlesande parameetrite analĂŒĂŒsita.
Kui rÀÀkida natuke filosoofilisemalt, siis agiilsed hindamistrateegiad sobivad hĂ€sti inseneriteemade jaoks, kuid katsetavates ja teatud mĂ”ttes âloomingulistesâ ja uurimuslikes ĂŒlesannetes, st vĂ€hem ennustatavates, tekivad raskused, nagu nĂ€ites, mida oleme siin kĂ€sitlenud.
Muidugi, andmete kogumine on lihtsalt erksaks illustratiivseks nĂ€iteks â tavaliselt tundub see ĂŒlesanne uskumatult lihtne ja tehniliselt keeruline ning just detailides peitub tihti kurat. Ja just selle ĂŒlesandega saame nĂ€idata kogu spektrit vĂ”imalike variantide kohta, mis vĂ”ib valesti minna ja kui kaua töö tĂ€pselt venida vĂ”ib.
Kui pilk visata ĂŒlesande omadustele ilma tĂ€iendavate katseteta, siis Reddit ja OK paistavad sarnased: on API, Python wrapper, kuid sisuliselt on erinevus tohutu. Kui hinnata nende parameetrite pĂ”hjal, siis Hubberi kraapimine tundub keerulisem kui OK â kuid praktikas on see hoopis vastupidi ja just seda saab selgeks teha, kui lĂ€bi viia lihtsad eksperimendid ĂŒlesande parameetrite analĂŒĂŒsimiseks.
Minu kogemuste kohaselt on kĂ”ige tĂ”husam lĂ€henemine umbkaudne ajahindamine, mis on vajalik eelanalĂŒĂŒsi ja lihtsate esialgsete katsete, dokumentatsiooni lugemise jaoks â just need vĂ”imaldavad teil anda tĂ€pset hinnangut kogu töö jaoks. Populaarse agiilse metoodika mĂ”istetena â palun avage mulle pilet âĂŒlesande parameetrite hindamiseksâ, mille pĂ”hjal saan anda hinnangu sellele, mida on vĂ”imalik teha âsprintiâ raames, ja anda tĂ€psema hinnangu iga ĂŒlesande kohta.
SeetĂ”ttu nĂ€ib kĂ”ige tĂ”husam olevat argumendina nĂ€idata âmitte tehniliseleâ spetsialistile, kui palju varieerub aeg ja ressursid vastavalt parameetritele, mida tuleb veel hinnata.
Allikas: habr.com

