Kas datu zinÄtnÄ var noiet greizi? Datu vÄkÅ”ana
MÅ«sdienÄs ir 100500 XNUMX datu zinÄtnes kursu, un jau sen ir zinÄms, ka visvairÄk naudas datu zinÄtnÄ var nopelnÄ«t, izmantojot datu zinÄtnes kursus (kÄpÄc rakt, ja var pÄrdot lÄpstas?). Å o kursu galvenais trÅ«kums ir tas, ka tiem nav nekÄda sakara ar reÄlu darbu: neviens jums neiedos tÄ«rus, apstrÄdÄtus datus vajadzÄ«gajÄ formÄtÄ. Un, kad jÅ«s pametat kursu un sÄkat risinÄt reÄlu problÄmu, parÄdÄs daudzas nianses.
TÄpÄc mÄs sÄkam piezÄ«mju sÄriju āKas var noiet greizi ar datu zinÄtniā, pamatojoties uz patiesiem notikumiem, kas notika ar mani, maniem biedriem un kolÄÄ£iem. MÄs analizÄsim tipiskus datu zinÄtnes uzdevumus, izmantojot reÄlus piemÄrus: kÄ tas patiesÄ«bÄ notiek. SÄksim Å”odien ar datu vÄkÅ”anas uzdevumu.
Un pirmais, uz ko cilvÄki paklups, kad viÅi sÄk strÄdÄt ar reÄliem datiem, patiesÄ«bÄ ir Å”o mums visatbilstoÅ”Äko datu apkopoÅ”ana. Å Ä« raksta galvenais vÄstÄ«jums:
MÄs sistemÄtiski par zemu novÄrtÄjam laiku, resursus un pÅ«les, kas nepiecieÅ”amas datu apkopoÅ”anai, tÄ«rÄ«Å”anai un sagatavoÅ”anai.
Un pats galvenais, mÄs apspriedÄ«sim, ko darÄ«t, lai to novÄrstu.
PÄc dažÄdÄm aplÄsÄm, tÄ«rÄ«Å”ana, transformÄcija, datu apstrÄde, funkciju inženierija utt. aizÅem 80-90% laika, bet analÄ«ze - 10-20%, savukÄrt gandrÄ«z visi mÄcÄ«bu materiÄli ir vÄrsti tikai uz analÄ«zi.
ApskatÄ«sim vienkÄrÅ”u analÄ«tisko problÄmu trÄ«s versijÄs kÄ tipisku piemÄru un redzÄsim, kas ir āpastiprinoÅ”i apstÄkļiā.
KÄ piemÄru mÄs atkal apsvÄrsim lÄ«dzÄ«gas datu vÄkÅ”anas un kopienu salÄ«dzinÄÅ”anas uzdevuma variÄcijas:
Divas Reddit apakÅ”reklÄmas
Divas sadaļas Habr
Divas Odnoklassniki grupas
NosacÄ«ta pieeja teorÄtiski
Atveriet vietni un izlasiet piemÄrus, ja tas ir skaidrs, atvÄliet dažas stundas lasÄ«Å”anai, dažas stundas kodam, izmantojot piemÄrus un atkļūdoÅ”anu. Pievienojiet dažas stundas savÄkÅ”anai. Iemetiet dažas stundas rezervÄ (reiziniet ar divi un pievienojiet N stundas).
Galvenais punkts: laika aprÄÄ·ini ir balstÄ«ti uz pieÅÄmumiem un minÄjumiem par to, cik ilgi tas prasÄ«s.
Laika analÄ«ze ir jÄsÄk, novÄrtÄjot Å”Ädus parametrus iepriekÅ” aprakstÄ«tajai nosacÄ«juma problÄmai:
KÄds ir datu apjoms un cik daudz no tiem ir fiziski jÄsavÄc (*skat. zemÄk*).
KÄds ir viena ieraksta vÄkÅ”anas laiks un cik ilgi jÄgaida, lai varÄtu savÄkt otro?
Apsveriet iespÄju rakstÄ«t kodu, kas saglabÄ stÄvokli un sÄk restartÄÅ”anu, kad (ne ja) viss neizdodas.
Noskaidrojiet, vai mums ir nepiecieÅ”ama autorizÄcija, un iestatiet laiku piekļuves iegÅ«Å”anai, izmantojot API.
Iestatiet kļūdu skaitu kÄ datu sarežģītÄ«bas funkciju - novÄrtÄjiet konkrÄtam uzdevumam: struktÅ«ra, cik transformÄcijas, ko un kÄ iegÅ«t.
Labojiet tÄ«kla kļūdas un problÄmas, kas saistÄ«tas ar nestandarta projekta darbÄ«bu.
NovÄrtÄjiet, vai dokumentÄcijÄ ir vajadzÄ«gÄs funkcijas, un, ja nÄ, tad kÄ un cik daudz ir nepiecieÅ”ams risinÄjums.
Pats galvenais, lai novÄrtÄtu laiku - patiesÄ«bÄ ir jÄtÄrÄ laiks un pÅ«les "izlÅ«koÅ”anai spÄkÄ" - tikai tad jÅ«su plÄnoÅ”ana bÅ«s adekvÄta. TÄpÄc neatkarÄ«gi no tÄ, cik ļoti jÅ«s tiekat mudinÄts pateikt ācik ilgs laiks nepiecieÅ”ams datu apkopoÅ”anaiā - atvÄliet sev laiku iepriekÅ”Äjai analÄ«zei un argumentÄjiet, cik daudz laiks mainÄ«sies atkarÄ«bÄ no uzdevuma reÄlajiem parametriem.
Un tagad mÄs demonstrÄsim konkrÄtus piemÄrus, kur Å”Ädi parametri mainÄ«sies.
Galvenais punkts: aplÄse ir balstÄ«ta uz galveno faktoru analÄ«zi, kas ietekmÄ darba apjomu un sarežģītÄ«bu.
Uz minÄjumiem balstÄ«ta aplÄse ir laba pieeja, ja funkcionÄlie elementi ir pietiekami mazi un nav daudz faktoru, kas varÄtu bÅ«tiski ietekmÄt problÄmas izstrÄdi. TaÄu vairÄku datu zinÄtnes problÄmu gadÄ«jumÄ Å”Ädu faktoru kļūst ÄrkÄrtÄ«gi daudz, un Å”Äda pieeja kļūst neadekvÄta.
Reddit kopienu salÄ«dzinÄjums
SÄksim ar vienkÄrÅ”Äko gadÄ«jumu (kÄ vÄlÄk izrÄdÄ«sies). KopumÄ, godÄ«gi sakot, mums ir gandrÄ«z ideÄls gadÄ«jums, pÄrbaudÄ«sim mÅ«su sarežģītÄ«bas kontrolsarakstu:
Ir glÄ«ta, skaidra un dokumentÄta API.
Tas ir ļoti vienkÄrÅ”i, un pats galvenais, marÄ·ieris tiek iegÅ«ts automÄtiski.
Kopiena, kas analizÄ un apkopo datus par reddit (pat YouTube videoklipiem, kuros paskaidrots, kÄ izmantot python iesaiÅojumu) PiemÄram.
Mums nepiecieÅ”amÄs metodes, visticamÄk, pastÄv API. TurklÄt kods izskatÄs kompakts un tÄ«rs, zemÄk ir funkcijas piemÄrs, kas apkopo komentÄrus par ziÅu.
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()
PaÅemts no Å”is Ärtas palÄ«gierÄ«ces iesaiÅoÅ”anai.
Neskatoties uz to, ka Å”is ir labÄkais gadÄ«jums, tomÄr ir vÄrts Åemt vÄrÄ vairÄkus svarÄ«gus faktorus no reÄlÄs dzÄ«ves:
API ierobežojumi - esam spiesti Åemt datus pa partijÄm (miegs starp pieprasÄ«jumiem utt.).
SavÄkÅ”anas laiks ā pilnÄ«gai analÄ«zei un salÄ«dzinÄÅ”anai jums bÅ«s jÄatlicina ievÄrojams laiks, lai zirneklis varÄtu iziet cauri subreddit.
Botam ir jÄdarbojas serverÄ« ā jÅ«s nevarat to vienkÄrÅ”i palaist klÄpjdatorÄ, ievietot to mugursomÄ un turpinÄt savu biznesu. TÄpÄc es visu palaidu VPS. Izmantojot reklÄmas kodu habrahabr10, jÅ«s varat ietaupÄ«t vÄl 10% no izmaksÄm.
AtseviŔķu datu fiziskÄ nepieejamÄ«ba (tie ir redzami administratoriem vai ir pÄrÄk grÅ«ti apkopojami) - tas ir jÄÅem vÄrÄ, principÄ visus datus nevar savÄkt adekvÄtÄ laikÄ.
TÄ«kla kļūdas: tÄ«kla izveide ir sÄpÄ«ga.
Tie ir dzÄ«vi reÄli dati ā tie nekad nav tÄ«ri.
Protams, Ŕīs nianses ir nepiecieÅ”ams iekļaut izstrÄdÄ. KonkrÄtas stundas/dienas ir atkarÄ«gas no izstrÄdes pieredzes vai pieredzes, strÄdÄjot pie lÄ«dzÄ«giem uzdevumiem, tomÄr redzam, ka Å”eit uzdevums ir tÄ«ri inženiertehnisks un tÄ risinÄÅ”anai nav nepiecieÅ”amas papildus Ä·ermeÅa kustÄ«bas ā visu var ļoti labi novÄrtÄt, ieplÄnot un paveikt.
Habr sekciju salÄ«dzinÄjums
PÄriesim pie interesantÄka un netriviÄlÄka gadÄ«juma, kad tiek salÄ«dzinÄti Habr pavedieni un/vai sadaļas.
PÄrbaudÄ«sim mÅ«su sarežģītÄ«bas kontrolsarakstu - Å”eit, lai saprastu katru punktu, jums bÅ«s nedaudz jÄiedziļinÄs paÅ”Ä uzdevumÄ un jÄeksperimentÄ.
SÄkumÄ jÅ«s domÄjat, ka ir API, bet tÄ nav. JÄ, jÄ, Habr ir API, taÄu tas vienkÄrÅ”i nav pieejams lietotÄjiem (vai varbÅ«t tas vispÄr nedarbojas).
Tad jÅ«s vienkÄrÅ”i sÄkat parsÄt html ā āimportÄÅ”anas pieprasÄ«jumusā, kas varÄtu noiet greizi?
KÄ tomÄr parsÄt? VienkÄrÅ”ÄkÄ un visbiežÄk izmantotÄ pieeja ir atkÄrtot ID, Åemiet vÄrÄ, ka tas nav visefektÄ«vÄkais un bÅ«s jÄrisina dažÄdi gadÄ«jumi - Å”eit ir piemÄrs reÄlo ID blÄ«vumam starp visiem esoÅ”ajiem.
NeapstrÄdÄti dati, kas ietÄ«ti HTML formÄtÄ tÄ«mekļa augÅ”pusÄ, ir sÄpÄ«gi. PiemÄram, jÅ«s vÄlaties apkopot un saglabÄt raksta vÄrtÄjumu: jÅ«s izplÄsÄt rezultÄtu no html un nolÄmÄt to saglabÄt kÄ numuru turpmÄkai apstrÄdei:
Var nebÅ«t datuma, plusi un mÄ«nusi (kÄ mÄs redzam iepriekÅ” funkcijÄ check_date, tas notika).
2) SpeciÄlie varoÅi bez atkÄpÅ”anÄs ā tie atnÄks, jums jÄbÅ«t gatavam.
3) StruktÅ«ra mainÄs atkarÄ«bÄ no amata veida.
4) VecÄm ziÅÄm var bÅ«t **dÄ«vaina struktÅ«ra**.
BÅ«tÄ«bÄ bÅ«s jÄrisina kļūdu apstrÄde un tas, kas var notikt un kas var nenotikt, un jÅ«s nevarat droÅ”i paredzÄt, kas noies greizi un kÄ vÄl var bÅ«t struktÅ«ra un kas kur nokritÄ«s - jums bÅ«s tikai jÄmÄÄ£ina un jÄrÄÄ·inÄs kļūdas, ko parsÄtÄjs izmet.
Tad saproti, ka jÄparsÄ vairÄkos pavedienos, pretÄjÄ gadÄ«jumÄ parsÄÅ”ana vienÄ tad prasÄ«s 30+ stundas (tas ir tÄ«ri jau strÄdÄjoÅ”a viena pavediena parsÄtÄja izpildes laiks, kurÅ” guļ un uz to neattiecas nekÄdi aizliegumi). IN Å”is rakstu, tas kÄdÄ brÄ«dÄ« noveda pie lÄ«dzÄ«gas shÄmas:
KopÄjais kontrolsaraksts pÄc sarežģītÄ«bas:
Darbs ar tÄ«klu un html parsÄÅ”ana ar iterÄciju un meklÄÅ”anu pÄc ID.
Neviendabīgas struktūras dokumenti.
Ir daudzas vietas, kur kods var viegli nokrist.
JÄraksta || kodu.
TrÅ«kst nepiecieÅ”amÄs dokumentÄcijas, kodu piemÄru un/vai kopienas.
Paredzamais laiks Å”im uzdevumam bÅ«s 3-5 reizes lielÄks nekÄ datu vÄkÅ”anai no Reddit.
Odnoklassniki grupu salÄ«dzinÄjums
PÄriesim pie tehniski interesantÄkÄ aprakstÄ«tÄ gadÄ«juma. Man tas bija interesanti tieÅ”i ar to, ka no pirmÄ acu uzmetiena tas izskatÄs diezgan triviÄli, bet tas tÄ nemaz nav - tiklÄ«dz tu iedur ar kociÅu.
SÄksim ar mÅ«su grÅ«tÄ«bu kontrolsarakstu un Åemiet vÄrÄ, ka daudzas no tÄm izrÄdÄ«sies daudz grÅ«tÄkas, nekÄ sÄkotnÄji Ŕķiet:
Ir API, taÄu tai gandrÄ«z pilnÄ«bÄ trÅ«kst nepiecieÅ”amo funkciju.
NoteiktÄm funkcijÄm piekļuve ir jÄpieprasa pa pastu, tas ir, piekļuves pieŔķirÅ”ana nenotiek acumirklÄ«.
Tas ir Å”ausmÄ«gi dokumentÄts (sÄkumÄ krievu un angļu termini ir sajaukti visur, un pilnÄ«gi nekonsekventi - dažreiz vajag tikai uzminÄt, ko viÅi no jums kaut kur vÄlas) un turklÄt dizains nav piemÄrots datu iegÅ«Å”anai, piemÄram, , mums nepiecieÅ”amÄ funkcija.
NepiecieÅ”ama sesija dokumentÄcijÄ, taÄu tÄ faktiski netiek izmantota ā un nav iespÄjams saprast visas API režīmu sarežģītÄ«bas, izÅemot Ä·eksÄ«Å”anos un cerÄÅ”anu, ka kaut kas izdosies.
Nav piemÄru un kopienas, vienÄ«gais atbalsta punkts informÄcijas vÄkÅ”anÄ ir neliels iesaiÅojums Python valodÄ (bez daudziem lietoÅ”anas piemÄriem).
Å Ä·iet, ka selÄns ir vispiemÄrotÄkÄ iespÄja, jo daudzi nepiecieÅ”amie dati ir bloÄ·Äti.
1) Tas ir, autorizÄcija notiek ar fiktÄ«va lietotÄja starpniecÄ«bu (un reÄ£istrÄcija ar roku).
2) TomÄr ar SelÄnu nav garantijas pareizam un atkÄrtojamam darbam (vismaz ok.ru gadÄ«jumÄ noteikti).
3) Vietne Ok.ru satur JavaScript kļūdas un dažkÄrt uzvedas dÄ«vaini un nekonsekventi.
4) Jums jÄveic lappuÅ”u maiÅa, elementu ielÄde utt.
5) API kļūdas, ko sniedz iesaiÅojums, bÅ«s jÄrÄ«kojas neveikli, piemÄram, Å”Ädi (eksperimentÄla koda gabals):
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
6) Galu galÄ SelÄns + API izskatÄs kÄ racionÄlÄkÄ iespÄja.
Ir nepiecieÅ”ams saglabÄt stÄvokli un restartÄt sistÄmu, apstrÄdÄt daudzas kļūdas, tostarp vietnes nekonsekventu uzvedÄ«bu - un Ŕīs kļūdas ir diezgan grÅ«ti iedomÄties (ja vien jÅ«s, protams, nerakstat parsÄtÄjus).
NosacÄ«tais laika novÄrtÄjums Å”im uzdevumam bÅ«s 3-5 reizes lielÄks nekÄ datu vÄkÅ”anai no Habr. Neskatoties uz to, ka Habr gadÄ«jumÄ mÄs izmantojam frontÄlo pieeju ar HTML parsÄÅ”anu, bet OK gadÄ«jumÄ mÄs varam strÄdÄt ar API kritiskÄs vietÄs.
Atzinumi
Lai arÄ« cik daudz prasÄ«tu apjomÄ«ga datu apstrÄdes konveijera moduļa āuz vietasā (Å”odien plÄnojam!) termiÅu aplÄsi, izpildes laiku gandrÄ«z nekad nav iespÄjams pat kvalitatÄ«vi novÄrtÄt bez uzdevuma parametru analÄ«zes.
Nedaudz filozofiskÄk runÄjot, veiklÄs aplÄses stratÄÄ£ijas labi darbojas inženiertehniskos uzdevumos, taÄu problÄmas, kas ir vairÄk eksperimentÄlas un savÄ ziÅÄ āradoÅ”Äkasā un pÄtnieciskas, t.i., mazÄk paredzamas, rada grÅ«tÄ«bas, kÄ tas ir lÄ«dzÄ«gu tÄmu piemÄros. ko mÄs Å”eit apspriedÄm.
Protams, datu vÄkÅ”ana ir tikai spilgts piemÄrs ā tas parasti ir neticami vienkÄrÅ”s un tehniski nesarežģīts uzdevums, un velns bieži vien slÄpjas detaļÄs. Un tieÅ”i Å”ajÄ uzdevumÄ mÄs varam parÄdÄ«t visu iespÄjamo variantu klÄstu, kas var noiet greizi un cik ilgi darbs var aizÅemt.
Ja paskatÄs uz uzdevuma Ä«paŔībÄm bez papildu eksperimentiem, tad Reddit un OK izskatÄs lÄ«dzÄ«gi: ir API, python wrapper, bet bÅ«tÄ«bÄ atŔķirÄ«ba ir milzÄ«ga. Spriežot pÄc Å”iem parametriem, HÄbra pars izskatÄs sarežģītÄks par OK, taÄu praksÄ tas ir gluži pretÄji, un tieÅ”i to var noskaidrot, veicot vienkÄrÅ”us eksperimentus, lai analizÄtu problÄmas parametrus.
Mana pieredze liecina, ka visefektÄ«vÄkÄ pieeja ir aptuveni aprÄÄ·inÄt laiku, kas jums bÅ«s nepiecieÅ”ams paÅ”ai provizoriskajai analÄ«zei un vienkÄrÅ”iem pirmajiem eksperimentiem, izlasot dokumentÄciju - tas ļaus jums precÄ«zi novÄrtÄt visu darbu. RunÄjot par populÄro veiklo metodiku, aicinu izveidot āuzdevuma parametru novÄrtÄÅ”anasā biļeti, uz kuras pamata varu sniegt vÄrtÄjumu par āsprintaā ietvaros paveicamo un sniegt precÄ«zÄku tÄmi katram. uzdevums.
TÄpÄc visefektÄ«vÄkais Ŕķiet arguments, kas ānetehniskamā speciÄlistam parÄdÄ«tu, cik daudz laika un resursu mainÄ«sies atkarÄ«bÄ no vÄl jÄnovÄrtÄjamiem parametriem.