Data Science bilan nima noto'g'ri bo'lishi mumkin? Ma'lumotlar yig'ish

Data Science bilan nima noto'g'ri bo'lishi mumkin? Ma'lumotlar yig'ish
Bugungi kunda 100500 ta Data Science kurslari mavjud va Data Science bo'yicha eng ko'p pulni Data Science kurslari orqali olish mumkinligi uzoq vaqtdan beri ma'lum bo'lgan (nega belkurak sotish mumkin bo'lsa, qazish mumkinmi?). Ushbu kurslarning asosiy kamchiligi shundaki, ular haqiqiy ish bilan hech qanday aloqasi yo'q: hech kim sizga kerakli formatda toza, qayta ishlangan ma'lumotlarni bermaydi. Va kursni tark etib, haqiqiy muammoni hal qila boshlaganingizda, ko'plab nuanslar paydo bo'ladi.

Shuning uchun biz o'zim, o'rtoqlarim va hamkasblarim bilan sodir bo'lgan haqiqiy voqealarga asoslangan "Data Science bilan nima noto'g'ri bo'lishi mumkin" deb nomlangan bir qator eslatmalarni boshlaymiz. Biz odatiy Data Science vazifalarini haqiqiy misollar yordamida tahlil qilamiz: bu aslida qanday sodir bo'ladi. Bugun ma'lumotlar yig'ish vazifasi bilan boshlaylik.

Va odamlar haqiqiy ma'lumotlar bilan ishlashni boshlaganlarida qoqilib ketadigan birinchi narsa bu biz uchun eng mos bo'lgan ma'lumotlarni yig'ishdir. Ushbu maqolaning asosiy xabari:

Biz ma'lumotlarni yig'ish, tozalash va tayyorlash uchun zarur bo'lgan vaqt, resurslar va kuchlarni muntazam ravishda kam baholaymiz.

Va eng muhimi, buni oldini olish uchun nima qilish kerakligini muhokama qilamiz.

Turli hisob-kitoblarga ko'ra, tozalash, o'zgartirish, ma'lumotlarni qayta ishlash, xususiyat muhandisligi va boshqalar vaqtning 80-90% ni, tahlil qilish esa 10-20% ni oladi, deyarli barcha o'quv materiallari faqat tahlilga qaratilgan.

Oddiy misol sifatida uchta versiyada oddiy tahliliy masalani ko'rib chiqamiz va "og'irlashtiruvchi holatlar" nima ekanligini ko'rib chiqamiz.

Va misol tariqasida, biz ma'lumotlarni to'plash va jamoalarni taqqoslash vazifasining o'xshash variantlarini ko'rib chiqamiz:

  1. Ikki Reddit subreddits
  2. Habrning ikki bo'limi
  3. Odnoklassniki-ning ikkita guruhi

Nazariy jihatdan shartli yondashuv

Saytni oching va misollarni o'qing, agar tushunarli bo'lsa, o'qish uchun bir necha soat, misollar va disk raskadrovka yordamida kod uchun bir necha soat ajrating. Yig'ish uchun bir necha soat qo'shing. Bir necha soat zahiraga tashlang (ikkiga ko'paytiring va N soat qo'shing).

Muhim nuqta: Vaqtni hisoblash taxminlar va qancha davom etishi haqidagi taxminlarga asoslanadi.

Vaqtni tahlil qilishni yuqorida tavsiflangan shartli muammo uchun quyidagi parametrlarni baholashdan boshlash kerak:

  • Ma'lumotlarning o'lchami nima va uning qancha qismi jismoniy to'planishi kerak (*quyida ko'ring*).
  • Bitta yozuvni yig'ish vaqti qancha va ikkinchisini olishdan oldin qancha vaqt kutishingiz kerak?
  • Holatni saqlaydigan va hamma narsa bajarilmasa (agar bo'lmasa) qayta ishga tushirishni boshlaydigan kod yozishni o'ylab ko'ring.
  • Bizga avtorizatsiya kerakmi yoki yo'qligini aniqlang va API orqali kirish vaqtini belgilang.
  • Xatolar sonini ma'lumotlarning murakkabligi funktsiyasi sifatida belgilang - ma'lum bir vazifani baholang: tuzilma, qancha transformatsiyalar, nimani va qanday chiqarish kerak.
  • Tarmoq xatolarini va nostandart loyiha xatti-harakatlari bilan bog'liq muammolarni tuzatish.
  • Kerakli funktsiyalar hujjatlarda mavjudmi yoki yo'qmi, agar yo'q bo'lsa, vaqtinchalik hal qilish uchun qanday va qancha kerakligini baholang.

Eng muhimi, vaqtni hisoblash uchun - aslida "kuchli razvedka" uchun vaqt va kuch sarflashingiz kerak - shundagina rejalashtirishingiz etarli bo'ladi. Shuning uchun, sizni "ma'lumotlarni yig'ish uchun qancha vaqt ketadi" deyishga qancha turtki bo'lmasin - dastlabki tahlil uchun o'zingizga biroz vaqt ajrating va muammoning haqiqiy parametrlariga qarab vaqt qancha o'zgarishi haqida bahslashing.

Va endi biz bunday parametrlar o'zgarishi mumkin bo'lgan aniq misollarni ko'rsatamiz.

Muhim nuqta: Baholash ish hajmi va murakkabligiga ta'sir qiluvchi asosiy omillar tahliliga asoslanadi.

Funktsional elementlar etarlicha kichik bo'lsa va muammoni loyihalashga sezilarli ta'sir ko'rsatadigan omillar ko'p bo'lmasa, taxminlarga asoslangan baholash yaxshi yondashuvdir. Ammo ma'lumotlar fanining bir qator muammolarida bunday omillar juda ko'p bo'lib qoladi va bunday yondashuv etarli emas.

Reddit hamjamiyatlarini taqqoslash

Keling, eng oddiy holatdan boshlaylik (keyinchalik ma'lum bo'ladi). Umuman olganda, rostini aytsam, bizda deyarli ideal holat bor, keling, murakkablik ro'yxatini tekshirib ko'raylik:

  • To'g'ri, aniq va hujjatlashtirilgan API mavjud.
  • Bu juda oddiy va eng muhimi, token avtomatik ravishda olinadi.
  • bor python o'rami - ko'plab misollar bilan.
  • Reddit-da ma'lumotlarni tahlil qiladigan va to'playdigan hamjamiyat (hatto python wrapperdan qanday foydalanishni tushuntiruvchi YouTube videolariga ham) Masalan.
  • Bizga kerak bo'lgan usullar, ehtimol, APIda mavjud. Bundan tashqari, kod ixcham va toza ko'rinadi, quyida postga sharhlar to'playdigan funksiyaning namunasi keltirilgan.

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

dan olingan bu o'rash uchun qulay yordamchi dasturlarni tanlash.

Bu eng yaxshi holat bo'lishiga qaramay, haqiqiy hayotdan bir qator muhim omillarni hisobga olish kerak:

  • API cheklovlari - biz ma'lumotlarni to'plamlarda olishga majburmiz (so'rovlar orasidagi uyqu va boshqalar).
  • Yig'ish vaqti - to'liq tahlil qilish va taqqoslash uchun siz o'rgimchakning subreddit orqali yurishi uchun katta vaqt ajratishingiz kerak bo'ladi.
  • Bot serverda ishlashi kerak — uni shunchaki noutbukda ishga tushirib, ryukzakka qo‘yib, o‘z biznesingiz bilan shug‘ullana olmaysiz. Shunday qilib, men hamma narsani VPS-da ishga tushirdim. Habrahabr10 promo-kodidan foydalanib, siz narxning yana 10 foizini tejashingiz mumkin.
  • Ba'zi ma'lumotlarga jismoniy kirish mumkin emasligi (ular ma'murlar uchun ko'rinadi yoki ularni to'plash juda qiyin) - buni hisobga olish kerak; printsipial jihatdan, barcha ma'lumotlarni kerakli vaqtda to'plash mumkin emas.
  • Tarmoq xatolari: Tarmoqqa ulanish og'riqdir.
  • Bu jonli haqiqiy ma'lumotlar - u hech qachon toza emas.

Albatta, bu nuanslarni ishlab chiqishga kiritish kerak. Muayyan soatlar/kunlar rivojlanish tajribasiga yoki shunga o'xshash vazifalar ustida ishlash tajribasiga bog'liq, ammo biz bu erda vazifa faqat muhandislik ekanligini va hal qilish uchun qo'shimcha tana harakatlarini talab qilmasligini ko'ramiz - hamma narsani juda yaxshi baholash, rejalashtirish va bajarish mumkin.

Habr bo'limlarini taqqoslash

Keling, Habrning mavzulari va/yoki bo'limlarini taqqoslashning yanada qiziqarli va ahamiyatsiz bo'lgan holatiga o'tamiz.

Keling, murakkablikni tekshirish ro'yxatini ko'rib chiqaylik - bu erda har bir nuqtani tushunish uchun siz vazifaning o'ziga bir oz chuqurroq kirib, tajriba qilishingiz kerak bo'ladi.

  • Avvaliga siz API bor deb o'ylaysiz, lekin yo'q. Ha, ha, Habr-da API mavjud, ammo u foydalanuvchilar uchun mavjud emas (yoki u umuman ishlamasligi mumkin).
  • Keyin siz html-ni tahlil qilishni boshlaysiz - "import so'rovlari", nima noto'g'ri bo'lishi mumkin?
  • Qanday bo'lmasin, qanday tahlil qilish kerak? Eng oddiy va eng koʻp qoʻllaniladigan yondashuv identifikatorlarni takrorlash boʻlib, u eng samarali emasligini va turli holatlarni koʻrib chiqishga toʻgʻri kelishini unutmang – bu yerda mavjud boʻlganlar orasida haqiqiy identifikatorlar zichligiga misol keltiramiz.

    Data Science bilan nima noto'g'ri bo'lishi mumkin? Ma'lumotlar yig'ish
    dan olingan bu maqolalar.

  • Internetning tepasida HTML-ga o'ralgan xom ma'lumotlar og'riqdir. Masalan, siz maqolaning reytingini yig'ishni va saqlashni xohlaysiz: siz html-dan ballni olib tashladingiz va uni keyingi qayta ishlash uchun raqam sifatida saqlashga qaror qildingiz: 

    1) int(score) xatoga yo'l qo'yadi: chunki Habré'da minus bor, masalan, "–5" qatorida - bu minus belgisi emas (kutilmaganda, to'g'rimi?), shuning uchun at ba'zi nuqtalarda men tahlilchini shunday dahshatli tuzatish bilan hayotga ko'tarishim kerak edi.

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

    Sana, ortiqcha va minuslar umuman bo'lmasligi mumkin (yuqorida check_date funksiyasida ko'rib turganimizdek, bu sodir bo'ldi).

    2) Qochilmagan maxsus belgilar - ular keladi, siz tayyor bo'lishingiz kerak.

    3) Tuzilishi post turiga qarab o'zgaradi.

    4) Eski postlar **g‘alati tuzilishga** ega bo‘lishi mumkin.

  • Asosan, xatolarni hal qilish va nima sodir bo'lishi yoki bo'lmasligini hal qilish kerak bo'ladi va siz nima noto'g'ri bo'lishini va tuzilma qanday bo'lishi mumkinligini va qayerda nima qulashini aniq taxmin qila olmaysiz - shunchaki harakat qilib ko'rishingiz va hisobga olishingiz kerak. tahlilchi yuboradigan xatolar.
  • Keyin siz bir nechta mavzularni tahlil qilishingiz kerakligini tushunasiz, aks holda bittasini tahlil qilish 30+ soat davom etadi (bu allaqachon ishlayotgan bir ipli tahlilchining ishlash vaqti, u uxlaydi va hech qanday taqiqlarga tushmaydi). IN bu maqola, bu bir nuqtada shunga o'xshash sxemaga olib keldi:

Data Science bilan nima noto'g'ri bo'lishi mumkin? Ma'lumotlar yig'ish

Murakkablik bo'yicha umumiy nazorat ro'yxati:

  • Tarmoq bilan ishlash va HTMLni takrorlash va ID bo'yicha qidirish bilan tahlil qilish.
  • Heterojen tuzilishga oid hujjatlar.
  • Kod osongina tushishi mumkin bo'lgan ko'plab joylar mavjud.
  • || yozish kerak kod.
  • Kerakli hujjatlar, kod misollari va/yoki hamjamiyat etishmayapti.

Ushbu vazifani bajarish uchun taxminiy vaqt Reddit-dan ma'lumotlarni yig'ishdan 3-5 baravar ko'p bo'ladi.

Odnoklassniki guruhlarini taqqoslash

Keling, tavsiflangan texnik jihatdan eng qiziqarli holatga o'tamiz. Men uchun bu juda qiziq edi, chunki bir qarashda bu juda ahamiyatsiz ko'rinadi, lekin u umuman bunday bo'lmaydi - siz unga tayoq urishingiz bilanoq.

Keling, qiyinchilikni tekshirish ro'yxatidan boshlaylik va shuni ta'kidlaymizki, ularning ko'plari birinchi qarashlaridan ko'ra ancha qiyinroq bo'lib chiqadi:

  • API mavjud, ammo unda zarur funktsiyalar deyarli yo'q.
  • Muayyan funktsiyalarga siz pochta orqali kirishni so'rashingiz kerak, ya'ni kirish bir zumda emas.
  • Bu dahshatli hujjatlashtirilgan (boshlang'ich, rus va ingliz atamalari hamma joyda aralashib ketgan va mutlaqo nomuvofiqdir - ba'zida ular sizdan nimani xohlashlarini taxmin qilishingiz kerak) va bundan tashqari, dizayn ma'lumotlarni olish uchun mos emas, masalan , bizga kerak bo'lgan funksiya.
  • Hujjatlarda seansni talab qiladi, lekin aslida undan foydalanmaydi - va API rejimlarining barcha nozik tomonlarini tushunishning hech qanday usuli yo'q, buning uchun nimadir ishlashiga umid qilishdan boshqa narsa yo'q.
  • Na misollar, na jamoa yo'q; ma'lumot to'plashda yordam beradigan yagona nuqta kichik doka Python da (ko'p foydalanish misollarisiz).
  • Selenium eng maqbul variant bo'lib tuyuladi, chunki kerakli ma'lumotlarning ko'pi qulflangan.
    1) Ya'ni, avtorizatsiya xayoliy foydalanuvchi (va qo'lda ro'yxatdan o'tkazish) orqali amalga oshiriladi.

    2) Biroq, Selenium bilan to'g'ri va takrorlanadigan ish uchun hech qanday kafolatlar yo'q (hech bo'lmaganda ok.ru holatida).

    3) Ok.ru veb-saytida JavaScript xatolar mavjud va ba'zida o'zini g'alati va nomuvofiq tutadi.

    4) Siz sahifalarni ajratish, elementlarni yuklash va hokazolarni bajarishingiz kerak ...

    5) O'ram beradigan API xatolarini noqulay tarzda ko'rib chiqish kerak bo'ladi, masalan, bu kabi (eksperimental kodning bir qismi):

    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
    

    Mening eng sevimli xatoim:

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

    6) Oxir oqibat, Selenium + API eng oqilona variantga o'xshaydi.

  • Davlatni saqlash va tizimni qayta ishga tushirish, ko'plab xatolarni, shu jumladan saytning nomuvofiq xatti-harakatlarini hal qilish kerak - va bu xatolarni tasavvur qilish juda qiyin (agar siz tahlilchilarni professional tarzda yozmasangiz, albatta).

Ushbu vazifani bajarish uchun shartli vaqt taxmini Habrdan ma'lumot to'plashdan 3-5 baravar yuqori bo'ladi. Garchi Habr misolida biz HTML tahlili bilan frontal yondashuvdan foydalanamiz va OK holatida biz muhim joylarda API bilan ishlashimiz mumkin.

topilmalar

Katta hajmli ma'lumotlarni qayta ishlash quvuri modulining "joyida" muddatlarini (biz bugun rejalashtirmoqdamiz!) Qanchalik hisoblashingiz kerak bo'lmasin, bajarilish vaqtini vazifa parametrlarini tahlil qilmasdan ham sifat jihatidan baholash deyarli mumkin emas.

Bir oz ko'proq falsafiy eslatmada, tezkor baholash strategiyalari muhandislik vazifalari uchun yaxshi ishlaydi, ammo ko'proq eksperimental va ma'lum ma'noda "ijodiy" va kashfiyotchi, ya'ni kamroq bashorat qilinadigan muammolar shunga o'xshash mavzular misollarida bo'lgani kabi qiyinchiliklarga ega. biz bu erda muhokama qilganmiz.

Albatta, ma'lumotlar yig'ish - bu oddiy misol - bu odatda aql bovar qilmaydigan darajada sodda va texnik jihatdan murakkab bo'lmagan vazifa va shayton ko'pincha tafsilotlarda. Va aynan shu vazifada biz nima noto'g'ri bo'lishi mumkinligi va ish qancha davom etishi mumkin bo'lgan barcha variantlarni ko'rsatishimiz mumkin.

Agar siz qo'shimcha tajribalarsiz topshiriqning xususiyatlariga nazar tashlasangiz, Reddit va OK o'xshash ko'rinadi: API, python o'rami mavjud, ammo mohiyatiga ko'ra farq juda katta. Ushbu parametrlarga ko'ra, Xabrning parsi OKdan ko'ra murakkabroq ko'rinadi - lekin amalda bu butunlay teskari va muammoning parametrlarini tahlil qilish uchun oddiy tajribalar o'tkazish orqali aniqlanishi mumkin.

Mening tajribamga ko'ra, eng samarali yondashuv bu dastlabki tahlilning o'zi va oddiy birinchi tajribalar uchun kerak bo'ladigan vaqtni taxminiy hisoblash, hujjatlarni o'qish - bu sizga butun ish uchun aniq baho berishga imkon beradi. Ommabop agile metodologiyasiga kelsak, men sizdan "vazifa parametrlarini baholash" uchun chipta yaratishingizni so'rayman, uning asosida men "sprint" doirasida nimaga erishish mumkinligini baholay olaman va har biri uchun aniqroq baho bera olaman. vazifa.

Shu sababli, eng samarali argument "texnik bo'lmagan" mutaxassisga hali baholanmagan parametrlarga qarab qancha vaqt va resurslar o'zgarishini ko'rsatadigan dalil bo'lib tuyuladi.

Data Science bilan nima noto'g'ri bo'lishi mumkin? Ma'lumotlar yig'ish

Manba: www.habr.com

a Izoh qo'shish