Mis vÔib Data Science'iga valesti minna? Andmete kogumine

Mis vÔib Data Science'iga valesti minna? Andmete kogumine
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:

  1. Kahte Redditi alafoorumit
  2. Kahte Habra jaotust
  3. 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 python wrapper — koos hulga nĂ€idistega.
  • Kogukond, mis tegeleb Redditis andmete analĂŒĂŒsi ja kogumisega (kuni YouTube'i videodeni, mis selgitavad, kuidas kasutada python wrapperit) siin nĂ€iteks.
  • 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 sellest 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.

    Mis vÔib Data Science'iga valesti minna? Andmete kogumine
    VÔetud sellest 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 += score
    

    KuupĂ€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). sellest artiklis, viis see mingil hetkel sarnase skeemini:

Mis vÔib Data Science'iga valesti minna? Andmete kogumine

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 meile vajalik funktsioon.
  • 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 wrapper 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_comments
    

    Minu 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.

Mis vÔib Data Science'iga valesti minna? Andmete kogumine

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster