{"id":89206,"date":"2020-07-20T07:41:57","date_gmt":"2020-07-20T05:41:57","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/chto-mozhet-pojti-ne-tak-s-data-science-sbor-dannyh"},"modified":"2020-07-20T07:41:57","modified_gmt":"2020-07-20T05:41:57","slug":"chto-mozhet-pojti-ne-tak-s-data-science-sbor-dannyh","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/chto-mozhet-pojti-ne-tak-s-data-science-sbor-dannyh","title":{"rendered":"O que pode dar errado com a Ci\u00eancia de Dados? Coleta de dados","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/510944\/\"><img decoding=\"async\" alt=\"O que pode dar errado com a Ci\u00eancia de Dados? Coleta de dados\" src=\"\/wp-content\/uploads\/2020\/07\/49fb91fc3e45754e437b2c1fc4fec12f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\nAtualmente, existem 100.500 cursos de Data Science e j\u00e1 \u00e9 bem conhecido que \u00e9 atrav\u00e9s desses cursos que se pode ganhar mais dinheiro em Data Science (por que cavar, quando se pode vender p\u00e1s?). O principal problema desses cursos \u00e9 que eles n\u00e3o t\u00eam nada a ver com o trabalho real: ningu\u00e9m ir\u00e1 fornecer dados limpos e processados no formato necess\u00e1rio. E quando voc\u00ea termina o curso e come\u00e7a a resolver um problema real, surgem muitos nuances.<\/p>\n<p>Por isso, come\u00e7amos uma s\u00e9rie de notas intituladas \"O que pode dar errado com Data Science\", baseadas em eventos reais que aconteceram comigo, meus amigos e colegas. Vamos analisar exemplos reais de tarefas t\u00edpicas de Data Science: como isso realmente acontece. Hoje come\u00e7aremos com a tarefa de coleta de dados.<\/p>\n<p>E a primeira coisa em que as pessoas trope\u00e7am ao trabalhar com dados reais \u00e9, na verdade, a coleta dos dados relevantes. A mensagem principal deste artigo \u00e9:<\/p>\n<blockquote><p><b>Subestimamos sistematicamente o tempo, os recursos e os esfor\u00e7os necess\u00e1rios para coletar, limpar e preparar os dados.<\/b><\/p><\/blockquote>\n<p>\nE o mais importante, discutiremos o que fazer para evitar isso.<\/p>\n<p>De acordo com v\u00e1rias estimativas, a limpeza, transforma\u00e7\u00e3o, processamento de dados, engenharia de caracter\u00edsticas, etc. ocupam de 80 a 90% do tempo, enquanto a an\u00e1lise leva de 10 a 20%, enquanto quase todo o material did\u00e1tico foca exclusivamente na an\u00e1lise.<\/p>\n<p>Vamos analisar um exemplo simples de uma tarefa anal\u00edtica t\u00edpica em tr\u00eas variantes e veremos quais s\u00e3o as \"circunst\u00e2ncias agravantes\".<\/p>\n<p>E para o exemplo, novamente, consideraremos varia\u00e7\u00f5es semelhantes da tarefa de coleta de dados e compara\u00e7\u00e3o de comunidades para:<\/p>\n<ol>\n<li>Dois subreddits do Reddit<\/li>\n<li>Duas se\u00e7\u00f5es do Habr<\/li>\n<li>Dois grupos do Odnoklassniki<\/li>\n<\/ol>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Uma abordagem condicional na teoria<\/h2>\n<p>\nAbra o site e leia os exemplos, se estiver claro, reserve algumas horas para leitura, algumas horas para codifica\u00e7\u00e3o dos exemplos e depura\u00e7\u00e3o. Adicione algumas horas para coleta. Adicione algumas horas a mais (multiplique por dois e acrescente N horas).<\/p>\n<p><b>O ponto chave: a estimativa de tempo \u00e9 baseada em suposi\u00e7\u00f5es e adivinha\u00e7\u00f5es sobre quanto tempo isso levar\u00e1.<\/b><\/p>\n<p>Come\u00e7ar a an\u00e1lise de tempo precisa ter uma estimativa dos seguintes par\u00e2metros para a tarefa condicional descrita acima:<\/p>\n<ul>\n<li>Qual \u00e9 o tamanho dos dados e quanto \u00e9 necess\u00e1rio coletar fisicamente (*veja abaixo*).<\/li>\n<li>Qual o tempo de coleta de um registro e quanto \u00e9 necess\u00e1rio esperar antes de poder coletar o segundo.<\/li>\n<li>Implementar a escrita de c\u00f3digo que mant\u00e9m o estado e reinicia quando (e n\u00e3o se) tudo falhar.<\/li>\n<li>Entender se precisamos de autoriza\u00e7\u00e3o e estipular o tempo para obter acesso via API.<\/li>\n<li>Registrar o n\u00famero de erros como uma fun\u00e7\u00e3o da complexidade dos dados \u2014 avaliar com base em uma tarefa espec\u00edfica: estrutura, quantas transforma\u00e7\u00f5es, o que e como extra\u00edmos.<\/li>\n<li>Considerar erros de rede e problemas com comportamentos incomuns do projeto.<\/li>\n<li>Avaliar se as fun\u00e7\u00f5es necess\u00e1rias est\u00e3o na documenta\u00e7\u00e3o e, se n\u00e3o, como e quanto ser\u00e1 necess\u00e1rio para uma solu\u00e7\u00e3o alternativa.<\/li>\n<\/ul>\n<p>\nO mais importante para estimar o tempo \u2014 voc\u00ea realmente precisa dedicar tempo e esfor\u00e7o para uma 'explora\u00e7\u00e3o inicial' \u2014 somente assim seu planejamento ser\u00e1 adequado. Portanto, por mais que lhe pressionem para dizer 'quanto tempo \u00e9 necess\u00e1rio para coletar dados' \u2014 reserve um tempo para a an\u00e1lise preliminar e argumente que o tempo vai variar dependendo dos par\u00e2metros reais da tarefa.<\/p>\n<p>E agora, vamos demonstrar exemplos concretos onde tais par\u00e2metros ir\u00e3o mudar.<\/p>\n<p><b>Ponto chave: a estimativa baseia-se na an\u00e1lise de fatores-chave que influenciam o volume e a complexidade do trabalho.<\/b><\/p>\n<p>Uma estimativa baseada em palpites \u00e9 uma boa abordagem quando os elementos funcionais s\u00e3o relativamente pequenos e existem poucos fatores que podem impactar significativamente a estrutura da tarefa. Mas em uma s\u00e9rie de tarefas de Data Science, muitos fatores surgem e essa abordagem torna-se inadequada.<\/p>\n<h2>Compara\u00e7\u00e3o de comunidades Reddit<\/h2>\n<p>\nVamos come\u00e7ar com o caso mais simples (como se mostrar\u00e1 mais tarde). De fato, se formos completamente honestos, temos quase um caso ideal, vamos verificar nossa lista de verifica\u00e7\u00e3o de complexidade:<\/p>\n<ul>\n<li>H\u00e1 uma API clara, compreens\u00edvel e documentada.<\/li>\n<li>\u00c9 extremamente simples, e o mais importante, o token \u00e9 gerado automaticamente.<\/li>\n<li>H\u00e1 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/praw-dev\/praw\">python wrapper<\/a><\/noindex> \u2014 com muitos exemplos.<\/li>\n<li>A comunidade que se dedica \u00e0 an\u00e1lise e coleta de dados no Reddit (inclusive v\u00eddeos no YouTube que explicam como usar o python wrapper) <noindex><a rel=\"nofollow\" href=\"https:\/\/www.programcreek.com\/python\/example\/86599\/praw.Reddit\">aqui, por exemplo,<\/a><\/noindex>.<\/li>\n<li>Os m\u00e9todos que precisamos provavelmente est\u00e3o dispon\u00edveis na API. Al\u00e9m disso, o c\u00f3digo parece compacto e limpo, abaixo um exemplo de uma fun\u00e7\u00e3o que coleta coment\u00e1rios de um post.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"python\">def get_comments(submission_id):\n    reddit = Reddit(check_for_updates=False, user_agent=AGENT)\n    submission = reddit.submission(id=submission_id)\n    more_comments = submission.comments.replace_more()\n    if more_comments:\n        skipped_comments = sum(x.count for x in more_comments)\n        logger.debug('Skipped %d MoreComments (%d comments)',\n                     len(more_comments), skipped_comments)\n    return submission.comments.list()\n<\/code><\/pre>\n<p><i>Retirado de <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/timendum\/reddit-utilities\/blob\/master\/thread-export.py\">artigo. Mas, como mencionado anteriormente, ao tentarmos aplic\u00e1-lo diretamente no blockchain, surgem limita\u00e7\u00f5es t\u00e9cnicas. Aqui est\u00e1 um exemplo de implementa\u00e7\u00e3o de teste do protocolo em um contrato inteligente EOS e sua parte mais importante \u2014 a verifica\u00e7\u00e3o do share publicado pelo participante:<\/a><\/noindex> sele\u00e7\u00f5es de utilit\u00e1rios convenientes para empacotamento.<\/i><\/p>\n<p>Embora estejamos diante do melhor caso, ainda devemos levar em conta uma s\u00e9rie de fatores importantes da vida real:<\/p>\n<ul>\n<li>Limites da API \u2014 somos obrigados a coletar dados em lotes (pausando entre as requisi\u00e7\u00f5es, etc.).<\/li>\n<li>Tempo de coleta \u2014 para uma an\u00e1lise e compara\u00e7\u00e3o completas, ser\u00e1 necess\u00e1rio reservar um tempo consider\u00e1vel apenas para o spider percorrer o subreddt.<\/li>\n<li>O bot deve ser executado em um servidor \u2014 voc\u00ea n\u00e3o pode simplesmente inicializ\u00e1-lo no seu notebook, colocar na mochila e sair para resolver quest\u00f5es. Portanto, eu executei tudo em um VPS. Usando o c\u00f3digo promocional habrahabr10, \u00e9 poss\u00edvel economizar 10% no custo.<\/li>\n<li>A inacessibilidade f\u00edsica de alguns dados (eles s\u00e3o vis\u00edveis apenas para administradores ou s\u00e3o muito complicados de coletar) \u2014 isso deve ser considerado, nem todos os dados podem ser coletados em um tempo razo\u00e1vel.<\/li>\n<li>Erros de rede: trabalhar com redes \u00e9 um desafio.<\/li>\n<li>Estes s\u00e3o dados reais \u2014 eles n\u00e3o chegam limpos.<\/li>\n<\/ul>\n<p>\nClaro, \u00e9 necess\u00e1rio levar em conta esses detalhes no desenvolvimento. O tempo exato varia de acordo com a experi\u00eancia em desenvolvimento ou experi\u00eancia em tarefas semelhantes, no entanto, vemos que se trata de uma tarefa puramente de engenharia e n\u00e3o requer esfor\u00e7os adicionais para a solu\u00e7\u00e3o \u2014 tudo pode ser muito bem avaliado, escrito e feito.<\/p>\n<h2>Compara\u00e7\u00e3o das se\u00e7\u00f5es do Habr<\/h2>\n<p>\nVamos passar para um caso mais interessante e n\u00e3o trivial: comparar fluxos e\/ou se\u00e7\u00f5es do Habr.<\/p>\n<p>Vamos verificar nossa lista de verifica\u00e7\u00e3o de complexidade \u2014 aqui, para entender cada item, ser\u00e1 necess\u00e1rio um pouco de tentativa e erro na pr\u00f3pria tarefa e experimentar.<\/p>\n<ul>\n<li>Primeiro, voc\u00ea pensa que h\u00e1 uma API, mas n\u00e3o h\u00e1. Sim, o Habr tem uma API, mas ela s\u00f3 est\u00e1 dispon\u00edvel para administradores (ou pode nem funcionar).<\/li>\n<li>Depois, voc\u00ea simplesmente come\u00e7a a fazer parsing de HTML \u2014 'import requests', o que pode dar errado?<\/li>\n<li>E como voc\u00ea realmente faz parsing? A abordagem mais simples e frequentemente usada \u00e9 iterar por ID, observando que n\u00e3o \u00e9 a mais eficiente e ser\u00e1 necess\u00e1rio lidar com diferentes casos \u2014 aqui est\u00e1 um exemplo da densidade de IDs reais entre todos os existentes.\n<p><img decoding=\"async\" alt=\"O que pode dar errado com a Ci\u00eancia de Dados? Coleta de dados\" src=\"\/wp-content\/uploads\/2020\/07\/2c67fc14f672e92979edd617314210da.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Retirado de <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/218607\/\">artigo. Mas, como mencionado anteriormente, ao tentarmos aplic\u00e1-lo diretamente no blockchain, surgem limita\u00e7\u00f5es t\u00e9cnicas. Aqui est\u00e1 um exemplo de implementa\u00e7\u00e3o de teste do protocolo em um contrato inteligente EOS e sua parte mais importante \u2014 a verifica\u00e7\u00e3o do share publicado pelo participante:<\/a><\/noindex> artigo.<\/i><\/li>\n<li>Dados brutos envelopados em HTML pela rede s\u00e3o uma dor. Por exemplo, voc\u00ea quer coletar e armazenar a pontua\u00e7\u00e3o de um artigo: voc\u00ea raspou a pontua\u00e7\u00e3o do HTML e decidiu salv\u00e1-la como um n\u00famero para processamento posterior.\u00a0\n<p>1) int(score) gera um erro: no Habr a quantidade \u00e9 negativa, como na string \"\u20135\" \u2014 isso \u00e9 um h\u00edfen curto, e n\u00e3o um sinal de negativo (surpreendente, n\u00e3o \u00e9?), ent\u00e3o em algum momento foi necess\u00e1rio ressuscitar o parser com essa corre\u00e7\u00e3o horr\u00edvel.<\/p>\n<pre><code class=\"python\">try:\n      score_txt = post.find(class_=\"score\").text.replace(u\"\u2013\",\"-\").replace(u\"+\",\"+\")\n      score = int(score_txt)\n      if check_date(date):\n        post_score += score\n<\/code><\/pre>\n<p>\nAs datas, sinais de mais e menos podem nem estar presentes (como vemos acima pela fun\u00e7\u00e3o check_date e j\u00e1 foi o caso).<\/p>\n<p>2) Caracteres especiais n\u00e3o escapados \u2014 eles aparecer\u00e3o, precisamos estar preparados.<\/p>\n<p>3) A estrutura muda dependendo do tipo de postagem.<\/p>\n<p>4) Postagens antigas podem ter **estrutura estranha**.<\/li>\n<li>Basicamente, o tratamento de erros e o que pode ou n\u00e3o acontecer ter\u00e3o que ser tratados e n\u00e3o se pode prever com certeza o que dar\u00e1 errado e como a estrutura pode ser diferente e onde pode haver falhas \u2014 voc\u00ea ter\u00e1 que apenas tentar e considerar os erros que o parser gera.<\/li>\n<li>Depois voc\u00ea percebe que precisa raspar em m\u00faltiplas threads, caso contr\u00e1rio, a raspagem em uma s\u00f3 levar\u00e1 30+ horas (isso \u00e9 apenas o tempo de execu\u00e7\u00e3o de um parser funcional de thread \u00fanica, que fica inativo e n\u00e3o cai sob nenhum banimento). Em <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/276383\/\">artigo. Mas, como mencionado anteriormente, ao tentarmos aplic\u00e1-lo diretamente no blockchain, surgem limita\u00e7\u00f5es t\u00e9cnicas. Aqui est\u00e1 um exemplo de implementa\u00e7\u00e3o de teste do protocolo em um contrato inteligente EOS e sua parte mais importante \u2014 a verifica\u00e7\u00e3o do share publicado pelo participante:<\/a><\/noindex> um artigo, isso levou em algum momento a um esquema como este:<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"O que pode dar errado com a Ci\u00eancia de Dados? Coleta de dados\" src=\"\/wp-content\/uploads\/2020\/07\/9ad1853f3ee2c9321ee9f1a5e3efea7d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nResumo do checklist de complexidade:<\/p>\n<ul>\n<li>Trabalho com a rede e raspagem de HTML com itera\u00e7\u00e3o e looping por ID.<\/li>\n<li>Documentos de estrutura heterog\u00eanea.<\/li>\n<li>Muitos locais onde o c\u00f3digo pode facilmente falhar.<\/li>\n<li>\u00c9 necess\u00e1rio escrever || c\u00f3digo.<\/li>\n<li>Falta a documenta\u00e7\u00e3o necess\u00e1ria, exemplos de c\u00f3digo e\/ou comunidade.<\/li>\n<\/ul>\n<p>\nA estimativa condicional de tempo para essa tarefa ser\u00e1 de 3 a 5 vezes maior do que para a coleta de dados do Reddit.<\/p>\n<h2>Compara\u00e7\u00e3o de grupos do Odnoklassniki<\/h2>\n<p>\nVamos passar para o caso tecnicamente mais interessante dos mencionados. Para mim, ele era interessante precisamente porque, \u00e0 primeira vista, parece bastante trivial, mas n\u00e3o \u00e9 \u2014 assim que voc\u00ea toca nele com um bast\u00e3o.<\/p>\n<p>Come\u00e7aremos com nosso checklist de complexidade e notaremos que muitos deles se revelar\u00e3o muito mais dif\u00edceis do que parecem no in\u00edcio:<\/p>\n<ul>\n<li>A API existe, mas quase n\u00e3o h\u00e1 fun\u00e7\u00f5es necess\u00e1rias nela.<\/li>\n<li>Para certas fun\u00e7\u00f5es, \u00e9 necess\u00e1rio solicitar acesso por e-mail, ou seja, a concess\u00e3o de acesso n\u00e3o \u00e9 instant\u00e2nea.<\/li>\n<li>A documenta\u00e7\u00e3o \u00e9 p\u00e9ssima (como se come\u00e7\u00e1ssemos com a confus\u00e3o entre os termos russos e ingleses, de forma totalmente inconsistente \u2014 \u00e0s vezes voc\u00ea simplesmente precisa adivinhar o que esperam de voc\u00ea em algum lugar) e, al\u00e9m disso, n\u00e3o \u00e9 adequada para coleta de dados, por exemplo, <noindex><a rel=\"nofollow\" href=\"https:\/\/apiok.ru\/dev\/methods\/rest\/discussions\/discussions.getComments\">a fun\u00e7\u00e3o necess\u00e1ria<\/a><\/noindex>.<\/li>\n<li>Requer sess\u00e3o na documenta\u00e7\u00e3o, mas na pr\u00e1tica n\u00e3o a utiliza \u2014 e n\u00e3o h\u00e1 como entender todas as nuances dos modos da API, exceto tatear e torcer para que algo funcione.<\/li>\n<li>Faltam exemplos e comunidades, o \u00fanico ponto de apoio para coleta de informa\u00e7\u00f5es \u00e9 um pequeno <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/alternativshik\/python-odnoklassniki\">wrapper<\/a><\/noindex> em Python (sem muitas exemplifica\u00e7\u00f5es).<\/li>\n<li>A op\u00e7\u00e3o mais funcional parece ser o Selenium, j\u00e1 que muitos dos dados necess\u00e1rios est\u00e3o trancados.<br \/>\n1) Ou seja, a autoriza\u00e7\u00e3o \u00e9 feita atrav\u00e9s de um usu\u00e1rio fict\u00edcio (e o cadastro manualmente).<\/p>\n<p>2) No entanto, com o Selenium n\u00e3o h\u00e1 garantias de funcionamento correto e repet\u00edvel (pelo menos no caso do ok.ru, definitivamente).<\/p>\n<p>3) O site Ok.ru apresenta erros de JavaScript e \u00e0s vezes se comporta de forma estranha e inconsistente.<\/p>\n<p>4) \u00c9 necess\u00e1rio lidar com pagina\u00e7\u00e3o, carregamento de elementos etc...<\/p>\n<p>5) Erros da API que o wrapper fornece precisar\u00e3o ser tratados de forma improvisada, por exemplo assim (um trecho de c\u00f3digo experimental):<\/p>\n<pre><code class=\"python\">def get_comments(args, context, discussions):\n    pause = 1\n    if args.extract_comments:\n        all_comments = set()\n#faz sentido acompanhar as discuss\u00f5es j\u00e1 processadas\n        for discussion in tqdm(discussions): \n            try:\n                comments = get_comments_from_discussion_via_api(context, discussion)\n            except odnoklassniki.api.OdnoklassnikiError as e:\n                if \"NOT_FOUND\" in str(e):\n                    comments = set()\n                else:\n                    print(e)\n                    bp()\n                    pass\n            all_comments |= comments\n            time.sleep(pause)\n        return all_comments\n<\/code><\/pre>\n<p>\nMeu erro favorito foi:<\/p>\n<p><code>OdnoklassnikiError(\"Erro(c\u00f3digo: 'None', descri\u00e7\u00e3o: 'Erro HTTP', m\u00e9todo: 'discussions.getComments', params: \u2026)\")<\/code><\/p>\n<p>6) No final, a combina\u00e7\u00e3o Selenium + API parece ser a op\u00e7\u00e3o mais racional.<\/li>\n<li>\u00c9 necess\u00e1rio manter o estado e reiniciar o sistema, tratando muitos erros, incluindo comportamentos inconsistentes do site \u2014 al\u00e9m disso, esses erros s\u00e3o bastante dif\u00edceis de imaginar (a menos que voc\u00ea escreva parsers profissionalmente, \u00e9 claro).<\/li>\n<\/ul>\n<p>\nA estimativa de tempo para esta tarefa seria de 3 a 5 vezes maior do que para coletar dados do Habr. Embora no caso do Habr estejamos usando uma abordagem direta de parser HTML, no caso do OK podemos trabalhar com a API em pontos cr\u00edticos.<\/p>\n<h2>Como resultado, obtemos um servi\u00e7o de \"monitoramento como servi\u00e7o\", automatizado na linha de produ\u00e7\u00e3o de integra\u00e7\u00e3o cont\u00ednua. O desenvolvedor ou testador precisa apenas definir a lista de m\u00e9tricas em um arquivo JSON, e tudo o mais acontece automaticamente. Obtemos um controle de qualidade transparente dos lan\u00e7amentos: todas as notifica\u00e7\u00f5es sobre desempenho, consumo de recursos ou regress\u00f5es arquitet\u00f4nicas.<\/h2>\n<p>\nIndependentemente de como voc\u00ea \u00e9 solicitado a avaliar os prazos \"no local\" (afinal, estamos em um processo de planejamento hoje!), a dura\u00e7\u00e3o de m\u00f3dulos complexos de pipeline de processamento de dados \u00e9 praticamente imposs\u00edvel de ser avaliada, mesmo de forma qualitativa, sem uma an\u00e1lise dos par\u00e2metros da tarefa. <\/p>\n<p>Falando de uma forma um pouco mais filos\u00f3fica, as estrat\u00e9gias de avalia\u00e7\u00e3o \u00e1gil se aplicam bem a tarefas de engenharia, mas em tarefas mais experimentais e, de certa forma, \"criativas\" e de pesquisa, ou seja, menos previs\u00edveis, surgem dificuldades, como nos exemplos que discutimos aqui. <\/p>\n<p>Certamente, a coleta de dados \u00e9 um exemplo ilustrativo \u2014 geralmente essa tarefa parece incrivelmente simples e tecnicamente n\u00e3o complexa, e \u00e9 exatamente nos detalhes que frequentemente est\u00e1 o problema. E \u00e9 nessa tarefa que podemos mostrar toda a gama de poss\u00edveis varia\u00e7\u00f5es do que pode dar errado e quanto tempo o trabalho pode demorar. <\/p>\n<p>Se olharmos rapidamente para as caracter\u00edsticas da tarefa sem experimentos adicionais, Reddit e OK parecem semelhantes: ambos t\u00eam API e wrapper em python, mas, na verdade, a diferen\u00e7a \u00e9 enorme. Julgando por esses par\u00e2metros, o parser do Habr parece mais complicado do que o OK \u2014 mas na pr\u00e1tica \u00e9 exatamente o contr\u00e1rio e isso s\u00f3 pode ser descoberto realizando experimentos simples para analisar os par\u00e2metros da tarefa.<\/p>\n<p>Na minha experi\u00eancia, a abordagem mais eficaz \u00e9 uma estimativa aproximada do tempo necess\u00e1rio para a an\u00e1lise preliminar e os primeiros experimentos simples, a leitura da documenta\u00e7\u00e3o \u2014 \u00e9 isso que permitir\u00e1 dar uma avalia\u00e7\u00e3o precisa para todo o trabalho. Em termos da metodologias \u00e1geis populares \u2014 eu pe\u00e7o que abra um ticket para a \"avalia\u00e7\u00e3o dos par\u00e2metros da tarefa\", com base no qual poderei estimar o que pode ser realizado dentro do \"sprint\" e fornecer uma estimativa mais precisa para cada tarefa.<\/p>\n<p>Portanto, o argumento mais eficaz parece ser aquele que mostra a um especialista \"n\u00e3o t\u00e9cnico\" como o tempo e os recursos podem variar significativamente dependendo dos par\u00e2metros que ainda precisam ser avaliados.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/ruvds.com\/ru-rub?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=param&amp;utm_content=datascience1#order\"><img decoding=\"async\" alt=\"O que pode dar errado com a Ci\u00eancia de Dados? Coleta de dados\" src=\"\/wp-content\/uploads\/2020\/07\/2ca567a078c8500d37dfcf982e76252c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/510944\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 100500 \u043a\u0443\u0440\u0441\u043e\u0432 \u043f\u043e Data Science \u0438 \u0434\u0430\u0432\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0434\u0435\u043d\u0435\u0433 \u0432 Data Science \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u0443\u0440\u0441\u0430\u043c\u0438 \u043f\u043e Data Science (\u0437\u0430\u0447\u0435\u043c \u043a\u043e\u043f\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u043e\u043f\u0430\u0442\u044b?). \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043c\u0438\u043d\u0443\u0441 \u044d\u0442\u0438\u0445 \u043a\u0443\u0440\u0441\u043e\u0432 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0438 \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0431\u0449\u0435\u0433\u043e \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0439: \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0434\u0430\u0441\u0442 \u0432\u0430\u043c \u0447\u0438\u0441\u0442\u044b\u0435, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":89207,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-89206","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/chto-mozhet-pojti-ne-tak-s-data-science-sbor-dannyh\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438 \u043d\u0435 \u0442\u0430\u043a \u0441 Data Science? \u0421\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/chto-mozhet-pojti-ne-tak-s-data-science-sbor-dannyh\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-20T05:41:57+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-20T05:41:57+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47O que pode dar errado com Data Science? Coleta de dados | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/chto-mozhet-pojti-ne-tak-s-data-science-sbor-dannyh","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438 \u043d\u0435 \u0442\u0430\u043a \u0441 Data Science? \u0421\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 | ProHoster","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/chto-mozhet-pojti-ne-tak-s-data-science-sbor-dannyh","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-20T05:41:57+00:00","article:modified_time":"2020-07-20T05:41:57+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"89206","title":null,"description":null,"keywords":null,"keyphrases":{"focus":[],"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:51:09","updated":"2026-08-11 12:50:12","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/89206","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=89206"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/89206\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/89207"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=89206"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=89206"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=89206"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}