今天,数据科学课程有100,500门课程,人们早就知道,数据科学课程中的钱最多可以通过数据科学课程来赚钱(为什么挖矿才能卖铁锹?)。这些课程的主要缺点是它们与实际工作无关:没人会以所需的格式为您提供干净,经过处理的数据。当您退出课程并开始解决实际问题时,就会出现许多细微差别。
因此,我们将根据发生在我,我的同志和同事身上的真实事件开始一系列笔记“数据科学可能会出什么问题”。我们将使用实际示例分析数据科学中的典型任务:它是如何实际发生的。让我们从收集数据的任务开始。
人们开始使用真实数据时偶然发现的第一件事实际上是在收集与我们最相关的数据。本文的关键信息:
我们系统地低估了收集,清理和准备数据所花费的时间,资源和精力。
最重要的是,我们将讨论如何防止这种情况。
根据各种估计,清理,转换,数据处理,特征工程等需要80-90%的时间,而分析需要10-20%的时间,而几乎所有的教育材料都只专注于分析。
让我们以三个变体中的一个简单分析问题为典型示例,看看什么样的“加重情况”。
再次作为示例,我们将考虑在以下方面收集数据和比较社区的任务的类似变化:
- 两个Reddit subreddit
- 哈勃两节
- 两组Odnoklassniki
理论上的条件方法
打开站点并阅读示例(如果清楚的话),花几个小时阅读,花几个小时使用示例和调试代码。添加几个小时来收集。预留几个小时(乘以两个,再加上N小时)。
关键点:时间估算是基于假设和猜测所需要的时间。
有必要通过评估上述条件问题的以下参数来开始时间分析:
- 数据的大小是多少,需要物理收集多少(*见下文*)。
- 收集一条记录需要多长时间,而收集第二条记录需要多长时间。
- 放下编写代码来保存状态并在(如果不是所有情况下)开始重新启动的时间。
- , API.
- , — : , , .
- .
- , , a workaround.
最重要的是,要估算时间-您实际上需要花费时间和精力进行“有效的侦察”-只有这样,您的计划才足够。因此,无论您被迫说“收集数据需要多长时间”,都需要花费一些时间进行初步分析,并争论时间将取决于问题的实际参数。
现在,我们将展示具体示例,其中这些参数将发生变化。
要点:评估是基于对影响工作量和复杂性的关键因素的分析。
当功能要素足够小并且没有太多因素可以显着影响问题的结构时,猜测估计是一种很好的方法。但是,在执行许多数据科学任务的情况下,此类因素变得异常多,而且这种方法也变得不够用。
Reddit社区比较
让我们从最简单的情况开始(稍后会证明)。总的来说,说实话,我们有一个非常理想的案例,让我们检查一下难度清单:
- 有一个简洁,明了的文档化的API。
- 自动获得令牌是非常简单和重要的。
- 有一个python包装器-带有大量示例。
- 一个社区,在Reddit上分析和数据收集(到YouTube的视频讲解如何使用python封装),例如。
- 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-“导入请求”,可能会出错吗?
- 一般如何解析?最简单,最常用的方法是遍历ID,请注意,它并不是最有效的方法,必须处理不同的情况-例如,所有现有ID中真实ID的密度。
来自这个文章。 - , 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) ** **. - 实际上,必须处理错误处理以及可能发生或可能不发生的事情,并且无法肯定地预测会出问题的地方以及结构可能如何以及在哪里掉下来的原因-您只需要尝试并考虑解析器引发的错误即可。
- 然后,您知道需要解析为多个线程,否则解析为一个线程将花费30多个小时(这纯粹是一个已经工作的单线程解析器的执行时间,该解析器处于休眠状态并且不受任何限制)。在此文章中,这导致在某些时候类似的模式:
总难度清单:
- 使用Web和html进行迭代解析并按ID搜索。
- 异构结构的文档。
- 在很多地方,代码很容易掉下来。
- 有必要写|| 代码。
- 缺少文档,代码示例和/或社区。
与从Reddit收集数据相比,此任务的条件时间估计将高3-5倍。
Odnoklassniki组的比较
让我们继续介绍所描述的技术上最有趣的情况。对我来说,这很有趣,因为乍一看,它看起来很琐碎,但事实并非如此-只要您用棍子oke一下它。
让我们从我们的难度清单开始,并注意其中许多将变得比初看起来要困难得多:
- 有一个API,但是它几乎完全缺少必要的功能。
- 您需要通过邮件请求对某些功能的访问,即访问的发出不是即时的。
- ( , , — , - ) , , , , .
- , — 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 . - 必须保存状态并重新启动系统,处理许多错误,包括站点的不一致行为以及这些错误,这些错误很难想象(当然,如果您不是专业地编写解析器的话)。
此任务的条件时间估算将比从Habr收集数据的估算时间高3-5倍。尽管在Habr的情况下,我们还是采用HTML解析的正面方法,在OK的情况下,我们可以在关键位置使用API。
结论
无论您需要多少“现场”估计截止时间(我们今天都在计划中!)在大型数据处理管道模块中,如果不分析任务参数就几乎不可能定性估计执行时间。
从哲学上讲,敏捷评估策略非常适合工程任务,但是具有更多的实验性任务,从某种意义上讲,是“创造性”的研究,即难以预测,出现了困难,如类似主题的示例我们在这里进行了分析。
当然,数据收集只是一个很好的例子-它通常看起来非常简单且技术上并不复杂,而且细节上是魔鬼最常潜伏的地方。正是在这项任务上,它才显示出可能出问题以及需要花费多长时间的全部可能选择。
如果您不做任何试验就忽略了问题的特征,那么Reddit和OK看起来很相似:有一个API,一个python包装器,但是实际上,差别很大。从这些参数来看,Pars Habr看起来要比确定还复杂-但实际上却相反,这可以通过进行简单的实验来分析问题的参数来发现。
以我的经验,最有效的方法是对初步分析本身和简单的首次实验所需的时间进行近似估算,并阅读文档-它们将使您对整个工作给出准确的估算。在流行的敏捷方法学方面,我请您根据“问题的参数估计”为我创建一张票证,在此基础上,我可以估计“冲刺”中可能完成的工作,并为每个问题提供更准确的估计。
因此,最有效的论据似乎是向“非技术”专家表明,多少时间和资源将根据尚未估计的参数而变化。