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:
- Dy subreddite në Reddit
- Dy seksione në Habr
- 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 â 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) .
- 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 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.

Marre nga 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 += scoreDatat, 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ë artikull, kjo çoi në një moment të tillë në një skemë të ngjashme:

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, .
- 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ë 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_commentsGabimi 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.
Burimi: habr.com

