Деректер ғылымында не қате болуы мүмкін? Деректер жинау

Деректер ғылымында не қате болуы мүмкін? Деректер жинау
Бүгінгі таңда 100500 XNUMX Data Science курстары бар және Data Science бойынша ең көп ақшаны Data Science курстары арқылы табуға болатыны бұрыннан белгілі (күрек сата алатын кезде неге қазу керек?). Бұл курстардың негізгі кемшілігі - олардың нақты жұмысқа ешқандай қатысы жоқ: ешкім сізге қажетті форматта таза, өңделген деректерді бермейді. Ал сіз курстан шығып, нақты мәселені шеше бастағанда, көптеген нюанстар пайда болады.

Сондықтан, менімен, менің жолдастарыммен және әріптестеріммен болған нақты оқиғаларға негізделген «Data Science-те не қате болуы мүмкін» жазбалар сериясын бастаймыз. Біз нақты мысалдар арқылы деректер ғылымының типтік тапсырмаларын талдаймыз: бұл іс жүзінде қалай болады. Бүгін мәліметтерді жинау тапсырмасынан бастайық.

Адамдар нақты деректермен жұмыс істей бастағанда ең алдымен сүрінетін нәрсе - бұл бізге ең маңызды деректерді жинау. Осы мақаланың негізгі хабарламасы:

Біз деректерді жинау, тазалау және дайындау үшін қажет уақытты, ресурстарды және күш-жігерді жүйелі түрде бағаламаймыз.

Ең бастысы, мұның алдын алу үшін не істеу керектігін талқылаймыз.

Түрлі бағалаулар бойынша тазалау, түрлендіру, деректерді өңдеу, мүмкіндіктерді жобалау және т.б. уақыттың 80-90%, ал талдау 10-20% алады, ал барлық дерлік оқу материалы тек талдауға бағытталған.

Типтік мысал ретінде қарапайым аналитикалық есепті үш нұсқада қарастырайық және «ауырлататын мән-жайлар» не екенін көрейік.

Мысал ретінде, біз деректер жинау және қауымдастықтарды салыстыру тапсырмасының ұқсас нұсқаларын қарастырамыз:

  1. Екі Reddit субреддиті
  2. Хабрдың екі бөлімі
  3. Одноклассники екі тобы

Теориядағы шартты тәсіл

Сайтты ашып, мысалдарды оқыңыз, егер түсінікті болса, оқуға бірнеше сағат, мысалдар мен жөндеуді пайдаланып кодқа бірнеше сағат бөліңіз. Жинау үшін бірнеше сағат қосыңыз. Бірнеше сағатты резервте қалдырыңыз (екіге көбейтіңіз және N сағат қосыңыз).

Негізгі нүкте: Уақытты бағалау қанша уақытқа созылатыны туралы болжамдар мен жорамалдарға негізделген.

Уақытты талдауды жоғарыда сипатталған шартты есептің келесі параметрлерін бағалаудан бастау керек:

  • Деректер өлшемі қандай және оның қаншасы физикалық түрде жиналуы керек (*төменде қараңыз*).
  • Бір жазбаны жинау уақыты қанша және екіншісін жинамас бұрын қанша уақыт күту керек?
  • Күйді сақтайтын және бәрі сәтсіз болғанда (егер емес) қайта іске қосуды бастайтын кодты жазуды қарастырыңыз.
  • Бізге авторизация қажет пе екенін анықтап, API арқылы рұқсат алу уақытын белгілеңіз.
  • Қателер санын деректер күрделілігінің функциясы ретінде орнатыңыз - нақты тапсырма үшін бағалаңыз: құрылым, қанша түрлендіру, нені және қалай шығару керек.
  • Желі қателерін және жобаның стандартты емес әрекетіне қатысты мәселелерді түзетіңіз.
  • Қажетті функциялар құжаттамада бар ма, жоқ па, оны шешу үшін қалай және қанша қажет екенін бағалаңыз.

Ең бастысы, уақытты бағалау үшін – шын мәнінде «барлау әрекетіне» уақыт пен күш жұмсау керек – сонда ғана сіздің жоспарлауыңыз сәйкес болады. Сондықтан, сізді «деректерді жинау қанша уақытты алады» деп айтуға қанша итермелесеңіз де, алдын ала талдау үшін өзіңізге біраз уақыт сатып алыңыз және тапсырманың нақты параметрлеріне байланысты уақыттың қаншалықты өзгеретіні туралы айтыңыз.

Енді біз мұндай параметрлер өзгеретін нақты мысалдарды көрсетеміз.

Негізгі нүкте: Бағалау жұмыстың көлемі мен күрделілігіне әсер ететін негізгі факторларды талдауға негізделген.

Функционалдық элементтер жеткілікті аз болған кезде және мәселенің дизайнына айтарлықтай әсер ететін факторлар көп болмаса, болжамға негізделген бағалау жақсы әдіс болып табылады. Бірақ деректер ғылымының бірқатар проблемалары жағдайында мұндай факторлар өте көп болады және мұндай көзқарас жеткіліксіз болады.

Reddit қауымдастықтарын салыстыру

Ең қарапайым жағдайдан бастайық (кейінірек белгілі болғандай). Жалпы, шынымды айтсам, бізде дерлік тамаша жағдай бар, күрделілікті тексеру тізімін тексерейік:

  • Ұқыпты, анық және құжатталған API бар.
  • Бұл өте қарапайым және ең бастысы, таңбалауыш автоматты түрде алынады.
  • бар питон қаптамасы - көптеген мысалдармен.
  • Reddit-те деректерді талдайтын және жинайтын қауымдастық (тіпті python қаптамасын қалай пайдалану керектігін түсіндіретін YouTube бейнелеріне дейін) Мысалы.
  • Бізге қажет әдістер API ішінде бар болуы мүмкін. Сонымен қатар, код ықшам және таза көрінеді, төменде постқа түсініктемелерді жинайтын функцияның мысалы келтірілген.

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

-дан алынған бұл орау үшін ыңғайлы утилиталардың таңдауы.

Бұл ең жақсы жағдай болғанына қарамастан, нақты өмірдегі бірқатар маңызды факторларды ескерген жөн:

  • API шектеулері - біз деректерді пакеттермен алуға мәжбүрміз (сұраулар арасындағы ұйқы және т.б.).
  • Жинау уақыты - толық талдау және салыстыру үшін сізге өрмекшінің субреддит арқылы өтуі үшін айтарлықтай уақыт бөлуге тура келеді.
  • Бот серверде жұмыс істеуі керек — оны жай ғана ноутбукта іске қосып, рюкзактарыңызға салып, өз ісіңізді жалғастыра алмайсыз. Сондықтан мен бәрін VPS арқылы іске қостым. Habrahabr10 жарнамалық кодын пайдалану құнының тағы 10% үнемдей аласыз.
  • Кейбір деректердің физикалық қолжетімсіздігі (олар әкімшілерге көрінеді немесе оларды жинау өте қиын) - мұны ескеру қажет, негізінен барлық деректерді тиісті уақытта жинау мүмкін емес.
  • Желі қателері: Желіге қосылу - бұл ауыртпалық.
  • Бұл тірі нақты деректер – ол ешқашан таза емес.

Әрине, бұл нюанстарды әзірлеуге қосу керек. Нақты сағаттар/күндер әзірлеу тәжірибесіне немесе ұқсас тапсырмалармен жұмыс істеу тәжірибесіне байланысты, дегенмен, біз бұл жерде тапсырманың таза инженерлік екенін және шешу үшін қосымша дене қозғалысын қажет етпейтінін көреміз - барлығын өте жақсы бағалауға, жоспарлауға және орындауға болады.

Хабр бөлімдерін салыстыру

Habr ағындарын және/немесе бөлімдерін салыстырудың қызықты және тривиальды емес жағдайына көшейік.

Біздің күрделілікті тексеру парағын тексерейік - мұнда әрбір тармақты түсіну үшін тапсырманың өзін аздап зерттеп, тәжірибе жасау керек.

  • Алдымен сіз API бар деп ойлайсыз, бірақ жоқ. Иә, иә, Habr-те API бар, бірақ ол пайдаланушылар үшін қол жетімді емес (немесе ол мүлде жұмыс істемеуі мүмкін).
  • Содан кейін сіз жай ғана html талдауын бастайсыз - «импорттық сұраулар», не қате болуы мүмкін?
  • Қалай болса да талдауға болады? Ең қарапайым және жиі қолданылатын әдіс - идентификаторларды қайталау, оның ең тиімді емес екенін және әртүрлі жағдайларды өңдеуге тура келетінін ескеріңіз - мұнда барлық барлардың арасындағы нақты идентификаторлардың тығыздығының мысалы келтірілген.

    Деректер ғылымында не қате болуы мүмкін? Деректер жинау
    -дан алынған бұл мақалалар.

  • Интернеттің жоғарғы жағында HTML-ге оралған өңделмеген деректер - бұл ауыртпалық. Мысалы, сіз мақаланың рейтингін жинап, сақтағыңыз келеді: сіз html-ден ұпайды алып тастадыңыз және оны әрі қарай өңдеу үшін сан ретінде сақтауды шештіңіз: 

    1) int(ұпай) қате жібереді: өйткені Хабреде минус бар, мысалы, «–5» жолында - бұл минус белгісі емес (күтпеген жерден, солай ма?), ең сызықша. Мен талдаушыны осындай қорқынышты түзету арқылы өмірге көтеруге тура келді.

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

    Күн, плюс және минус мүлде болмауы мүмкін (жоғарыда check_date функциясында көргеніміздей, бұл орын алды).

    2) Қашып кетпеген ерекше кейіпкерлер - олар келеді, сіз дайын болуыңыз керек.

    3) Посттың түріне байланысты құрылымы өзгереді.

    4) Ескі жазбаларда **біртүрлі құрылым** болуы мүмкін.

  • Негізінде, қателерді өңдеу және не болуы мүмкін немесе болмауы мүмкін және сіз ненің дұрыс емес болатынын және құрылымның қалай болатынын және қайда құлайтынын нақты болжай алмайсыз - сіз жай ғана әрекет етіп, ескеруіңіз керек. талдаушы жіберетін қателер.
  • Содан кейін сіз бірнеше ағындарды талдау қажет екенін түсінесіз, әйтпесе біреуінде талдау 30+ сағатты алады (бұл ұйықтап жатқан және ешбір тыйымға жатпайтын қазірдің өзінде жұмыс істейтін бір ағынды талдаушының орындалу уақыты). IN бұл мақалада бұл бір сәтте ұқсас схемаға әкелді:

Деректер ғылымында не қате болуы мүмкін? Деректер жинау

Күрделілігі бойынша жалпы бақылау тізімі:

  • Желімен жұмыс істеу және итерациямен html талдау және ID бойынша іздеу.
  • Гетерогенді құрылымның құжаттары.
  • Код оңай түсіп кетуі мүмкін көптеген жерлер бар.
  • || деп жазу керек код.
  • Қажетті құжаттама, код мысалдары және/немесе қауымдастық жоқ.

Бұл тапсырманы орындаудың болжалды уақыты Reddit-тен деректерді жинауға қарағанда 3-5 есе көп болады.

Одноклассники топтарын салыстыру

Сипатталған ең техникалық қызықты жағдайға көшейік. Мен үшін бұл қызықты болды, өйткені бір қарағанда, бұл өте тривиальды болып көрінеді, бірақ олай болмайды - сіз оған таяқшаны тигізген кезде.

Біздің қиыншылықтарды тексеру тізімімізден бастайық және олардың көпшілігі бірінші қарағанда әлдеқайда қиын болатынын ескеріңіз:

  • API бар, бірақ оған қажетті функциялар толығымен дерлік жетіспейді.
  • Белгілі бір функцияларға пошта арқылы рұқсат сұрау керек, яғни рұқсат беру бірден емес.
  • Бұл өте құжатталған (бастапқыда, орыс және ағылшын терминдері барлық жерде араласады және мүлдем сәйкес келмейді - кейде олардың сізден не қалайтынын болжау керек) және оның үстіне дизайн деректерді алуға жарамайды, мысалы , бізге қажет функция.
  • Құжаттамада сеанс қажет, бірақ оны іс жүзінде пайдаланбайды - және бірдеңе жұмыс істейді деп үміттенуден басқа API режимдерінің барлық қыр-сырын түсінудің ешқандай жолы жоқ.
  • Мысалдар мен қауымдастық жоқ; ақпарат жинаудағы жалғыз қолдау нүктесі - шағын Қабық Python тілінде (қолданудың көптеген мысалдары жоқ).
  • Селен ең тиімді нұсқа болып көрінеді, өйткені көптеген қажетті деректер құлыптаулы.
    1) Яғни авторизация жалған пайдаланушы (және қолмен тіркеу) арқылы жүзеге асады.

    2) Дегенмен, Selenium-да дұрыс және қайталанатын жұмысқа кепілдік жоқ (кем дегенде ok.ru жағдайында).

    3) Ok.ru веб-сайтында JavaScript қателері бар және кейде біртүрлі және сәйкес келмейтін әрекет етеді.

    4) Беттеуді, элементтерді жүктеуді және т.б. орындау керек...

    5) Қаптама беретін API қателері ыңғайсыз өңделуі керек, мысалы, келесідей (эксперименттік код бөлігі):

    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
    

    Менің сүйікті қателігім болды:

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

    6) Сайып келгенде, Selenium + API ең ұтымды нұсқаға ұқсайды.

  • Күйді сақтау және жүйені қайта іске қосу, көптеген қателерді, соның ішінде сайттың сәйкес келмейтін әрекетін өңдеу керек - және бұл қателерді елестету өте қиын (егер сіз талдаушыларды кәсіби түрде жазбасаңыз, әрине).

Бұл тапсырманың шартты уақыты Хабрдан деректерді жинауға қарағанда 3-5 есе жоғары болады. Habr жағдайында біз HTML талдауымен фронтальды тәсілді қолданатынымызға қарамастан, ал OK жағдайында API-мен маңызды жерлерде жұмыс істей аламыз.

қорытындылар

Көлемді деректерді өңдеу құбыры модулінің мерзімін «орнында» (біз бүгін жоспарлап отырмыз!) бағалау қаншалықты талап етілсе де, орындалу уақытын тапсырма параметрлерін талдамай-ақ сапалы түрде бағалау ешқашан мүмкін емес.

Философиялық тұрғыдан алғанда, епті бағалау стратегиялары инженерлік тапсырмалар үшін жақсы жұмыс істейді, бірақ тәжірибелік және белгілі бір мағынада «шығармашылық» және зерттеушілік болып табылатын, яғни аз болжауға болатын мәселелерде ұқсас тақырыптардың мысалдарындағы сияқты қиындықтар бар. біз мұнда талқыладық.

Әрине, деректерді жинау - бұл жай ғана мысал - бұл әдетте керемет қарапайым және техникалық күрделі емес тапсырма, ал шайтан көбінесе егжей-тегжейлерде болады. Дәл осы тапсырма бойынша біз ненің дұрыс емес болуы мүмкін екенін және жұмыс қанша уақытқа созылатынын көрсетуге болады.

Қосымша эксперименттерсіз тапсырманың сипаттамаларына көз жүгіртсеңіз, Reddit және OK ұқсас көрінеді: API, python қаптамасы бар, бірақ мәні бойынша айырмашылық өте үлкен. Осы параметрлерге қарағанда, Хабрдың парсы OK қарағанда күрделірек көрінеді - бірақ іс жүзінде бұл мүлдем керісінше және бұл мәселенің параметрлерін талдау үшін қарапайым эксперименттер жүргізу арқылы анықталуы мүмкін.

Менің тәжірибемде ең тиімді әдіс - алдын ала талдаудың өзі және қарапайым алғашқы тәжірибелер үшін қажет уақытты шамамен бағалау, құжаттаманы оқу - бұл сізге бүкіл жұмыстың нақты бағасын беруге мүмкіндік береді. Танымал agile әдістемесі тұрғысынан мен сізден «тапсырма параметрлерін бағалау» билетін жасауыңызды сұраймын, оның негізінде мен «спринт» аясында не істеуге болатынын бағалауды және әрқайсысы үшін дәлірек бағалауды бере аламын. тапсырма.

Сондықтан, ең тиімді дәлел «техникалық емес» маманға әлі бағаланбаған параметрлерге байланысты қанша уақыт пен ресурстар өзгеретінін көрсететін дәлел сияқты.

Деректер ғылымында не қате болуы мүмкін? Деректер жинау

Ақпарат көзі: www.habr.com

пікір қалдыру