ÇfarĂ« mund tĂ« shkojĂ« keq me ShkencĂ«n e TĂ« DhĂ«nave? Grumbullimi i tĂ« dhĂ«nave

ÇfarĂ« mund tĂ« shkojĂ« keq me ShkencĂ«n e TĂ« DhĂ«nave? Grumbullimi i tĂ« dhĂ«nave
Sot të sotme, ekzistojnë 100500 kurse mbi Data Science dhe është e njohur se më shumë para në Data Science mund të fitohen nga kurset mbi Data Science (pse të qeshim, kur mund të shesim lopatat?). Minus i madh i këtyre kurseve është se ato nuk kanë asgjë të përbashkët me punën reale: askush nuk do t'ju japë të dhëna të pastra, të përpunuara në formatin e duhur. Dhe kur dilni nga kurset dhe filloni të zgjidhni një problem të vërtetë - shpesh dalin shumë nuanca.

Prandaj, ne fillojmĂ« njĂ« seri shĂ«nimesh "ÇfarĂ« mund tĂ« shkojĂ« keq me Data Science", tĂ« bazuara nĂ« ngjarje reale qĂ« ndodhen me mua, shokĂ«t dhe kolegĂ«t e mi. Do t'i shqyrtojmĂ« shembuj konkretĂ« tĂ« detyrave tipike tĂ« Data Science: si ndodh realisht kjo. Sot do tĂ« fillojmĂ« me detyrĂ«n e mbledhjes sĂ« tĂ« dhĂ«nave.

Dhe e para në të cilën pengohen njerëzit, kur fillojnë të punojnë me të dhëna reale, është vetë mbledhja e këtyre të dhënave që na nevojiten. Mesazhi kryesor i këtij artikulli është:

Ne sistematikisht e underestimated kohën, resurset dhe përpjekjet për mbledhjen, përpunimin dhe përgatitjen e të dhënave.

Dhe mbi të gjitha, do të diskutojmë se çfarë të bëjmë që të mos e lejojmë këtë.

Sipas vlerësimeve të ndryshme, pastrimi, transformimi, përpunimi i të dhënave, inxhinieria e veçorive etj. zënë 80-90% të kohës, ndërsa analiza 10-20%, ndërsa pothuajse i gjithë materiali edukativ përqendrohet vetëm në analizë.

Le të shqyrtojmë një shembull tipik të një detyre analitike të thjeshtë në tri variante dhe të shohim se çfarë përbërësish mund të ndodhin.

Dhe si shembull përsëri, ne do të shqyrtojmë variacione të ngjashme të detyrës së mbledhjes së të dhënave dhe krahasimit të komuniteteve për:

  1. Dy subreddite në Reddit
  2. Dy seksione në Habr
  3. Dy grupe në Odnoklassniki

Qasje hipotetike në teori

Hapni faqen dhe lexoni shembujt, nëse kuptohet, dedikoni disa orë për lexim, disa orë për kodin sipas shembujve dhe për të debug-uar. Shtoni disa orë për mbledhjen. Shtoni disa orë për rezervë (dyfishoni dhe shtoni N orë).

ÇelĂ«si Ă«shtĂ«: vlerĂ«simi i kohĂ«s bazohet nĂ« supozime dhe spekulime pĂ«r sa kohĂ« do tĂ« zgjasĂ« kjo.

Të fillosh analizën e kohës, është e nevojshme të vlerësosh këto parametra për detyrën hipotetike të përshkruar më sipër:

  • Cili Ă«shtĂ« madhĂ«sia e tĂ« dhĂ«nave dhe sa duhet tĂ« mbledhĂ«sh fizikisht (*shih mĂ« poshtĂ«*).
  • Cili Ă«shtĂ« koha e grumbullimit tĂ« njĂ« regjistrimi dhe sa duhet tĂ« presim para se tĂ« mund tĂ« grumbullojmĂ« tĂ« dytin.
  • TĂ« pĂ«rfshijmĂ« kodin pĂ«r ruajtjen e gjendjes dhe fillimin e rinisjes, kur (dhe jo nĂ«se) gjithçka bie.
  • TĂ« kuptojmĂ« nĂ«se na nevojitet autorizimi dhe tĂ« pĂ«rfshijmĂ« kohĂ«n pĂ«r tĂ« marrĂ« qasje pĂ«rmes API.
  • TĂ« pĂ«rfshijmĂ« numrin e gabimeve si njĂ« funksion i kompleksitetit tĂ« tĂ« dhĂ«nave — tĂ« vlerĂ«sojmĂ« sipas detyrĂ«s specifike: struktura, sa transformime, çfarĂ« dhe si do tĂ« ekzekutojmĂ«.
  • TĂ« pĂ«rfshijmĂ« gabimet e rrjetit dhe probleme me sjellje jo standarde tĂ« projektit.
  • TĂ« vlerĂ«sojmĂ« nĂ«se funksionet e nevojshme janĂ« nĂ« dokumentacion dhe nĂ«se jo, si dhe sa duhet pĂ«r njĂ« zgjidhje alternative.

E rĂ«ndĂ«sishme Ă«shtĂ« se pĂ«r tĂ« vlerĂ«suar kohĂ«n — ju faktikisht duhet tĂ« investoni kohĂ« dhe pĂ«rpjekje pĂ«r «eksplorim aktiv» — vetĂ«m atĂ«herĂ« planifikimi juaj do tĂ« jetĂ« adekuat. Prandaj, pavarĂ«sisht se sa do t'ju sugjerojnĂ« tĂ« thoni «sa kohĂ« nevojitet pĂ«r tĂ« grumbulluar tĂ« dhĂ«nat» — sigurohuni tĂ« keni kohĂ« pĂ«r njĂ« analizĂ« paraprake dhe argumentoni se sa do tĂ« ndryshojĂ« koha nĂ« varĂ«si tĂ« parametrave realĂ« tĂ« detyrĂ«s.

Dhe tani do të demonstrojmë shembuj konkretë ku këto parametra do të ndryshojnë.

Pika kyçe: vlerësimi bazohet në analizën e faktorëve kryesorë që ndikojnë në volum dhe kompleksitetin e punës.

Një vlerësim i bazuar në supozime është një qasje e mirë kur elementet funksionale janë mjaft të vogla dhe nuk ka shumë faktorë që mund të ndikojnë ndjeshëm në strukturën e detyrës. Por në rastin e disa detyrave të Data Science, faktorët e tillë bëhen shumë të shumtë dhe një qasje e tillë bëhet e papërshtatshme.

Krahasimi i komuniteteve Reddit

Le të fillojmë me rastin më të thjeshtë (siç do të dalë më vonë). Në të vërtetë, nëse jemi të sinqertë, kemi një rast pothuajse të përsosur, le të verifikojmë kontrollin tonë të kompleksitetit:

  • Ka njĂ« API tĂ« pastĂ«r, tĂ« kuptueshĂ«m dhe tĂ« dokumentuar.
  • Mund tĂ« krijohet me shumĂ« lehtĂ«si dhe automatikisht njĂ« token.
  • Ka python wrapper — me plot shembuj.
  • NjĂ« komunitet qĂ« merret me analizĂ«n dhe mbledhjen e tĂ« dhĂ«nave nĂ« Reddit (duke pĂ«rfshirĂ« video nĂ« YouTube qĂ« shpjegojnĂ« se si tĂ« pĂ«rdoret python wrapper) ja pĂ«r shembull.
  • Metodat qĂ« na nevojiten, me siguri ekzistojnĂ« nĂ« API. MĂ« shumĂ« se kaq, kodi duket i kompakt dhe i pastĂ«r, mĂ« poshtĂ« Ă«shtĂ« njĂ« shembull i funksionit qĂ« mbledh komentet pĂ«r njĂ« postim.

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()

Marre nga këtë selekcioni grupe të dobishme për utilitarë.

Megjithëse ky është rasti më i mirë, ka disa faktorë të rëndësishëm nga jeta reale që duhet të marrim parasysh:

  • Limitet e API-sĂ« – jemi tĂ« detyruar tĂ« marrim tĂ« dhĂ«nat nĂ« grupe (tĂ« presim midis kĂ«rkesave etj).
  • Koha e mbledhjes – pĂ«r njĂ« analizĂ« tĂ« plotĂ« dhe krahasim, do tĂ« duhen njĂ« sasi e konsiderueshme kohe qĂ« thjesht spider tĂ« kalojĂ« pĂ«rmes subredd-it.
  • Boti duhet tĂ« funksionojĂ« nĂ« server – nuk mund ta nisin thjesht nĂ« laptop, ta vendosni nĂ« çantĂ« dhe tĂ« shkoni pĂ«r punĂ«. Prandaj e kam vendosur gjithçka nĂ« VPS. Me kodin promocional habrahabr10 mund tĂ« kurseni 10% tĂ« çmimit.
  • PaaftĂ«sia fizike pĂ«r tĂ« aksesuar disa tĂ« dhĂ«na (ato janĂ« tĂ« dukshme vetĂ«m pĂ«r admina ose mblidhen shumĂ« me vĂ«shtirĂ«si) – duhet marrĂ« parasysh, jo tĂ« gjitha tĂ« dhĂ«nat mund tĂ« mblidhen nĂ« njĂ« kohĂ« tĂ« arsyeshme.
  • Gabimet e punĂ«s sĂ« rrjetit: puna me rrjetin – Ă«shtĂ« e vĂ«shtirĂ«.
  • KĂ«to janĂ« tĂ« dhĂ«na tĂ« vĂ«rteta – ato nuk janĂ« ndonjĂ«herĂ« tĂ« pastra.

Sigurisht, Ă«shtĂ« e nevojshme tĂ« pĂ«rfshihen nuancat e pĂ«rmendura nĂ« zhvillim. OrĂ«t/ditat specifike varen nga pĂ«rvoja e zhvillimit apo eksperienca nĂ« punĂ« me detyra tĂ« ngjashme, megjithatĂ« ne shohim se kĂ«tu detyra Ă«shtĂ« krejtĂ«sisht inxhinierike dhe nuk kĂ«rkon lĂ«vizje tĂ« tjera pĂ«r zgjidhje — mund tĂ« vlerĂ«sohet, pĂ«rshkruhet dhe realizohet shumĂ« mirĂ«.

Krahasimi i seksioneve të Habrit

Tani kalojmë në një rast më interesant dhe jo trivial për krahasimin e flukseve dhe/ose seksioneve të Habrit.

Le tĂ« kontrollojmĂ« listĂ«n tonĂ« tĂ« vĂ«shtirĂ«sive — kĂ«tu, pĂ«r tĂ« kuptuar çdo pikĂ«, do tĂ« duhet tĂ« eksplorojmĂ« pak detyrĂ«n dhe tĂ« eksperimentojmĂ«.

  • Fillimisht mendoni se ka njĂ« API, por nĂ« fakt nuk ka. Po, Habri ka njĂ« API, por ai Ă«shtĂ« i papĂ«rballueshĂ«m pĂ«r pĂ«rdoruesit (ndoshta as qĂ« funksionon nĂ« tĂ«rĂ«si).
  • Pastaj thjesht filloni tĂ« parse html — «import requests», çfarĂ« mund tĂ« shkojĂ« keq?
  • Dhe si mund tĂ« parse? Qasja mĂ« e thjeshtĂ« dhe mĂ« shpesh e pĂ«rdorur Ă«shtĂ« tĂ« iteroni pĂ«rmes ID-ve, e cila nuk Ă«shtĂ« mĂ« e efektshmja dhe do tĂ« duhet tĂ« trajtoni raste tĂ« ndryshme — pĂ«r shembull, shpĂ«rndarja e ID-ve reale nĂ« mesin e tĂ« gjithĂ« atyre ekzistuese.

    ÇfarĂ« mund tĂ« shkojĂ« keq me ShkencĂ«n e TĂ« DhĂ«nave? Grumbullimi i tĂ« dhĂ«nave
    Marre nga këtë të artikullit.

  • TĂ« dhĂ«nat e papĂ«rpunuara, tĂ« mbĂ«shtjella nĂ« HTML mbi rrjet — janĂ« njĂ« dhimbje. PĂ«r shembull, dĂ«shiron tĂ« mbledhĂ«sh dhe ruash vlerĂ«simin e njĂ« artikulli: e nxore score nga html dhe vendose ta ruash si njĂ« numĂ«r pĂ«r pĂ«rpunim tĂ« mĂ«tejshĂ«m: 

    1) int(score) shkakton njĂ« gabim: pasi nĂ« Habre minus, si pĂ«r shembull nĂ« rreshtin "–5" — Ă«shtĂ« njĂ« gjithpĂ«rfshirĂ«s i shkurtĂ«r, dhe jo njĂ« shenjĂ« minus (papritmas, apo jo?), prandaj nĂ« njĂ« moment duhej tĂ« rrisja parserin me njĂ« fikĂ«s tĂ« tillĂ« tĂ« tmerrshĂ«m.

    provoni:
          score_txt = post.find(class_="score").text.replace(u"–","-").replace(u"+","+")
          score = int(score_txt)
          nëse kontrollo_datën(date):
            post_score += score
    

    Datat, pluset dhe minuset mund të mos jenë fare (siç e shohim më sipër në funksionin kontrollo_datën dhe ka ndodhur kjo).

    2) Karakteret speciale tĂ« paekranuara — ato do tĂ« vijnĂ«, duhet tĂ« jesh gati.

    3) Struktura ndryshon në varësi të tipit të postimit.

    4) Postimet e vjetra mund të kenë **strukturë të çuditshme**.

  • NĂ« thelb, pĂ«rpunimi i gabimeve dhe çfarĂ« mund tĂ« ndodhe apo jo, do tĂ« duhet tĂ« pĂ«rpunohet dhe nuk mund tĂ« parashikohet me siguri se çfarĂ« do tĂ« shkojĂ« keq dhe si mund tĂ« jetĂ« struktura dhe ku do tĂ« bjerĂ« — thjesht do tĂ« duhet tĂ« provosh dhe tĂ« marrĂ«sh parasysh gabimet qĂ« hedh parseri.
  • Pastaj, kuptoni se duhet tĂ« bĂ«ni parser nĂ« disa procese, ndryshe e gjithĂ« kjo do tĂ« zgjasĂ« mĂ« shumĂ« se 30 orĂ« (ky Ă«shtĂ« vetĂ«m koha e ekzekutimit tĂ« njĂ« parseri nĂ« njĂ« proces, i cili fle dhe nuk bie nĂ«n ndonjĂ« bllokim). NĂ« kĂ«tĂ« artikull, kjo çoi nĂ« njĂ« moment tĂ« tillĂ« nĂ« njĂ« skemĂ« tĂ« ngjashme:

ÇfarĂ« mund tĂ« shkojĂ« keq me ShkencĂ«n e TĂ« DhĂ«nave? Grumbullimi i tĂ« dhĂ«nave

Pra, lista e kontrollit për vështirësinë:

  • Puna me rrjetin dhe parserin HTML me iterim dhe pĂ«rjashtim sipas ID-ve.
  • Dokumente me strukturĂ« tĂ« ndryshme.
  • MĂ« shumĂ« vende ku kodi mund tĂ« bjerĂ« lehtĂ«sisht.
  • ËshtĂ« e nevojshme tĂ« shkruani || kod.
  • Mungon dokumentacioni i nevojshĂ«m, shembujt e kodit dhe/ose komuniteti.

Vlerësimi i kushtëzuar i kohës për këtë detyrë do të jetë 3-5 herë më i lartë se sa mbledhja e të dhënave nga Reddit.

Krahasimi i grupeve në Odnoklassniki

TĂ« kalojmĂ« nĂ« rastin mĂ« teknik tĂ« interesant nga ato tĂ« pĂ«rmendura. PĂ«r mua ishte i rĂ«ndĂ«sishĂ«m pikĂ«risht sepse fillimisht duket mjaft trivial, por nĂ« tĂ« vĂ«rtetĂ« nuk Ă«shtĂ« – sapo tĂ« klikoni nĂ« tĂ« me njĂ« tryezĂ«.

Do të fillojmë me listën tonë të kontrollit për vështirësinë dhe do të theksojmë se shumë prej tyre do të jenë shumë më të ndërlikuara se sa duken në fillim:

  • Ka API, por funksionet e nevojshme janĂ« pothuajse plotĂ«sisht tĂ« mungueshme.
  • PĂ«r disa funksione, duhet tĂ« kĂ«rkoni akses pĂ«rmes postĂ«s, domethĂ«nĂ« dhĂ«nia e aksesit nuk Ă«shtĂ« e menjĂ«hershme.
  • Ai Ă«shtĂ« dokumentuar tmerrĂ«sisht (duke filluar qĂ« terminologjia ruse dhe angleze pĂ«rzihen gjithandej, dhe kjo ndodh nĂ« mĂ«nyrĂ« krejtĂ«sisht tĂ« papĂ«rshtatshme - herĂ« pas here duhet thjesht tĂ« gjuajmĂ« se çfarĂ« kĂ«rkohet) dhe, pĂ«r mĂ« tepĂ«r, nuk Ă«shtĂ« i dizajnuar pĂ«r tĂ« marrĂ« tĂ« dhĂ«na, pĂ«r shembull, funksionin qĂ« na nevojitet.
  • KĂ«rkon njĂ« sesion nĂ« dokumentacion, ndĂ«rsa nĂ« praktikĂ« nuk e pĂ«rdor atĂ« - dhe nuk ka asnjĂ« mĂ«nyrĂ« pĂ«r tĂ« kuptuar detajet e tĂ« gjithĂ« modĂ«ve tĂ« API, pĂ«rveç se tĂ« eksperimentohet dhe tĂ« shpresohet qĂ« diçka tĂ« funksionojĂ«.
  • Nuk ka shembuj dhe komunitet, pika e vetme e mbĂ«shtetjes nĂ« mbledhjen e informacionit Ă«shtĂ« njĂ« wrapper nĂ« Python (pa shumĂ« shembuj pĂ«rdorimi).
  • Opsioni mĂ« funksional duket se Ă«shtĂ« Selenium, pasi shumĂ« nga tĂ« dhĂ«nat e nevojshme janĂ« tĂ« mbyllura.
    1) Pra, ndodh autorizimi përmes një përdoruesi të rremë (dhe regjistrimi me dorë).

    2) Megjithatë, me Selenium nuk ka asnjë garanci për funksionimin e saktë dhe të përsëritur (të paktën në rastin e ok.ru, me siguri).

    3) Site-i Ok.ru ka gabime JavaScript dhe ndonjëherë sillet çuditshëm dhe në mënyrë të papërshtatshme.

    4) Duhet të merret me paginimin, ngarkimin e elementeve etj


    5) Gabimet e API-së që jep të dhëna, do duhet të trajtohen në mënyrë të përshkruar, për shembull, kështu (një copë kod eksperimental):

    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
    

    Gabimi im më i preferuar ishte:

    OdnoklassnikiError("Gabim(kodi: 'Nuk ka', përshkrimi: 'gabim HTTP', metoda: 'discussions.getComments', parametrot: 
)")

    6) Në përfundim, varianti Selenium + API duket si zgjidhja më logjike.

  • Duhet ruajtja e gjendjes dhe rinisja e sistemit, trajtimi i shumĂ« gabimeve, pĂ«rfshirĂ« sjelljen e pasigurt tĂ« faqes — sidomos kĂ«to gabime janĂ« tĂ« vĂ«shtira pĂ«r t'u imagjinuar (nĂ«se nuk shkruani profesionalisht parsera, sigurisht).

Vlerësimi i kushteve të kohës për këtë detyrë do të jetë 3-5 herë më i lartë se sa për mbledhjen e të dhënave nga Habra. Edhe pse në rastin e Habras ne përdorim një qasje frontale me parsing HTML, në rastin e OK ne mund të punojmë me API në vende kritike.

Përfundimet

Pavarësisht se si ju kërkohet të jepni një vlerësim të afateve "në vend" (ne kemi planifikim sot!), vëllimi i modulit të procesit të të dhënave të pipeline është praktikisht e pamundur të vlerësohet, madje edhe cilësisht, pa analizuar parametrat e detyrës.

Për të folur pak më filozofikisht, strategjitë e vlerësimit në agile përshtaten mirë për detyrat inxhinierike, por për detyrat më eksperimentale dhe, në njëfarë kuptimi, "kreative" dhe kërkimore, pra, më pak të parashikueshme, shfaqen vështirësi, si në shembujt e ngjashëm me ato që kemi shqyrtuar këtu.

Sigurisht, grumbullimi i të dhënave është një shembull ilustrues shumë i gjallë - zakonisht kjo detyrë duket jashtëzakonisht e thjeshtë dhe teknikisht e lehtë, dhe pikërisht në detaje shpesh qëndron djalli. Edhe në këtë detyrë është e mundur të tregohet e gjithë gama e mundësive për ato që mund të shkojnë keq dhe sa shumë mund të zgjatet puna.

Nëse shikojmë shkurtimisht karakteristikat e detyrës pa eksperimente të tjera, Reddit dhe OK duken të ngjashme: ka API, paketë python, por në thelb, ndryshimi është i madh. Nëse e gjykojmë nga këto parametra, parseri i Habrës duket më i komplikuar se OK - por në praktikë është krejtësisht e kundërta dhe pikërisht këtë mund ta zbulojmë duke kryer eksperimente të thjeshta për analizën e parametrave të detyrës.

Sipas ŰȘۏ۱ۚës time, qasja mĂ« efektive Ă«shtĂ« njĂ« vlerĂ«sim i pĂ«rafĂ«rt i kohĂ«s qĂ« do tĂ« nevojitet pĂ«r analizĂ«n paraprake dhe eksperimentet e para tĂ« thjeshta, si dhe leximin e dokumentacionit – kĂ«to do t'ju lejojnĂ« tĂ« jepni njĂ« vlerĂ«sim tĂ« saktĂ« pĂ«r punĂ«n e gjithĂ«herĂ«. NĂ« terma tĂ« metodologjisĂ« sĂ« njohur agile – kĂ«rkoj qĂ« tĂ« hapet njĂ« biletĂ« pĂ«r “vlerĂ«simin e parametrave tĂ« detyrĂ«s”, nĂ« bazĂ« tĂ« sĂ« cilĂ«s mund tĂ« jap njĂ« vlerĂ«sim pĂ«r atĂ« qĂ« mund tĂ« realizohet brenda “sprint-it” dhe tĂ« jap njĂ« vlerĂ«sim mĂ« tĂ« saktĂ« pĂ«r çdo detyrĂ«.

Prandaj, argumenti mĂ« efektiv duket tĂ« jetĂ« ai qĂ« do tĂ« tregonte njĂ« specialisti “jo teknik” se sa shumĂ« do tĂ« ndryshojĂ« koha dhe burimet nĂ« varĂ«si tĂ« parametrave qĂ« ende duhet tĂ« vlerĂ«sohen.

ÇfarĂ« mund tĂ« shkojĂ« keq me ShkencĂ«n e TĂ« DhĂ«nave? Grumbullimi i tĂ« dhĂ«nave

Burimi: habr.com

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster