Apa yang boleh berlaku dengan Sains Data? Pengumpulan data

Apa yang boleh berlaku dengan Sains Data? Pengumpulan data
Hari ini terdapat 100500 kursus Sains Data dan telah lama diketahui bahawa paling banyak wang dalam Sains Data boleh diperolehi melalui kursus Sains Data (mengapa menggali sedangkan anda boleh menjual penyodok?). Kelemahan utama kursus ini ialah ia tiada kaitan dengan kerja sebenar: tiada siapa yang akan memberikan anda data yang bersih dan diproses dalam format yang diperlukan. Dan apabila anda meninggalkan kursus dan mula menyelesaikan masalah sebenar, banyak nuansa muncul.

Oleh itu, kami memulakan satu siri nota "Apa yang boleh berlaku dengan Sains Data", berdasarkan peristiwa sebenar yang berlaku kepada saya, rakan sekerja dan rakan sekerja saya. Kami akan menganalisis tugas biasa Sains Data menggunakan contoh sebenar: bagaimana ini sebenarnya berlaku. Mari kita mulakan hari ini dengan tugas pengumpulan data.

Dan perkara pertama orang tersandung apabila mereka mula bekerja dengan data sebenar sebenarnya mengumpul data ini yang paling berkaitan dengan kami. Mesej utama artikel ini:

Kami secara sistematik memandang rendah masa, sumber dan usaha yang diperlukan untuk mengumpul, membersihkan dan menyediakan data.

Dan yang paling penting, kita akan membincangkan apa yang perlu dilakukan untuk mencegah perkara ini.

Menurut pelbagai anggaran, pembersihan, transformasi, pemprosesan data, kejuruteraan ciri, dll. mengambil 80-90% masa, dan analisis 10-20%, manakala hampir semua bahan pendidikan tertumpu secara eksklusif pada analisis.

Mari kita lihat masalah analisis mudah dalam tiga versi sebagai contoh biasa dan lihat apakah "keadaan yang memburukkan" itu.

Dan sebagai contoh, sekali lagi, kami akan mempertimbangkan variasi tugas yang serupa untuk mengumpul data dan membandingkan komuniti untuk:

  1. Dua subreddit Reddit
  2. Dua bahagian Habr
  3. Dua kumpulan Odnoklassniki

Pendekatan bersyarat dalam teori

Buka tapak dan baca contoh, jika jelas, peruntukkan beberapa jam untuk membaca, beberapa jam untuk kod menggunakan contoh dan nyahpepijat. Tambah beberapa jam untuk pengumpulan. Buang dalam beberapa jam dalam simpanan (darab dengan dua dan tambah N jam).

Perkara Utama: Anggaran masa adalah berdasarkan andaian dan tekaan tentang tempoh masa yang akan diambil.

Ia adalah perlu untuk memulakan analisis masa dengan menganggarkan parameter berikut untuk masalah bersyarat yang diterangkan di atas:

  • Apakah saiz data dan berapa banyak data yang perlu dikumpul secara fizikal (*lihat di bawah*).
  • Apakah masa pengumpulan untuk satu rekod dan berapa lama anda perlu menunggu sebelum anda boleh mengumpul rekod kedua?
  • Pertimbangkan untuk menulis kod yang menyelamatkan keadaan dan mulakan semula apabila (bukan jika) semuanya gagal.
  • Tentukan sama ada kami memerlukan kebenaran dan tetapkan masa untuk mendapatkan akses melalui API.
  • Tetapkan bilangan ralat sebagai fungsi kerumitan data - nilai untuk tugas tertentu: struktur, berapa banyak transformasi, perkara dan cara untuk mengekstrak.
  • Betulkan ralat rangkaian dan masalah dengan tingkah laku projek bukan standard.
  • Menilai jika fungsi yang diperlukan ada dalam dokumentasi dan jika tidak, maka bagaimana dan berapa banyak yang diperlukan untuk penyelesaian.

Perkara yang paling penting ialah untuk menganggarkan masa - anda sebenarnya perlu menghabiskan masa dan usaha untuk "peninjauan berkuat kuasa" - barulah perancangan anda akan mencukupi. Oleh itu, tidak kira berapa banyak anda didesak untuk mengatakan "berapa lama masa yang diperlukan untuk mengumpul data" - luangkan sedikit masa untuk analisis awal dan pertikaikan berapa banyak masa akan berubah bergantung pada parameter sebenar tugasan.

Dan sekarang kami akan menunjukkan contoh khusus di mana parameter sedemikian akan berubah.

Perkara Utama: Anggaran adalah berdasarkan analisis faktor utama yang mempengaruhi skop dan kerumitan kerja.

Anggaran berasaskan tekaan ialah pendekatan yang baik apabila elemen berfungsi cukup kecil dan tidak terdapat banyak faktor yang boleh mempengaruhi reka bentuk masalah dengan ketara. Tetapi dalam kes beberapa masalah Sains Data, faktor sedemikian menjadi sangat banyak dan pendekatan sedemikian menjadi tidak mencukupi.

Perbandingan komuniti Reddit

Mari kita mulakan dengan kes yang paling mudah (ternyata kemudian). Secara umum, sejujurnya, kami mempunyai kes yang hampir ideal, mari semak senarai semak kerumitan kami:

  • Terdapat API yang kemas, jelas dan didokumenkan.
  • Ia sangat mudah dan yang paling penting, token diperoleh secara automatik.
  • Terdapat pembalut ular sawa - dengan banyak contoh.
  • Komuniti yang menganalisis dan mengumpul data pada reddit (malah kepada video YouTube yang menerangkan cara menggunakan pembalut python) Sebagai contoh.
  • Kaedah yang kami perlukan kemungkinan besar wujud dalam API. Selain itu, kod itu kelihatan padat dan bersih, di bawah adalah contoh fungsi yang mengumpul ulasan pada siaran.

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

Diambil daripada ini pilihan utiliti yang mudah untuk membungkus.

Walaupun fakta bahawa ini adalah kes terbaik, ia masih bernilai mengambil kira beberapa faktor penting dari kehidupan sebenar:

  • Had API - kami terpaksa mengambil data dalam kelompok (tidur antara permintaan, dsb.).
  • Masa pengumpulan - untuk analisis dan perbandingan yang lengkap, anda perlu mengetepikan masa yang penting hanya untuk labah-labah berjalan melalui subreddit.
  • Bot mesti dijalankan pada pelayanβ€”anda tidak boleh hanya menjalankannya pada komputer riba anda, memasukkannya ke dalam beg galas anda dan meneruskan perniagaan anda. Jadi saya menjalankan segala-galanya pada VPS. Menggunakan kod promosi habrahabr10 anda boleh menjimatkan 10% lagi daripada kos.
  • Ketidakbolehcapaian fizikal sesetengah data (ia kelihatan kepada pentadbir atau terlalu sukar untuk dikumpulkan) - ini mesti diambil kira; pada dasarnya, tidak semua data boleh dikumpul dalam masa yang mencukupi.
  • Ralat Rangkaian: Rangkaian adalah menyakitkan.
  • Ini adalah data sebenar yang hidup - ia tidak pernah tulen.

Sudah tentu, perlu memasukkan nuansa ini dalam pembangunan. Jam/hari tertentu bergantung pada pengalaman pembangunan atau pengalaman bekerja pada tugasan yang serupa, namun, kami melihat bahawa di sini tugas itu semata-mata kejuruteraan dan tidak memerlukan pergerakan badan tambahan untuk diselesaikan - semuanya boleh dinilai, dijadualkan dan dilakukan dengan sangat baik.

Perbandingan bahagian Habr

Mari kita beralih kepada kes yang lebih menarik dan tidak remeh untuk membandingkan benang dan/atau bahagian Habr.

Mari semak senarai semak kerumitan kami - di sini, untuk memahami setiap perkara, anda perlu menggali sedikit tugas itu sendiri dan mencuba.

  • Pada mulanya anda fikir ada API, tetapi tidak ada. Ya, ya, Habr mempunyai API, tetapi ia tidak boleh diakses oleh pengguna (atau mungkin ia tidak berfungsi sama sekali).
  • Kemudian anda hanya mula menghuraikan html - "permintaan import", apa yang boleh berlaku?
  • Bagaimana untuk menghuraikan pula? Pendekatan yang paling mudah dan paling kerap digunakan ialah mengulangi ID, ambil perhatian bahawa ia bukanlah yang paling cekap dan perlu mengendalikan kes yang berbeza - berikut ialah contoh kepadatan ID sebenar antara semua yang sedia ada.

    Apa yang boleh berlaku dengan Sains Data? Pengumpulan data
    Diambil daripada ini artikel.

  • Data mentah yang dibalut dalam HTML di bahagian atas web adalah menyakitkan. Sebagai contoh, anda ingin mengumpul dan menyimpan penarafan artikel: anda mengoyakkan skor daripada html dan memutuskan untuk menyimpannya sebagai nombor untuk pemprosesan selanjutnya: 

    1) int(skor) melemparkan ralat: kerana pada HabrΓ© terdapat tolak, seperti, sebagai contoh, dalam baris "–5" - ini adalah en dash, bukan tanda tolak (tanpa diduga, bukan?), jadi pada beberapa ketika saya terpaksa menghidupkan penghurai dengan penyelesaian yang begitu dahsyat.

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

    Mungkin tiada tarikh, tambah dan tolak sama sekali (seperti yang kita lihat di atas dalam fungsi check_date, ini berlaku).

    2) Watak istimewa yang tidak dapat dilepaskan - mereka akan datang, anda perlu bersedia.

    3) Struktur berubah bergantung kepada jenis jawatan.

    4) Catatan lama mungkin mempunyai **struktur pelik**.

  • Pada asasnya, pengendalian ralat dan perkara yang mungkin atau mungkin tidak berlaku perlu dikendalikan dan anda tidak boleh meramalkan dengan pasti apa yang akan berlaku dan bagaimana lagi struktur itu dan apa yang akan jatuh di mana - anda hanya perlu mencuba dan mengambil kira ralat yang dilemparkan oleh penghurai.
  • Kemudian anda menyedari bahawa anda perlu menghuraikan dalam beberapa utas, jika tidak, menghuraikan dalam satu kemudian akan mengambil masa 30+ jam (ini semata-mata masa pelaksanaan penghurai satu utas yang sudah berfungsi, yang tidur dan tidak termasuk di bawah sebarang larangan). DALAM ini artikel, ini membawa pada satu ketika kepada skema yang sama:

Apa yang boleh berlaku dengan Sains Data? Pengumpulan data

Jumlah senarai semak mengikut kerumitan:

  • Bekerja dengan rangkaian dan penghuraian html dengan lelaran dan carian mengikut ID.
  • Dokumen struktur heterogen.
  • Terdapat banyak tempat di mana kod mudah jatuh.
  • Perlu menulis || kod.
  • Dokumentasi yang diperlukan, contoh kod dan/atau komuniti tiada.

Anggaran masa untuk tugasan ini adalah 3-5 kali lebih tinggi daripada pengumpulan data daripada Reddit.

Perbandingan kumpulan Odnoklassniki

Mari kita beralih kepada kes yang paling menarik dari segi teknikal yang diterangkan. Bagi saya, ia sangat menarik kerana pada pandangan pertama, ia kelihatan agak remeh, tetapi ia tidak menjadi seperti itu sama sekali - sebaik sahaja anda mencucuk kayu padanya.

Mari kita mulakan dengan senarai semak kesukaran kami dan ambil perhatian bahawa kebanyakan daripada mereka akan menjadi jauh lebih sukar daripada yang dilihat pada mulanya:

  • Terdapat API, tetapi ia hampir tidak mempunyai fungsi yang diperlukan.
  • Untuk fungsi tertentu anda perlu meminta akses melalui mel, iaitu, pemberian akses tidak serta-merta.
  • Ia didokumentasikan dengan teruk (sebagai permulaan, istilah Rusia dan Inggeris bercampur-campur di mana-mana, dan sama sekali tidak konsisten - kadang-kadang anda hanya perlu meneka apa yang mereka mahu daripada anda di suatu tempat) dan, lebih-lebih lagi, reka bentuk tidak sesuai untuk mendapatkan data, contohnya , fungsi yang kita perlukan.
  • Memerlukan sesi dalam dokumentasi, tetapi tidak benar-benar menggunakannya - dan tidak ada cara untuk memahami semua selok-belok mod API selain daripada melihat-lihat dan berharap sesuatu akan berfungsi.
  • Tiada contoh dan tiada komuniti; satu-satunya titik sokongan dalam mengumpul maklumat adalah kecil pembalut dalam Python (tanpa banyak contoh penggunaan).
  • Selenium nampaknya pilihan yang paling boleh digunakan, kerana banyak data yang diperlukan dikunci.
    1) Iaitu, kebenaran berlaku melalui pengguna rekaan (dan pendaftaran dengan tangan).

    2) Walau bagaimanapun, dengan Selenium tidak ada jaminan untuk kerja yang betul dan boleh diulang (sekurang-kurangnya dalam kes ok.ru pasti).

    3) Laman web Ok.ru mengandungi ralat JavaScript dan kadangkala berkelakuan pelik dan tidak konsisten.

    4) Anda perlu melakukan penomboran, memuatkan elemen, dll...

    5) Ralat API yang diberikan oleh pembalut perlu ditangani dengan janggal, contohnya, seperti ini (sekeping kod percubaan):

    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
    

    Kesilapan kegemaran saya ialah:

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

    6) Akhirnya, Selenium + API kelihatan seperti pilihan yang paling rasional.

  • Ia adalah perlu untuk menyelamatkan keadaan dan memulakan semula sistem, mengendalikan banyak ralat, termasuk tingkah laku tapak yang tidak konsisten - dan ralat ini agak sukar untuk dibayangkan (melainkan anda menulis penghurai secara profesional, sudah tentu).

Anggaran masa bersyarat untuk tugasan ini adalah 3-5 kali lebih tinggi daripada pengumpulan data daripada Habr. Walaupun fakta bahawa dalam kes Habr kami menggunakan pendekatan hadapan dengan penghuraian HTML, dan dalam kes OK kami boleh bekerja dengan API di tempat kritikal.

Penemuan

Tidak kira berapa banyak yang anda perlukan untuk menganggarkan tarikh akhir "di tempat kejadian" (kami merancang hari ini!) modul saluran paip pemprosesan data yang besar, masa pelaksanaan hampir tidak mungkin untuk dianggarkan walaupun secara kualitatif tanpa menganalisis parameter tugas.

Pada nota yang lebih berfalsafah, strategi anggaran tangkas berfungsi dengan baik untuk tugas kejuruteraan, tetapi masalah yang lebih eksperimental dan, dalam erti kata lain, "kreatif" dan penerokaan, iaitu, kurang boleh diramal, mempunyai kesukaran, seperti dalam contoh topik yang serupa , yang telah kita bincangkan di sini.

Sudah tentu, pengumpulan data hanyalah contoh utama - ia biasanya merupakan tugas yang sangat mudah dan tidak rumit dari segi teknikal, dan syaitan sering berada dalam butirannya. Dan tepat pada tugas ini kita boleh menunjukkan keseluruhan rangkaian pilihan yang mungkin untuk apa yang boleh menjadi salah dan berapa lama kerja itu boleh diambil.

Jika anda melihat pada ciri-ciri tugas tanpa eksperimen tambahan, maka Reddit dan OK kelihatan serupa: terdapat API, pembalut ular sawa, tetapi pada dasarnya, perbezaannya sangat besar. Berdasarkan parameter ini, pars Habr kelihatan lebih rumit daripada OK - tetapi dalam praktiknya ia adalah sebaliknya, dan inilah yang boleh didapati dengan menjalankan eksperimen mudah untuk menganalisis parameter masalah.

Mengikut pengalaman saya, pendekatan yang paling berkesan adalah dengan menganggarkan masa yang anda perlukan untuk analisis awal itu sendiri dan eksperimen pertama yang mudah, membaca dokumentasi - ini akan membolehkan anda memberikan anggaran yang tepat untuk keseluruhan kerja. Dari segi metodologi tangkas yang popular, saya meminta anda membuat tiket untuk "menganggar parameter tugasan", yang berdasarkannya saya boleh memberikan penilaian tentang perkara yang boleh dicapai dalam "pecut" dan memberikan anggaran yang lebih tepat untuk setiap tugasan.

Oleh itu, hujah yang paling berkesan nampaknya adalah hujah yang akan menunjukkan kepada pakar "bukan teknikal" berapa banyak masa dan sumber akan berbeza-beza bergantung pada parameter yang masih belum dinilai.

Apa yang boleh berlaku dengan Sains Data? Pengumpulan data

Sumber: www.habr.com

Tambah komen