Heddiw mae yna 100500 o gyrsiau Gwyddor Data ac mae wedi bod yn hysbys ers tro y gellir ennill y mwyaf o arian mewn Gwyddor Data trwy gyrsiau Gwyddor Data (pam cloddio pan allwch chi werthu rhawiau?). Prif anfantais y cyrsiau hyn yw nad oes ganddynt unrhyw beth i'w wneud â gwaith go iawn: ni fydd neb yn rhoi data glân, wedi'i brosesu i chi yn y fformat gofynnol. A phan fyddwch chi'n gadael y cwrs ac yn dechrau datrys problem wirioneddol, mae llawer o arlliwiau'n dod i'r amlwg.
Felly, rydym yn dechrau cyfres o nodiadau “Beth all fynd o'i le gyda Gwyddor Data”, yn seiliedig ar ddigwyddiadau go iawn a ddigwyddodd i mi, fy nghymrodyr a'm cydweithwyr. Byddwn yn dadansoddi tasgau Gwyddor Data nodweddiadol gan ddefnyddio enghreifftiau go iawn: sut mae hyn yn digwydd mewn gwirionedd. Gadewch i ni ddechrau heddiw gyda'r dasg casglu data.
A'r peth cyntaf y mae pobl yn baglu drosodd pan fyddant yn dechrau gweithio gyda data go iawn mewn gwirionedd yw casglu'r data hwn sydd fwyaf perthnasol i ni. Neges allweddol yr erthygl hon:
Rydym yn tanamcangyfrif yn systematig yr amser, yr adnoddau a'r ymdrech sydd eu hangen i gasglu, glanhau a pharatoi data.
Ac yn bwysicaf oll, byddwn yn trafod beth i'w wneud i atal hyn.
Yn ôl amcangyfrifon amrywiol, mae glanhau, trawsnewid, prosesu data, peirianneg nodwedd, ac ati yn cymryd 80-90% o'r amser, a dadansoddiad 10-20%, tra bod bron pob deunydd addysgol yn canolbwyntio'n gyfan gwbl ar ddadansoddiad.
Gadewch i ni edrych ar broblem ddadansoddol syml mewn tair fersiwn fel enghraifft nodweddiadol a gweld beth yw “amgylchiadau gwaethygol”.
Ac fel enghraifft, unwaith eto, byddwn yn ystyried amrywiadau tebyg yn y dasg o gasglu data a chymharu cymunedau ar gyfer:
- Dau is-rediad Reddit
- Dwy ran o Habr
- Dau grŵp o Odnoklassniki
Ymagwedd amodol mewn theori
Agorwch y wefan a darllenwch yr enghreifftiau, os yw'n glir, neilltuwch ychydig oriau ar gyfer darllen, ychydig oriau ar gyfer y cod gan ddefnyddio'r enghreifftiau a dadfygio. Ychwanegwch ychydig oriau i'w casglu. Taflwch ychydig oriau wrth gefn (lluoswch â dwy ac ychwanegu N awr).
Pwynt Allweddol: Mae amcangyfrifon amser yn seiliedig ar ragdybiaethau a gwaith dyfalu ynghylch pa mor hir y bydd yn ei gymryd.
Mae angen dechrau'r dadansoddiad amser trwy amcangyfrif y paramedrau canlynol ar gyfer y broblem amodol a ddisgrifir uchod:
- Beth yw maint y data a faint ohono sydd angen ei gasglu'n ffisegol (*gweler isod*).
- Beth yw'r amser casglu ar gyfer un cofnod a pha mor hir y mae'n rhaid i chi aros cyn y gallwch gasglu'r ail?
- Ystyriwch ysgrifennu cod sy'n arbed y wladwriaeth ac yn dechrau ailgychwyn pan (nid os) bydd popeth yn methu.
- Ffigurwch a oes angen awdurdodiad arnom a gosodwch yr amser ar gyfer cael mynediad trwy'r API.
- Gosod nifer y gwallau fel swyddogaeth cymhlethdod data - gwerthuso ar gyfer tasg benodol: strwythur, faint o drawsnewidiadau, beth a sut i echdynnu.
- Trwsio gwallau rhwydwaith a phroblemau gydag ymddygiad prosiect ansafonol.
- Aseswch a yw'r swyddogaethau gofynnol yn y ddogfennaeth ac os nad ydynt, yna sut a faint sydd ei angen ar gyfer datrysiad.
Y peth pwysicaf yw er mwyn amcangyfrif amser - mewn gwirionedd mae angen i chi dreulio amser ac ymdrech ar "rhagchwilio mewn grym" - dim ond wedyn y bydd eich cynllunio'n ddigonol. Felly, ni waeth faint rydych chi'n cael eich gwthio i ddweud "pa mor hir mae'n ei gymryd i gasglu data" - prynwch beth amser i chi'ch hun ar gyfer dadansoddiad rhagarweiniol a dadleuwch faint y bydd yr amser yn amrywio yn dibynnu ar baramedrau gwirioneddol y broblem.
Ac yn awr byddwn yn dangos enghreifftiau penodol lle bydd paramedrau o'r fath yn newid.
Pwynt Allweddol: Mae'r amcangyfrif yn seiliedig ar ddadansoddiad o'r ffactorau allweddol sy'n dylanwadu ar gwmpas a chymhlethdod y gwaith.
Mae amcangyfrif yn seiliedig ar ddyfaliad yn ddull da pan fo'r elfennau swyddogaethol yn ddigon bach ac nid oes llawer o ffactorau a all ddylanwadu'n sylweddol ar ddyluniad y broblem. Ond yn achos nifer o broblemau Gwyddor Data, mae ffactorau o'r fath yn dod yn hynod niferus ac mae dull o'r fath yn mynd yn annigonol.
Cymhariaeth o gymunedau Reddit
Gadewch i ni ddechrau gyda'r achos symlaf (fel y mae'n troi allan yn ddiweddarach). Yn gyffredinol, i fod yn gwbl onest, mae gennym achos bron yn ddelfrydol, gadewch i ni wirio ein rhestr wirio cymhlethdod:
- Mae API taclus, dealladwy ac wedi'i ddogfennu.
- Mae'n hynod o syml ac yn bwysicaf oll, ceir tocyn yn awtomatig.
- Mae - gyda llawer o enghreifftiau.
- Cymuned sy'n dadansoddi ac yn casglu data ar reddit (hyd yn oed i fideos YouTube yn esbonio sut i ddefnyddio peiriant lapio python) .
- Mae'r dulliau sydd eu hangen arnom fwyaf tebygol yn bodoli yn yr API. Ar ben hynny, mae'r cod yn edrych yn gryno ac yn lân, isod mae enghraifft o swyddogaeth sy'n casglu sylwadau ar bost.
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()
Cymerwyd o detholiad o gyfleustodau cyfleus ar gyfer lapio.
Er gwaethaf y ffaith mai dyma'r achos gorau, mae'n dal yn werth cymryd i ystyriaeth nifer o ffactorau pwysig o fywyd go iawn:
- Terfynau API - rydym yn cael ein gorfodi i gymryd data mewn sypiau (cysgu rhwng ceisiadau, ac ati).
- Amser casglu - ar gyfer dadansoddiad a chymhariaeth gyflawn, bydd yn rhaid i chi neilltuo amser sylweddol dim ond i'r pry cop gerdded trwy'r subreddit.
- Rhaid i'r bot redeg ar weinydd - ni allwch ei redeg ar eich gliniadur yn unig, ei roi yn eich bag cefn, a mynd o gwmpas eich busnes. Felly rhedais bopeth ar VPS. Gan ddefnyddio'r cod hyrwyddo habrahabr10 gallwch arbed 10% arall o'r gost.
- Anhygyrchedd ffisegol rhai data (maent yn weladwy i weinyddwyr neu'n rhy anodd eu casglu) - rhaid ystyried hyn mewn egwyddor, ni ellir casglu'r holl ddata mewn digon o amser.
- Gwallau rhwydwaith: Mae rhwydweithio yn boen.
- Mae hwn yn ddata byw go iawn - nid yw byth yn bur.
Wrth gwrs, mae angen cynnwys y naws hyn yn y datblygiad. Mae oriau/diwrnodau penodol yn dibynnu ar brofiad datblygu neu brofiad o weithio ar dasgau tebyg, fodd bynnag, gwelwn mai peirianneg yn unig yw'r dasg hon ac nad oes angen symudiadau corff ychwanegol i'w datrys - gellir asesu, trefnu a gwneud popeth yn dda iawn.
Cymhariaeth o adrannau Habr
Gadewch i ni symud ymlaen at achos mwy diddorol a dibwys o gymharu edafedd a/neu adrannau o Habr.
Gadewch i ni wirio ein rhestr wirio cymhlethdod - yma, er mwyn deall pob pwynt, bydd yn rhaid i chi gloddio ychydig i'r dasg ei hun ac arbrofi.
- Ar y dechrau rydych chi'n meddwl bod API, ond nid oes. Oes, oes, mae gan Habr API, ond nid yw'n hygyrch i ddefnyddwyr (neu efallai nad yw'n gweithio o gwbl).
- Yna rydych chi'n dechrau dosrannu html - “ceisiadau mewnforio”, beth allai fynd o'i le?
- Sut i ddosrannu beth bynnag? Y dull symlaf a ddefnyddir amlaf yw ailadrodd dros IDau, nodi nad dyma'r un mwyaf effeithlon a bydd yn rhaid iddo ymdrin â gwahanol achosion - dyma enghraifft o ddwysedd IDau go iawn ymhlith yr holl rai presennol.

Cymerwyd o erthyglau. - Mae data crai wedi'i lapio mewn HTML ar ben y we yn boen. Er enghraifft, rydych chi am gasglu a chadw sgôr erthygl: fe rwygasoch y sgôr allan o'r html a phenderfynu ei gadw fel rhif i'w brosesu ymhellach:
1) mae int (sgôr) yn taflu gwall: oherwydd ar Habré mae minws, fel, er enghraifft, yn y llinell “–5” - en dash yw hwn, nid arwydd minws (yn annisgwyl, iawn?), felly ar rhyw bwynt bu'n rhaid i mi godi'r parser yn fyw gyda'r fath atgyweiriad ofnadwy.
try: score_txt = post.find(class_="score").text.replace(u"–","-").replace(u"+","+") score = int(score_txt) if check_date(date): post_score += scoreEfallai na fydd dyddiad, manteision a anfanteision o gwbl (fel y gwelwn uchod yn y swyddogaeth check_date, digwyddodd hyn).
2) Cymeriadau arbennig heb eu dianc - byddant yn dod, mae angen i chi fod yn barod.
3) Mae'r strwythur yn newid yn dibynnu ar y math o bost.
4) Gall fod gan hen byst **strwythur rhyfedd**.
- Yn y bôn, bydd yn rhaid ymdrin â chamgymeriadau a’r hyn a allai ddigwydd neu beidio ac ni allwch ragweld yn sicr beth fydd yn mynd o’i le a pha mor arall y gallai’r strwythur fod a beth fydd yn disgyn oddi ar ble - bydd yn rhaid i chi geisio cymryd i ystyriaeth. y gwallau y mae'r parser yn eu taflu.
- Yna rydych chi'n sylweddoli bod angen i chi ddosrannu sawl llinyn, fel arall bydd dosrannu un yn cymryd 30+ awr (dim ond amser gweithredu parser un edau sydd eisoes yn gweithio yw hyn, sy'n cysgu ac nad yw'n dod o dan unrhyw waharddiadau). YN erthygl, arweiniodd hyn ar ryw adeg at gynllun tebyg:

Cyfanswm y rhestr wirio yn ôl cymhlethdod:
- Gweithio gyda'r rhwydwaith a dosrannu html gydag iteriad a chwilio yn ôl ID.
- Dogfennau o strwythur heterogenaidd.
- Mae yna lawer o leoedd lle gall y cod ddisgyn yn hawdd.
- Mae angen ysgrifennu || côd.
- Mae'r ddogfennaeth angenrheidiol, enghreifftiau o god, a/neu gymuned ar goll.
Bydd yr amser amcangyfrifedig ar gyfer y dasg hon 3-5 gwaith yn uwch nag ar gyfer casglu data gan Reddit.
Cymhariaeth o grwpiau Odnoklassniki
Symudwn ymlaen at yr achos mwyaf diddorol yn dechnegol a ddisgrifiwyd. I mi, roedd yn ddiddorol yn union oherwydd ar yr olwg gyntaf, mae'n edrych yn eithaf dibwys, ond nid yw'n troi allan i fod felly o gwbl - cyn gynted ag y byddwch chi'n procio ffon arno.
Gadewch i ni ddechrau gyda'n rhestr wirio anhawster a nodi y bydd llawer ohonynt yn troi allan i fod yn llawer anoddach nag y maent yn edrych ar y dechrau:
- Mae yna API, ond nid oes ganddo'r swyddogaethau angenrheidiol bron yn llwyr.
- I rai swyddogaethau mae angen i chi ofyn am fynediad trwy'r post, hynny yw, nid yw caniatáu mynediad yn syth.
- Mae wedi'i ddogfennu'n ofnadwy (i ddechrau, mae termau Rwsieg a Saesneg yn gymysg ym mhobman, ac yn gwbl anghyson - weithiau does ond angen i chi ddyfalu beth maen nhw ei eisiau gennych chi yn rhywle) ac, ar ben hynny, nid yw'r dyluniad yn addas ar gyfer cael data, er enghraifft , .
- Angen sesiwn yn y ddogfennaeth, ond nid yw'n ei ddefnyddio mewn gwirionedd - ac nid oes unrhyw ffordd i ddeall holl gymhlethdodau'r dulliau API heblaw gwthio o gwmpas a gobeithio y bydd rhywbeth yn gweithio.
- Nid oes unrhyw enghreifftiau a dim cymuned; yn Python (heb lawer o enghreifftiau o ddefnydd).
- Mae'n ymddangos mai seleniwm yw'r opsiwn mwyaf ymarferol, gan fod llawer o'r data angenrheidiol wedi'u cloi.
1) Hynny yw, mae awdurdodiad yn digwydd trwy ddefnyddiwr ffug (a chofrestru â llaw).2) Fodd bynnag, gyda Seleniwm nid oes unrhyw warantau ar gyfer gwaith cywir ac ailadroddadwy (o leiaf yn achos ok.ru yn sicr).
3) Mae gwefan Ok.ru yn cynnwys gwallau JavaScript ac weithiau mae'n ymddwyn yn rhyfedd ac yn anghyson.
4) Mae angen i chi wneud tudaleniad, llwytho elfennau, ac ati ...
5) Bydd yn rhaid trin gwallau API y mae'r papur lapio yn eu rhoi yn lletchwith, er enghraifft, fel hyn (darn o god arbrofol):
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_commentsFy hoff gamgymeriad oedd:
OdnoklassnikiError("Error(code: 'None', description: 'HTTP error', method: 'discussions.getComments', params: …)”)6) Yn y pen draw, mae Selenium + API yn edrych fel yr opsiwn mwyaf rhesymegol.
- Mae angen achub y wladwriaeth ac ailgychwyn y system, trin llawer o wallau, gan gynnwys ymddygiad anghyson y wefan - ac mae'r gwallau hyn yn eithaf anodd eu dychmygu (oni bai eich bod yn ysgrifennu parsers yn broffesiynol, wrth gwrs).
Bydd yr amcangyfrif amser amodol ar gyfer y dasg hon 3-5 gwaith yn uwch nag ar gyfer casglu data gan Habr. Er gwaethaf y ffaith ein bod yn achos Habr yn defnyddio dull blaen gyda dosrannu HTML, ac yn achos OK gallwn weithio gyda'r API mewn mannau hollbwysig.
Canfyddiadau
Ni waeth faint y mae'n ofynnol i chi amcangyfrif y dyddiadau cau “yn y fan a'r lle” (rydyn ni'n cynllunio heddiw!) ar gyfer modiwl piblinell prosesu data swmpus, nid yw bron byth yn bosibl amcangyfrif yr amser gweithredu hyd yn oed yn ansoddol heb ddadansoddi paramedrau'r dasg.
Ar nodyn ychydig yn fwy athronyddol, mae strategaethau amcangyfrif ystwyth yn gweithio’n dda ar gyfer tasgau peirianneg, ond mae problemau sy’n fwy arbrofol ac, ar un ystyr, yn “greadigol” ac yn archwiliadol, h.y., yn llai rhagweladwy, yn cael anawsterau, fel yn yr enghreifftiau o bynciau tebyg, yr ydym wedi ei drafod yma.
Wrth gwrs, dim ond enghraifft wych yw casglu data - fel arfer mae'n dasg anhygoel o syml a thechnegol syml, ac mae'r diafol yn aml yn y manylion. Ac ar y dasg hon yn union y gallwn ddangos yr holl ystod o opsiynau posibl ar gyfer yr hyn a all fynd o'i le a pha mor hir y gall y gwaith ei gymryd.
Os edrychwch ar nodweddion y dasg heb arbrofion ychwanegol, yna mae Reddit ac OK yn edrych yn debyg: mae API, deunydd lapio python, ond yn ei hanfod, mae'r gwahaniaeth yn enfawr. A barnu yn ôl y paramedrau hyn, mae pars Habr yn edrych yn fwy cymhleth nag Iawn - ond yn ymarferol mae'n hollol i'r gwrthwyneb, a dyma'n union yr hyn y gellir ei ddarganfod trwy gynnal arbrofion syml i ddadansoddi paramedrau'r broblem.
Yn fy mhrofiad i, y dull mwyaf effeithiol yw amcangyfrif yn fras yr amser y bydd ei angen arnoch ar gyfer y dadansoddiad rhagarweiniol ei hun ac arbrofion cyntaf syml, gan ddarllen y ddogfennaeth - bydd y rhain yn caniatáu ichi roi amcangyfrif cywir ar gyfer y gwaith cyfan. O ran y fethodoleg ystwyth poblogaidd, gofynnaf ichi greu tocyn ar gyfer “amcangyfrif paramedrau tasg”, ac ar sail hynny gallaf roi asesiad o'r hyn y gellir ei gyflawni o fewn y “gwibio” a rhoi amcangyfrif mwy cywir ar gyfer pob un. tasg.
Felly, mae’n ymddangos mai’r ddadl fwyaf effeithiol yw un a fyddai’n dangos i arbenigwr “annhechnegol” faint o amser ac adnoddau fydd yn amrywio yn dibynnu ar baramedrau sydd eto i’w hasesu.
Ffynhonnell: hab.com
