Was kann mit Data Science schief gehen? Datensammlung



Heute gibt es 100.500 Kurse in Data Science und es ist seit langem bekannt, dass das meiste Geld in Data Science genau durch Kurse in Data Science verdient werden kann (warum graben, wenn man Schaufeln verkaufen kann?). Der Hauptnachteil dieser Kurse ist, dass sie nichts mit echter Arbeit zu tun haben: Niemand gibt Ihnen saubere, verarbeitete Daten im erforderlichen Format. Und wenn Sie die Kurse verlassen und beginnen, das eigentliche Problem zu lösen, entstehen viele Nuancen.



Aus diesem Grund beginnen wir mit einer Reihe von Notizen "Was kann mit Data Science schief gehen?", Die auf realen Ereignissen basieren, die mir, meinen Kameraden und Kollegen passiert sind. Wir werden typische Aufgaben in Data Science anhand realer Beispiele analysieren: wie es tatsächlich passiert. Beginnen wir heute mit der Aufgabe, Daten zu sammeln.



Und das erste, worĂĽber Menschen stolpern, wenn sie anfangen, mit realen Daten zu arbeiten, ist das Sammeln der Daten, die fĂĽr uns am relevantesten sind. Die Kernbotschaft dieses Artikels:



Wir unterschätzen systematisch den Zeit-, Ressourcen- und Arbeitsaufwand für das Sammeln, Bereinigen und Aufbereiten von Daten.


Und vor allem werden wir diskutieren, was zu tun ist, um dies zu verhindern.



Nach verschiedenen Schätzungen nehmen Bereinigung, Transformation, Datenverarbeitung, Feature-Engineering usw. 80-90% der Zeit und Analyse 10-20% der Zeit in Anspruch, während sich fast alle Lehrmaterialien ausschließlich auf die Analyse konzentrieren.



Nehmen wir als typisches Beispiel ein einfaches analytisches Problem in drei Versionen und sehen, was "erschwerende Umstände" sind.



Als Beispiel werden wir wieder ähnliche Variationen der Aufgabe des Sammelns von Daten und des Vergleichens von Communities betrachten für:



  1. Zwei Reddit-Subreddits
  2. Zwei Habr-Abschnitte
  3. Zwei Gruppen von Odnoklassniki


Bedingter Ansatz in der Theorie



Ă–ffnen Sie die Site und lesen Sie die Beispiele. Wenn dies klar ist, geben Sie einige Stunden zum Lesen, einige Stunden fĂĽr den Code anhand von Beispielen und zum Debuggen ein. FĂĽgen Sie einige Stunden zum Sammeln hinzu. Einige Stunden in Reserve geben (mit zwei multiplizieren und N Stunden hinzufĂĽgen).



Schlüsselpunkt: Die Zeitschätzung basiert auf Annahmen und Vermutungen darüber, wie lange es dauern wird.



Die Zeitanalyse muss gestartet werden, indem die folgenden Parameter fĂĽr das oben beschriebene bedingte Problem ausgewertet werden:



  • Wie groĂź sind die Daten und wie viel mĂĽssen sie physisch erfasst werden (* siehe unten *)?
  • Wie lange dauert das Sammeln eines Datensatzes und wie lange dauert das Sammeln des zweiten Datensatzes?
  • Festlegen des Schreibens von Code, der den Status speichert und einen Neustart startet, wenn (und nicht wenn) alles herunterfällt.
  • , API.
  • , — : , , .
  • .
  • , , a workaround.


Um die Zeit abzuschätzen, müssen Sie vor allem Zeit und Mühe in die "Aufklärung in Kraft" investieren. Nur dann ist Ihre Planung angemessen. Unabhängig davon, wie Sie dazu gedrängt werden, zu sagen, wie lange es dauert, Daten zu sammeln, nehmen Sie sich Zeit für eine vorläufige Analyse und diskutieren Sie, wie stark die Zeit in Abhängigkeit von den tatsächlichen Parametern des Problems variieren wird.



Und jetzt werden wir spezifische Beispiele zeigen, bei denen sich solche Parameter ändern werden.



Kernpunkt: Die Bewertung basiert auf einer Analyse der Schlüsselfaktoren, die das Volumen und die Komplexität der Arbeit beeinflussen.



Die Schätzung ist ein guter Ansatz, wenn die Funktionselemente klein genug sind und es nicht viele Faktoren gibt, die die Struktur des Problems erheblich beeinflussen können. Bei einer Reihe von Data Science-Aufgaben werden solche Faktoren jedoch äußerst zahlreich und ein solcher Ansatz wird unzureichend.



Vergleich der Reddit-Communities



Beginnen wir mit dem einfachsten Fall (wie sich später herausstellt). Um ganz ehrlich zu sein, ist dies im Allgemeinen ein fast idealer Fall. Sehen wir uns unsere Checkliste für Schwierigkeiten an:



  • Es gibt eine ĂĽbersichtliche, unkomplizierte und dokumentierte API.
  • Es ist äuĂźerst einfach und wichtig, dass ein Token automatisch abgerufen wird.
  • Es gibt einen Python-Wrapper - mit einer Reihe von Beispielen.
  • Eine Gemeinschaft , die Analysen und sammelt Daten ĂĽber die reddit (bis zu YouTube - Videos zu erklären , wie die Python - Wrapper verwenden) , zum Beispiel .
  • Die Methoden, die wir höchstwahrscheinlich benötigen, sind in der API vorhanden. DarĂĽber hinaus sieht der Code kompakt und sauber aus. Im Folgenden finden Sie ein Beispiel fĂĽr eine Funktion, mit der Kommentare zu einem Beitrag gesammelt werden.


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()
Entnommen aus dieser Sammlung praktischer Wrapper-Dienstprogramme.



Trotz der Tatsache, dass wir hier den besten Fall haben, lohnt es sich immer noch, eine Reihe wichtiger Faktoren aus dem wirklichen Leben zu berĂĽcksichtigen:



  • API-Limits - Wir sind gezwungen, Daten stapelweise zu erfassen (Ruhezustand zwischen Anforderungen usw.).
  • Sammelzeit - FĂĽr eine vollständige Analyse und einen vollständigen Vergleich mĂĽssen Sie eine beträchtliche Zeit einplanen, damit die Spinne den Subreddit durchlaufen kann.
  • Der Bot muss auf dem Server ausgefĂĽhrt werden - Sie können ihn nicht einfach auf Ihrem Laptop ausfĂĽhren, in Ihren Rucksack stecken und geschäftlich arbeiten. Also habe ich alles auf einem VPS laufen lassen. Mit dem habrahabr10-Gutscheincode können Sie weitere 10% der Kosten sparen.
  • Physische Unzugänglichkeit einiger Daten (sie sind fĂĽr Administratoren sichtbar oder zu schwer zu erfassen) - dies muss berĂĽcksichtigt werden, da im Prinzip nicht alle Daten in angemessener Zeit erfasst werden können.
  • Netzwerkfehler: Netzwerk ist ein Schmerz.
  • Dies sind lebende reale Daten - sie sind niemals sauber.


Natürlich ist es notwendig, die angegebenen Nuancen in die Entwicklung einzubeziehen. Bestimmte Stunden / Tage hängen von der Entwicklungserfahrung oder der Erfahrung bei der Arbeit an ähnlichen Aufgaben ab. Wir sehen jedoch, dass es sich hier ausschließlich um Engineering handelt und keine zusätzlichen Gesten zum Lösen erforderlich sind - alles kann sehr gut bewertet, gemalt und erledigt werden.



Vergleich der Habr-Abschnitte



Kommen wir zu einem interessanteren und nicht trivialeren Fall des Vergleichs von Streams und / oder Habr-Abschnitten.



Lassen Sie uns unsere Schwierigkeits-Checkliste ĂĽberprĂĽfen - um jeden Punkt zu verstehen, mĂĽssen Sie sich bereits ein wenig mit dem Problem selbst befassen und experimentieren.



  • Zuerst denkst du, es gibt eine API, aber keine. Ja, ja, Habr hat eine API, aber nur diese steht den Benutzern nicht zur VerfĂĽgung (oder funktioniert möglicherweise ĂĽberhaupt nicht).
  • Dann fangen Sie einfach an, das HTML zu analysieren - "Importanfragen", was könnte schief gehen?
  • Wie im Allgemeinen zu analysieren? Der einfachste und am häufigsten verwendete Ansatz besteht darin, IDs zu durchlaufen. Beachten Sie, dass dies nicht der effizienteste ist und unterschiedliche Fälle behandeln muss - beispielsweise die Dichte der realen IDs unter allen vorhandenen.





    Aus diesem Artikel entnommen .
  • , HTML — . , : score html : 



    1) int(score) : , , "–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) ** **.
  • Tatsächlich mĂĽssen die Fehlerbehandlung und was möglicherweise passiert oder nicht, behandelt werden, und Sie können nicht sicher vorhersagen, was schief gehen wird und wie die Struktur sonst aussehen könnte und was wo abfallen wird. Sie mĂĽssen nur versuchen, die vom Parser ausgelösten Fehler zu berĂĽcksichtigen.
  • Dann verstehen Sie, dass Sie in mehrere Threads analysieren mĂĽssen, andernfalls dauert das Parsen in einen Thread mehr als 30 Stunden (dies ist lediglich die AusfĂĽhrungszeit eines bereits funktionierenden Single-Thread-Parsers, der in den Ruhezustand versetzt wird und nicht unter ein Verbot fällt). In diesem Artikel fĂĽhrte dies irgendwann zu einem ähnlichen Muster:






Checkliste fĂĽr den Gesamtschwierigkeitsgrad:



  • Arbeiten mit Web- und HTML-Analyse mit Iteration und Suche nach ID.
  • Dokumente heterogener Struktur.
  • Es gibt viele Stellen, an denen Code leicht fallen kann.
  • Es ist notwendig, || zu schreiben der Code.
  • Fehlende Dokumentation, Codebeispiele und / oder Community.


Die bedingte Zeitschätzung für diese Aufgabe ist 3-5 mal höher als für das Sammeln von Daten von Reddit.



Vergleich von Odnoklassniki-Gruppen



Kommen wir zum technisch interessantesten beschriebenen Fall. FĂĽr mich war es gerade deshalb interessant, weil es auf den ersten Blick ziemlich trivial aussieht, aber es stellt sich nicht als solches heraus - sobald Sie es mit einem Stock stechen.



Beginnen wir mit unserer Schwierigkeits-Checkliste und stellen fest, dass sich viele von ihnen als viel schwieriger herausstellen werden, als sie zunächst aussehen:



  • Es gibt eine API, aber es fehlen fast vollständig die erforderlichen Funktionen.
  • Sie mĂĽssen den Zugriff auf bestimmte Funktionen per E-Mail anfordern, dh die Erteilung des Zugriffs erfolgt nicht sofort.
  • ( , , — , - ) , , , , .
  • , — API, , - .
  • , — wrapper ( ).
  • Selenium, .

    1) ( ).



    2) c Selenium ( ok.ru ).



    3) . JavaScript .



    4) , …



    5) API, wrapper , , ( ):



    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 .
  • Es ist notwendig, den Status zu speichern und das System neu zu starten, viele Fehler zu behandeln, einschlieĂźlich inkonsistentem Verhalten der Site - und diese Fehler, die ziemlich schwer vorstellbar sind (wenn Sie kein professioneller Schreibparser sind, natĂĽrlich).


Die bedingte Zeitschätzung für diese Aufgabe ist 3-5 mal höher als für das Sammeln von Daten von Habr. Trotz der Tatsache, dass wir im Fall von Habr einen direkten Ansatz mit HTML-Analyse verwenden und im Fall von OK an kritischen Stellen mit der API arbeiten können.



Schlussfolgerungen



Unabhängig davon, wie viel Sie benötigen, um die Fristen "vor Ort" zu schätzen (wir planen heute!). Bei einem großen Datenverarbeitungs-Pipeline-Modul ist es fast nie möglich, die Ausführungszeit auch nur qualitativ zu schätzen, ohne die Aufgabenparameter zu analysieren.



Philosophisch gesehen eignen sich agile Bewertungsstrategien gut für technische Aufgaben, aber bei Aufgaben, die experimenteller und in gewissem Sinne „kreativ“ und forschend sind, dh weniger vorhersehbar, treten Schwierigkeiten auf, wie bei Beispielen ähnlicher Themen das haben wir hier besprochen.



Das Sammeln von Daten ist natürlich nur ein Paradebeispiel - normalerweise scheint die Aufgabe unglaublich einfach und technisch unkompliziert zu sein, und der Teufel lauert am häufigsten im Detail. Bei dieser Aufgabe zeigt sich, dass alle möglichen Optionen für das, was schief gehen kann und wie lange die Arbeit dauern kann, aufgezeigt werden.



Wenn Sie ohne zusätzliche Experimente den Augenwinkel über die Merkmale des Problems streichen, sehen Reddit und OK ähnlich aus: Es gibt eine API, einen Python-Wrapper, aber tatsächlich ist der Unterschied riesig. Nach diesen Parametern zu urteilen, sieht die Habr-Analyse komplizierter aus als OK - aber in der Praxis ist es genau umgekehrt, und dies kann durch einfache Experimente zur Analyse der Problemparameter herausgefunden werden.



Nach meiner Erfahrung ist der effektivste Ansatz eine ungefähre Schätzung der Zeit, die Sie für die vorläufige Analyse selbst benötigen, und einfache erste Experimente, bei denen Sie die Dokumentation lesen. Auf diese Weise können Sie eine genaue Schätzung für die gesamte Arbeit abgeben. In Bezug auf die beliebte agile Methodik bitte ich Sie, unter der "Schätzung der Aufgabenparameter" ein Ticket für mich zu erstellen, auf dessen Grundlage ich beurteilen kann, was im "Sprint" erreicht werden kann, und für jede Aufgabe eine genauere Schätzung abzugeben.



Daher scheint das effektivste Argument eines zu sein, das dem „nicht-technischen“ Spezialisten zeigen würde, wie viel Zeit und Ressourcen in Abhängigkeit von den noch zu schätzenden Parametern variieren werden.






All Articles