Naon anu tiasa lepat sareng Élmu Data? Ngumpulkeun data

Naon anu tiasa lepat sareng Élmu Data? Ngumpulkeun data
Kiwari aya 100500 kursus Élmu Data sareng parantos lami dipikanyaho yén paling seueur artos dina Élmu Data tiasa didamel ngalangkungan kursus Élmu Data (naha ngali nalika anjeun tiasa ngajual sekop?). Karugian utama kursus-kursus ieu nyaéta aranjeunna teu aya hubunganana sareng padamelan nyata: teu aya anu bakal masihan anjeun data anu bersih, olahan dina format anu diperyogikeun. Sareng nalika anjeun ngantunkeun kursus sareng ngamimitian ngarengsekeun masalah anu nyata, seueur nuansa muncul.

Ku alatan éta, urang dimimitian runtuyan catetan "Naon bisa balik salah Élmu Data", dumasar kana kajadian nyata anu lumangsung ka kuring, comrades sareng kolega kuring. Urang bakal nganalisis tugas Data Élmu has ngagunakeun conto nyata: kumaha ieu sabenerna kajadian. Hayu urang mimitian dinten ku tugas ngumpulkeun data.

Sareng hal anu pangheulana jalma titajong nalika ngamimitian damel sareng data nyata saleresna ngumpulkeun data ieu anu paling relevan pikeun urang. Pesen konci artikel ieu:

Urang sacara sistematis nganggap enteng waktos, sumber, sareng usaha anu diperyogikeun pikeun ngumpulkeun, ngabersihan, sareng nyiapkeun data.

Sareng anu paling penting, urang bakal ngabahas naon anu kudu dilakukeun pikeun nyegah ieu.

Numutkeun rupa perkiraan, beberesih, transformasi, ngolah data, rékayasa fitur, jsb nyandak 80-90% waktu, jeung analisis 10-20%, bari ampir kabéh bahan atikan museurkeun éksklusif kana analisis.

Hayu urang nempo hiji masalah analitik basajan dina tilu versi salaku conto has tur tingal kumaha "kaayaan nganyenyerikeun" téh.

Sareng salaku conto, deui, urang bakal nganggap variasi anu sami tina tugas ngumpulkeun data sareng ngabandingkeun komunitas pikeun:

  1. Dua subreddits Reddit
  2. Dua bagian tina Habr
  3. Dua grup Odnoklassniki

Pendekatan kondisional dina teori

Buka situs sareng baca conto, upami jelas, sisihkan sababaraha jam pikeun maca, sababaraha jam pikeun kode nganggo conto sareng debugging. Tambahkeun sababaraha jam pikeun ngumpulkeun. Buang dina sababaraha jam dina cadangan (kalikeun dua jeung tambahkeun N jam).

Titik konci: Estimasi waktos dumasar kana asumsi sareng guesswork ngeunaan sabaraha lami waktosna.

Perlu ngamimitian analisa waktos ku estimasi parameter di handap ieu pikeun masalah kondisional anu dijelaskeun di luhur:

  • Naon ukuran data sareng sabaraha jumlahna anu kedah dikumpulkeun sacara fisik (*tempo di handap*).
  • Sabaraha waktos ngumpulkeun pikeun hiji rékaman sareng sabaraha lami anjeun kedah ngantosan sateuacan anjeun tiasa ngumpulkeun anu kadua?
  • Mertimbangkeun nulis kode nu ngaheéat kaayaan tur mimitian balikan deui nalika (henteu lamun) sagalana gagal.
  • Angka kaluar naha urang kudu otorisasina tur nyetel waktu pikeun meunangkeun aksés via API.
  • Setel jumlah kasalahan salaku fungsi pajeulitna data - evaluate pikeun tugas husus: struktur, sabaraha transformasi, naon jeung kumaha nimba.
  • Ngalereskeun kasalahan jaringan sareng masalah sareng paripolah proyék non-standar.
  • Assess lamun fungsi diperlukeun aya dina dokuméntasi jeung lamun henteu, lajeng kumaha jeung sabaraha anu diperlukeun pikeun workaround a.

Hal anu paling penting nyaéta pikeun ngira-ngira waktos - anjeun leres-leres kedah nyéépkeun waktos sareng usaha dina "pengintipan dina gaya" - ngan teras perencanaan anjeun bakal nyukupan. Ku alatan éta, euweuh urusan sabaraha anjeun kadorong ngomong "sabaraha lila waktu nu diperlukeun pikeun ngumpulkeun data" - meuli diri sababaraha waktu pikeun analisis awal jeung ngajawab ku sabaraha waktos bakal rupa-rupa gumantung kana parameter nyata masalah.

Sareng ayeuna urang bakal nunjukkeun conto khusus dimana parameter sapertos kitu bakal robih.

Titik konci: Estimasi dumasar kana analisa faktor konci anu mangaruhan ruang lingkup sareng pajeulitna padamelan.

Estimasi dumasar-tebak mangrupakeun pendekatan alus lamun elemen fungsional anu cukup leutik tur aya teu loba faktor anu nyata bisa mangaruhan desain masalah. Tapi dina kasus sababaraha masalah Élmu Data, faktor sapertos janten seueur pisan sareng pendekatan sapertos kitu henteu cekap.

Babandingan komunitas Reddit

Hayu urang mimitian ku kasus pangbasajanna (sakumaha tétéla engké). Sacara umum, jujur, urang gaduh kasus anu ampir idéal, hayu urang pariksa daptar pajeulitna:

  • Aya API anu rapih, jelas sareng didokumentasikeun.
  • Saderhana pisan sareng anu paling penting, token dicandak sacara otomatis.
  • aya bungkus python - kalawan loba conto.
  • Komunitas anu nganalisa sareng ngumpulkeun data dina reddit (sanaos kana pidéo YouTube anu ngajelaskeun kumaha ngagunakeun bungkus python) Salaku conto.
  • Métode anu urang peryogikeun paling dipikaresep aya dina API. Leuwih ti éta, kode nu Sigana kompak tur bersih, handap mangrupa conto fungsi nu ngumpulkeun komentar on pos a.

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

Dicokot ti ieu pilihan Utiliti merenah pikeun wrapping.

Sanaos kanyataan yén ieu mangrupikeun kasus anu pangsaéna, éta tetep kedah dipertimbangkeun sababaraha faktor penting tina kahirupan nyata:

  • wates API - urang kapaksa nyandak data dina bets (sare antara requests, jsb).
  • Waktu ngumpulkeun - pikeun analisa lengkep sareng ngabandingkeun, anjeun kedah nyéépkeun waktos anu penting pikeun lancah pikeun ngalangkungan subreddit.
  • Bot kedah dijalankeun dina server-anjeun teu tiasa ngan ukur ngajalankeun éta dina laptop anjeun, nempatkeun kana ransel anjeun, sareng ngalaksanakeun bisnis anjeun. Janten kuring ngajalankeun sadayana dina VPS. Nganggo kode promosi habrahabr10 anjeun tiasa ngahemat 10% tina biaya.
  • Inaccessibility fisik sababaraha data (aranjeunna katingali ku pangurus atanapi sesah teuing pikeun ngumpulkeun) - ieu kedah dipertimbangkeun; prinsipna, henteu sadayana data tiasa dikumpulkeun dina waktos anu cekap.
  • Kasalahan jaringan: Jaringan mangrupikeun nyeri.
  • Ieu hirup data nyata - éta pernah murni.

Tangtu, perlu kaasup nuances ieu dina pangwangunan. Jam / dinten khusus gumantung kana pangalaman pangwangunan atanapi pangalaman damel dina tugas anu sami, tapi urang tingali yén di dieu tugasna murni rékayasa sareng henteu ngabutuhkeun gerakan awak tambahan pikeun ngabéréskeun - sadayana tiasa ditaksir, dijadwalkeun sareng dilakukeun.

Babandingan bagian Habr

Hayu urang ngaléngkah ka kasus anu langkung narik sareng non-trivial ngabandingkeun benang sareng / atanapi bagian tina Habr.

Hayu urang pariksa Daptar pariksa pajeulitna urang - di dieu, dina raraga ngartos unggal titik, anjeun bakal kudu ngagali saeutik kana tugas sorangan jeung ékspérimén.

  • Mimitina anjeun pikir aya API, tapi teu aya. Leres, leres, Habr gaduh API, tapi éta henteu tiasa diaksés ku pangguna (atanapi panginten henteu tiasa dianggo pisan).
  • Teras anjeun nembé ngamimitian parsing html - "pamundut impor", naon anu salah?
  • Kumaha carana parse atoh? Pendekatan anu pangbasajanna sareng paling sering dianggo nyaéta pikeun ngulang deui KTP, perhatikeun yén éta sanés anu paling éfisién sareng kedah nanganan kasus anu béda - ieu mangrupikeun conto dénsitas ID nyata diantara sadaya anu aya.

    Naon anu tiasa lepat sareng Élmu Data? Ngumpulkeun data
    Dicokot ti ieu tulisan.

  • Data atah dibungkus dina HTML dina luhureun web téh nyeri a. Salaku conto, anjeun badé ngumpulkeun sareng nyimpen rating hiji artikel: anjeun nyéépkeun skor tina html sareng mutuskeun pikeun nyimpen éta salaku nomer pikeun ngolah salajengna: 

    1) int(skor) ngalungkeun kasalahan: saprak dina Habré aya minus, sapertos, contona, dina garis "-5" - ieu mangrupikeun en dash, sanés tanda minus (teu disangka-sangka, leres?), janten dina sababaraha titik kuring kungsi ngangkat parser ka hirup kalawan fix dahsyat sapertos.

    try:
          score_txt = post.find(class_="score").text.replace(u"–","-").replace(u"+","+")
          score = int(score_txt)
          if check_date(date):
            post_score += score
    

    Meureun aya euweuh tanggal, pluses na minuses pisan (sakumaha urang tingali di luhur dina fungsi check_date, ieu kajadian).

    2) karakter husus Unescaped - aranjeunna bakal datang, anjeun kudu disiapkeun.

    3) Struktur robah gumantung kana jenis pos.

    4) Tulisan heubeul bisa mibanda **struktur aneh**.

  • Intina, penanganan kasalahan sareng naon anu tiasa atanapi henteu kajantenan kedah diurus sareng anjeun moal tiasa ngaduga pasti naon anu salah sareng kumaha deui strukturna sareng naon anu bakal tumiba dimana - anjeun kedah nyobian sareng tumut kana akun. kasalahan nu parser nu throws.
  • Satuluyna anjeun nyadar yén anjeun kudu parse dina sababaraha threads, disebutkeun parsing dina hiji lajeng bakal nyandak 30+ jam (ieu téh murni waktu palaksanaan parser single-threaded geus bisa dipake, nu saré jeung teu digolongkeun dina larangan nanaon). DI ieu artikel, ieu ngakibatkeun di sawatara titik ka skéma sarupa:

Naon anu tiasa lepat sareng Élmu Data? Ngumpulkeun data

Daptar pariksa total dumasar pajeulitna:

  • Gawe sareng jaringan sareng html parsing sareng iterasi sareng milarian ku ID.
  • Dokumén struktur hétérogén.
  • Aya loba tempat dimana kodeu bisa kalayan gampang ragrag.
  • Ieu perlu nulis || kodeu.
  • Dokuméntasi anu diperyogikeun, conto kode sareng / atanapi komunitas leungit.

Perkiraan waktos pikeun tugas ieu bakal 3-5 kali langkung luhur tibatan pikeun ngumpulkeun data tina Reddit.

Babandingan grup Odnoklassniki

Hayu urang ngaléngkah ka kasus anu paling téknis anu pikaresepeun anu dijelaskeun. Pikeun kuring, éta pikaresepeun pisan sabab dina pandangan anu pertama, éta katingalina rada sepele, tapi henteu janten sapertos kitu - pas anjeun nyodok iteuk.

Hayu urang mimitian ku daptar pariksa kasusah urang sareng perhatikeun yén seueur di antarana bakal janten langkung hese tibatan anu ditingali heula:

  • Aya hiji API, tapi ampir sakabéhna lacks fungsi perlu.
  • Pikeun fungsi-fungsi anu tangtu anjeun kedah nyuhunkeun aksés ku mail, nyaéta, masihan aksés henteu sakedapan.
  • Hal ieu kacida documented (ti mimiti, istilah Rusia jeung Inggris dicampurkeun nepi ka madhab, sarta sagemblengna inconsistently - kadang anjeun ngan perlu nebak naon maranéhna rék ti anjeun wae) jeung, komo deui, desain teu cocog pikeun meunangkeun data, contona. , fungsi urang kudu.
  • Meryogikeun sési dina dokuméntasi, tapi henteu leres-leres ngagunakeunana - sareng teu aya deui jalan pikeun ngartos sagala seluk-beluk modeu API sanés poking sareng ngarep-ngarep aya anu bakal jalan.
  • Henteu aya conto sareng teu aya komunitas; hiji-hijina titik pangrojong dina ngumpulkeun inpormasi nyaéta leutik bungkus dina Python (tanpa loba conto pamakéan).
  • Selenium sigana pilihan anu paling tiasa dianggo, sabab seueur data anu diperyogikeun dikonci.
    1) Hartina, otorisasi lumangsung ngaliwatan pamaké fiktif (jeung pendaptaran ku leungeun).

    2) Sanajan kitu, kalawan Selenium euweuh jaminan pikeun karya bener jeung repeatable (sahenteuna dina kasus ok.ru pasti).

    3) Website Ok.ru ngandung kasalahan JavaScript sarta kadangkala behaves ahéng na inconsistently.

    4) Anjeun kudu ngalakukeun pagination, loading elemen, jsb ...

    5) Kasalahan API anu dipasihkeun ku bungkus kedah diurus sacara kagok, contona, sapertos kieu (sapotong kode ékspérimén):

    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
    

    Kasalahan favorit kuring nyaéta:

    OdnoklassnikiError("Error(code: 'None', description: 'HTTP error', method: 'discussions.getComments', params: …)”)

    6) Pamustunganana, Selenium + API sigana pilihan anu paling rasional.

  • Ieu diperlukeun pikeun ngahemat kaayaan sarta balikan deui sistem, nanganan loba kasalahan, kaasup kabiasaan inconsistent loka - sarta kasalahan ieu rada hese ngabayangkeun (iwal mun nulis parsers professionally, tangtu).

Estimasi waktu kondisional pikeun tugas ieu bakal 3-5 kali leuwih luhur ti pikeun ngumpulkeun data ti Habr. Najan kanyataan yén dina kasus Habr kami ngagunakeun pendekatan frontal kalawan parsing HTML, sarta dina kasus OK urang tiasa dianggo kalayan API di tempat kritis.

papanggihan

Perkara teu sabaraha anjeun diperlukeun keur estimasi deadlines "dina tempat" (urang keur perencanaan kiwari!) tina modul pipa processing data voluminous, waktos palaksanaan ampir pernah mungkin keur estimasi malah qualitatively tanpa analisa parameter tugas.

Dina catetan anu rada filosofis, strategi estimasi lincah tiasa dianggo saé pikeun tugas rékayasa, tapi masalah anu langkung ékspérimén sareng, dina rasa, "kréatif" sareng éksplorasi, nyaéta, kirang tiasa diprediksi, gaduh kasusah, sapertos dina conto topik anu sami , nu geus urang bahas di dieu.

Tangtosna, pendataan mangrupikeun conto anu saé - biasana mangrupikeun tugas anu saderhana sareng téknis anu teu rumit, sareng Iblis sering dina detil. Sareng dina tugas ieu urang tiasa nunjukkeun sajumlah pilihan anu mungkin pikeun naon anu salah sareng persis sabaraha lami padamelan tiasa dilaksanakeun.

Upami anjeun ningali karakteristik tugas tanpa ékspérimén tambahan, maka Reddit sareng OK katingalina sami: aya API, bungkus python, tapi dina dasarna, bédana ageung. Ditilik ku parameter ieu, pars Habr katingalina langkung rumit tibatan OK - tapi dina prakna éta sabalikna, sareng ieu mangrupikeun anu tiasa dipendakan ku ngalaksanakeun percobaan saderhana pikeun nganalisis parameter masalah.

Dina pangalaman kuring, pendekatan anu paling efektif nyaéta kira-kira estimasi waktos anu anjeun peryogikeun pikeun analisa awal sorangan sareng percobaan munggaran anu sederhana, maca dokuméntasi - ieu bakal ngamungkinkeun anjeun masihan perkiraan anu akurat pikeun sadaya padamelan. Dina watesan metodologi lincah populér, kuring naroskeun anjeun ngadamel tikét pikeun "estimasi parameter tugas", anu dumasar kana éta kuring tiasa masihan penilaian naon anu tiasa dilaksanakeun dina "sprint" sareng masihan perkiraan anu langkung akurat pikeun masing-masing. tugas.

Ku alatan éta, argumen paling mujarab sigana hiji nu bakal némbongkeun hiji "non-teknis" spesialis sabaraha waktos jeung sumber bakal rupa-rupa gumantung kana parameter nu can ditaksir.

Naon anu tiasa lepat sareng Élmu Data? Ngumpulkeun data

sumber: www.habr.com

Tambahkeun komentar