TĂ€na on olemas 100500 Data Science'i kursust ja on ammu teada, et enamasti teenitakse kĂ”ige rohkem raha just Data Science'i kursustega (miks kaevata, kui saab mĂŒĂŒa labidaid?). Peamine probleem nende kursustega on see, et need ei oma mingit seost tegeliku tööga: keegi ei anna teile puhtaid, töödeldud andmeid Ă”iges vormingus. Ja kui te vĂ€ljud kursustelt ja hakkate lahendama pĂ€ris probleemi â ilmnevad paljud nĂŒansid.
SeetĂ”ttu alustame artiklite sarja "Mis vĂ”ib Data Science'is valesti minna", mis pĂ”hinevad tĂ”eliselt juhtunud juhtumitel, mis on juhtunud minuga, minu sĂ”prade ja kolleegidega. Toome vĂ€lja reaalseid nĂ€iteid tĂŒĂŒpilistest Data Science'i ĂŒlesannetest: kuidas see tegelikult toimub. Alguses kĂ€sitleme andmete kogumise ĂŒlesannet.
Ja esimene, millele inimesed, kes hakkavad töötama reaalsete andmetega, komistavad â on tegelikult nende asjakohaste andmete kogumine. Selle artikli pĂ”hikohustus:
Me alahindame jÀrjepidevalt aega, ressursse ja pingutusi andmete kogumiseks, puhastamiseks ja ettevalmistamiseks.
Ja olulisem, arutame, mida teha, et seda vÀltida.
Erinevate hinnangute kohaselt kulub andmete puhastamiseks, töötlemiseks, omaduste inseneriks ja muuks 80-90% ajast, samas kui analĂŒĂŒs vĂ”tab vaid 10-20%, kuigi peaaegu kogu Ă”ppeaine keskendub ainult analĂŒĂŒsile.
Vaatame, kuidas ĂŒks tĂŒĂŒpiline analĂŒĂŒsik ĂŒlesanne lahendada kolme variandi kaudu ja nĂ€eme, millised on âkergitavad asjaoludâ.
Ja nĂ€iteks vaatame sarnaseid andmete kogumise ja kogukondade vĂ”rdlemise ĂŒlesande variatsioone:
- Kahte Redditi alafoorumit
- Kahte Habra jaotust
- Kahte Klassikaaslaste gruppi
Lihtne lÀhenemine teooriast
Avage veebisait ja lugege nÀiteid, kui on arusaadav, kulutage paar tundi lugemisele, paar tundi koodi nÀidetes ja silumisele. Lisage paar tundi kogumiseks. Lisage paar tundi varuks (korrutage kaheks ja lisage N tundi).
Peamine punkt: ajahinnang pÔhineb oletustel ja oletustel selle kohta, kui kaua see aega vÔtab.
Aja analĂŒĂŒsi alustamiseks on oluline hinnata jĂ€rgmisi parameetreid eelnevalt kirjeldatud tingimusliku ĂŒlesande puhul:
- Milline on andmete maht ja kui palju neid tuleb fĂŒĂŒsiliselt koguda (*vt allpool*).
- Kui kaua ĂŒhe kirje kogumine aega vĂ”tab ja kui kaua tuleb oodata, enne kui saab teise koguda.
- Koodimise kirjutamine, mis sÀilitab oleku ja alustab taaskÀivitamist, kui (mitte kui) kÔik kokku kukub.
- Tuleb vÀlja selgitada, kas meil on vaja autoriseerimist ja arvestada API juurdepÀÀsu saamise aega.
- Tuleb arvestada vigade arvu kui andmete keerukuse funktsiooni â hinnata konkreetse ĂŒlesande pĂ”hjal: struktuur, kui palju teisendusi, mida ja kuidas ekstraktime.
- Tuleb arvestada vÔrgu vigu ja probleeme projekti mittestandardse kÀitumisega.
- Hinda, kas vajalikud funktsioonid on dokumentatsioonis, ja kui need pole olemas, siis kui palju on vajalik lahenduse leidmiseks.
KĂ”ige olulisem, mida ajakava hindamiseks arvesse vĂ”tta â peate tegelikult kulutama aega ja pingutust âtaktikalise uuringuâ jaoks â alles siis on teie planeerimine adekvaatne. Seega, kui teid survestatakse ĂŒtlema âkui palju aega on andmete kogumiseks vajalikâ â leidke aega eelanalĂŒĂŒsiks ja pĂ”hjendage, kui palju aega see tegelikult sĂ”ltub ĂŒlesande tegelikest parameetritest.
Ja nĂŒĂŒd demonstreerime konkreetseid nĂ€iteid, kus sellised parameetrid muutuvad.
Peamine punkt: hindamine pĂ”hineb vĂ”tmetegurite analĂŒĂŒsil, mis mĂ”jutavad töömahtu ja keerukust.
Hinnang, mis pĂ”hineb oletustel, on hea lĂ€henemine, kui funktsionaalsed elemendid on piisavalt vĂ€ikesed ja tegureid, mis vĂ”ivad oluliselt mĂ”jutada ĂŒlesande struktuuri, ei ole palju. Kuid mitme Data Science'i ĂŒlesande puhul muutub selliste tegurite arv ÀÀrmiselt suureks ja selline lĂ€henemine osutub sobimatuks.
Redditi kogukondade vÔrdlemine
Alustame kĂ”ige lihtsamast juhtumist (nagu hiljem selgub). Ăldiselt, kui olla tĂ€iesti aus, on meil peaaegu ideaalne juhtum, vaatame meie keerukuse kontrollnimekirja:
- Olemas on korralik, arusaadav ja dokumenteeritud API.
- Nii lihtne ja mis kÔige tÀhtsam, saadakse automaatselt token.
- On â koos hulga nĂ€idistega.
- Kogukond, mis tegeleb Redditis andmete analĂŒĂŒsi ja kogumisega (kuni YouTube'i videodeni, mis selgitavad, kuidas kasutada python wrapperit) .
- Vajalikud meetodid eksisteerivad tÔenÀoliselt 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 mugavate utiliitide valik.
Kuigi meil on parim vÔimalik olukord, peaksime siiski arvestama mitme olulise teguriga reaalses elus:
- API piirangud â me peame andmeid koguma partiidena (undama pĂ€ringute vahel jne).
- Kogumise aeg â tĂ€ielikuks analĂŒĂŒsiks ja vĂ”rdlemiseks tuleb arvestada mĂ€rkimisvÀÀrset aega, et lihtsalt spider saaks subreddit'i lĂ€bi kĂ€ia.
- Bot peab töötama serveris â te ei saa lihtsalt seda sĂŒlearvutis kĂ€ivitada, seljakotti panna ja ringi minna. SeetĂ”ttu kĂ€ivitasin kĂ”ik VPS-is. Kasutades kupongi habrahabr10, saab veel 10% soodustust.
- MĂ”nede andmete fĂŒĂŒsiline kĂ€tte saamata jÀÀmine (need on nĂ€htavad administraatoritele vĂ”i liiga keeruline koguda) â see tuleb arvesse vĂ”tta, mitte kĂ”ik andmed ei ole ĂŒldse mĂ”istliku aja jooksul kergesti kĂ€ttesaadavad.
- VÔrgu töövead: vÔrgu kasutamine on vÀljakutse.
- Need on elavad tĂ”elised andmed â need ei ole kunagi puhtad.
Muidugi tuleb arvestada kĂ”iki mainitud nĂŒansse arenduses. Spetsiifilised tunnid/pĂ€evad sĂ”ltuvad arenduse kogemusest vĂ”i sarnaste ĂŒlesannetega tegelemise kogemusest, kuid me nĂ€eme, et antud ĂŒlesanne on puhtalt inseneritehniline ja ei vaja lisategevusi lahendamiseks â kĂ”ike saab vĂ€ga hĂ€sti hinnata, planeerida ja teostada.
Habrakohtade vÔrdlemine
Liigume edasi huvitavama ja ebatavalise juhtumi juurde, kus vÔrreldakse vooge ja/vÔi Habrakohti.
Kontrollime meie keerukuse kontrollnimekirja â siin, et mĂ”ista iga punkti, tuleb natuke katsetada ĂŒlesande enda kallal ja eksperimenteerida.
- Esialgu arvasite, et API on olemas, kuid seda ei ole. Jah, Habraklubi on API, kuid see on kasutajatele kĂ€ttesaamatu (vĂ”ib-olla ei tööta see ĂŒldse).
- Siis hakkate lihtsalt HTML-i parsimiseks â "import requests", mis vĂ”ib valesti minna?
- Aga kuidas ĂŒldse parsida? Lihtsaim ja kĂ”ige sagedamini kasutatav lĂ€henemine on iteratsioon ID-de kaupa, mĂ€rkides, et see ei ole kĂ”ige tĂ”husam ja peate kĂ€sitlema erinevaid juhtumeid â nĂ€iteks reaalse ID tihedus kĂ”igi olemasolevate seas.

VĂ”etud artiklist. - HTML-moodulite kaudu vĂ”rgus olev tooreandmed on suureks vaevaks. NĂ€iteks, kui soovite koguda ja salvestada artikli hinnangut: olete vĂ€lja nopinud score HTML-ist ja otsustanud salvestada selle numbrina edasiseks töötlemiseks.Â
1) int(score) viskab vea: kuna Habril on miinus, nĂ€iteks read "â5" â see on lĂŒhike side ja mitte miinusmĂ€rk (ĂŒllatav, ei?). SeetĂ”ttu tuli mingil hetkel aktiveerida parser sellise kohutava fikseerimisega.
try: score_txt = post.find(class_="score").text.replace(u"â","-").replace(u"+","+") score = int(score_txt) if check_date(date): post_score += scoreKuupĂ€evasid, plusse ja miinuseid ei pruugi ĂŒldse olla (kui vaatame ĂŒle check_date funktsiooni ja selline on olnud).
2) Eespool kodutööde tulemusi peaks arvesse vĂ”tma â nad tulevad, peate olema valmis.
3) Struktuur muutub vastavalt postituse tĂŒĂŒbile.
4) Vanematel postitustel vÔib olla **veider struktuur**.
- Sisuliselt tuleb vigu ja vĂ”imalikke olukordi kĂ€sitleda ning ei saa ette nĂ€ha, mis vĂ”ib valesti minna ja mis veel struktuur olla vĂ”ib ning kust midagi vĂ€lja kukub â tuleb lihtsalt proovida ja arvesse vĂ”tta parseri visatud vigu.
- Siis mĂ”istate, et andmeid tuleb töödelda mitme töörĂŒhmaga, vastasel juhul kulub ĂŒhe-poolse töötlemise jaoks 30+ tundi (see on ainult olemasoleva ĂŒhe-poolse andmete töötleja tööaeg, mis magab ja ei saa ĂŒhtegi reegli rikkumist). artiklis, viis see mingil hetkel sarnase skeemini:

KokkuvÔtteks kontrollnimekiri keerukuse kohta:
- Töötamine vÔrgu ja HTML andmete töötlemisega ID-de iteratsiooni ja genereerimise kÀigus.
- Dokumendid on mitmekesise struktuuriga.
- Palju kohti, kus kood vÔib kergesti kukkuda.
- On vajalik kirjutada || kood.
- Puudub vajalik dokumentatsioon, koodinÀidised ja/vÔi kogukond.
Kohandatud ajahinnang sellele ĂŒlesandele on 3-5 korda suurem kui andmete kogumine Redditist.
VÔrdlemine Odnoklassniki gruppidega
Liigume edasi kĂ”ige tehniliselt huvitavama juhtumi juurde. Minu jaoks oli see huvitav just seetĂ”ttu, et see nĂ€eb esmapilgul piisavalt triviaalne vĂ€lja, kuid ei ole nii â nii pea kui te sellesse puutikku lĂŒkkate.
Alustame meie keerukuse kontrollnimekirjaga ja mÀrkime, et paljusid neist osutuvad palju keerulisemaks, kui alguses tunduvad:
- API on olemas, kuid see on peaaegu tÀielikult vajalikke funktsioone ilma.
- MÔnedele funktsioonidele on vajalik juurdepÀÀsu taotlemine e-posti teel, seega ei ole juurdepÀÀs instantne.
- Dokumentatsioon on kohutav (alustame sellest, et kĂ”ikjal segunevad vene ja ingliskeelsed terminid, tĂ€iesti ebajĂ€rjekindlalt â mĂ”nikord peate lihtsalt Ă€ra arvama, mida teilt kuskil oodatakse) ning mis ĂŒhtlasi ei sobi andmete hankimiseks disaini poolest, nĂ€iteks .
- NĂ”uab dokumentatsioonis sessiooni, kuid reaalselt seda ei kasuta â ja pole mingit viisi, kuidas kĂ”iki API reĆŸiimide nĂŒansse selgeks saada, vĂ€lja arvatud klikkida ja loota, et midagi töötab.
- Puuduvad nÀited ja kogukond, ainus tugikoht teabe kogumiseks on vÀike Pythonis (ilma suure hulga kasutusnÀidisteta).
- Töötav variant nÀib olevat Selenium, kuna paljud vajalikud andmed on lukustatud.
1) Autoriseerimine toimub fiktiivse kasutaja kaudu (ja registreerimine kÀsitsi).2) Siiski ei ole Seleniumiga mingit garantiid korrektse ja korduva töö osas (vÀhemalt ok.ru puhul kindlasti).
3) Oks.ru veebisaidil on JavaScripti vigu ja see kÀitub mÔnikord kummaliselt ja ebajÀrjekindlalt.
4) Hoolitseda on vajalik pagineerimine, elementide laadimine jneâŠ
5) API vead, mida wrapper annab, tuleb kohandada, nĂ€iteks ŃаĐș (katkestus eksperimentaalkoodist):
def get_comments(args, context, discussions): pause = 1 if args.extract_comments: all_comments = set() #on mÔistlik 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 lemmik viga oli:
OdnoklassnikiError("Error(code: 'None', description: 'HTTP error', method: 'discussions.getComments', params: âŠ)")6) LĂ”ppkokkuvĂ”ttes nĂ€eb Selenium + API variant kĂ”ige ratsionaalsem vĂ€lja.
- On vajalik olekute sĂ€ilitamine ja sĂŒsteemi taaskĂ€ivitamine, paljude vigade töötlemine, sealhulgas veebisaidi ettearvamatu kĂ€itumine â ja need vead on ĂŒsna keerulised ette kujutada (kui te ei kirjuta professionaalselt parsereid, loomulikult).
Antud ĂŒlesande ajahinnang on 3-5 korda kĂ”rgem kui andmete kogumine Habrist. Kuigi Habriga töötades kasutame HTML-parsingu otse lĂ€henemist, saame OĐ puhul kriitilistes kohtades töötada API-ga.
JĂ€reldused
Kuigi te vĂ”ite nĂ”uda, et hindaksime mĂ”istes "kohapeal" (meil on tĂ€na planeerimine!) mahuka andmetöötluse pipelini, on tĂ€itmise aega praktiliselt vĂ”imatu isegi kvaliteetselt hinnata ilma ĂŒlesande parameetrite analĂŒĂŒsimiseta.
Kui rÀÀkida veidi filosoofilisemalt, siis agiilsed hindamisstrateegiad sobivad hĂ€sti inseneritegevuste jaoks, kuid eksperimentaalsemate ning mingil mÀÀral "loominguliste" ja uurimistegevustega, st vĂ€hem ettearvatavate ĂŒlesannetega, tekivad raskused, nagu nĂ€idatud siinsetes nĂ€idetes.
Muidugi, andmete kogumine on lihtsalt elav nĂ€ide â tavaliselt nĂ€ib see ĂŒlesanne uskumatult lihtne ja tehniliselt lihtne, kuid just detailides peitub sageli kurat. Ja just selle ĂŒlesande kaudu on vĂ”imalik nĂ€idata kogu spektrit vĂ”imalikke variante, mis vĂ”ivad valesti minna, ja kui kaua vĂ”ib töö venida.
Kui kiiresti ĂŒlesande omadustele pilk heita, tunduvad Reddit ja OK sarnased: mĂ”lemal on API, Python'i wrapper, kuid tegelikult on erinevus tohutu. Kui neid parameetreid vĂ”rrelda, siis Habr'i andmete kogumine tundub keerulisem kui OK â kuid tegelikult on vastupidi, ja seda saab selgeks teha, viies lĂ€bi lihtsaid katseid ĂŒlesande parameetrite analĂŒĂŒsimiseks.
Minu kogemuste kohaselt on kĂ”ige tĂ”husam lĂ€henemine umbkaudne ajakava, mis pĂ”hineb eeltööl ja lihtsatel esimestel katsetel, dokumentatsiooni lugemisel â just need tegevused annavad vĂ”imaluse teha tĂ€pne hinnang kogu töö ulatusele. Populaarse agiilse metoodika terminoloogias palun, et luuakse mulle pilet âĂŒlesande parameetrite hindamiseksâ, mille alusel saan hinnata, mida on vĂ”imalik âsprintideâ raames rakendada ja anda tĂ€psem hinnang iga ĂŒlesande kohta.
Seega tundub, et kĂ”ige tĂ”husam on argumendi esitlemine, mis nĂ€itab âmitte-tehniliseleâ spetsialistile, kui palju vĂ”ivad aja ja ressursside kulud varieeruda sĂ”ltuvalt parameetritest, mida tuleb veel hinnata.
Allikas: habr.com

