分类档案: 未分类

一个优秀的数据团队由什么组成?

数据团队很难招募。工程师的供应量低,需求量大,如果没有耗时的电话/编码屏幕,甚至没有FAANG,就很难审查简历。’的资源,很难找到像您一样对产品充满热情的人。作为招聘经理,您可能有幸负担得起专业招聘人员的服务。但是,招聘人员通常会向您发送完全不合适的候选人。

A very friendly recruiter I know 在 NYC 和 I had coffee 的 other day 至 discuss 的 se 在 dustry 是 sues. We agreed that 它 would be useful if we defined 什么 makes up a great 数据 team 和 什么 的 roles actually mean.

我应该首先雇用谁?他们如何一起工作?

  • 数据分析师
    • 雇用数据团队的目标可能是业务洞察力,并在某种程度上使您的行动主要由数据(而非直觉)驱动。为此,您需要一个有能力的数据分析师。值得庆幸的是,数据分析师的人数很多。渴望挖掘洞察力并具有定量或半定量(例如Econ)背景的新毕业生不应该’太难找了。在高端,您可以找到具有SQL经验的人以及相对较新的BI工具(如Looker)。如果您有预算,则可以使用即插即用的流水线工具(例如细分)解决75%的工程任务。最标准的业务见解– “昨天/上个月发生了什么?”, “what’我的客户群中服务不足的人群?”没有昂贵的数据科学家就可以回答。
  • 数据工程师
    • 在某些时候,您的数据库和查询将变得太慢。您’ll还想抓取数据源或使用没有人为Segment中的连接器建立过的API。也许你’我想要一些定制的销售线索评分’一堆安全问题’您希望每天早晨刷新一些庞大的查询,并在Slack中通知您。没有编程背景,您的数据分析师会感到不胜其烦。这是您需要雇用数据工程师的时候。他们的专业知识真正在于使您的数据集达到可分析的地步。如果您的表每月收到5000万个事件,那么查询将在一夜之间开始花费数小时,并且表甚至可能被锁定。数据工程师可以缓解这种情况– 的 y 将能够优化数据库的索引’用于快速查找的s表,创建有用的聚合的物化视图,这些聚合每天早晨刷新,将自定义API连接到您的数据仓库,并且通常超出即插即用工具所涵盖的范围。 
  • 数据科学家
    • 现在你’重新获得标准的业务见解,并从有趣的来源中大规模获取它们’几乎肯定会对AI的警笛声感到好奇。如果您可以预测哪个客户会流失/转换,该怎么办?如果您可以按行为将客户群聚在一起怎么办?称职的数据科学家有可能提供这种更深入的了解。他们将使用Python中的机器学习库来尝试自动对您的客户和系统中的操作进行分类。他们可以预测未来(以一定的准确性),并告诉您有关数据的故事。这将涉及使用数据工程师提供的大型数据集。一旦这些见解浮出水面,他们将获得训练有素的模型,可以将其保存到磁盘并进行刷新。但是,如果需要每天刷新一次,并将这些见解添加到数据分析师甚至销售员可以读取的表中,该怎么办?然后,您需要返回到数据工程师,并让他们设置一个后端系统来执行此操作。
  • 数据科学工程师,机器学习工程师
    • 有时,您的(可能是较老的)数据工程师将100%专注于管道和数据库管理员,并且在实施数据科学家想出的基于Python的模型方面没有特别的经验。对于此问题,您需要一名数据科学工程师或机器学习工程师。他们的专长是部署,扩展和刷新数据科学家提出的模型。数据科学家应该完全专注于概率,调整模型参数和置信度分数;您的数据分析师应该专注于更高层次的叙述,而您的DS / ML工程师现在可以采用该模型,并确保该模型可以快速提供您的见解,并提供干净,新鲜,正确的数据。
  • 可视化工程师
    • 如果Looker没有,该怎么办’没有您想要的图表?如果您需要可视化网络怎么办?如果您的数据有16个维度并且您’是否已用完散点图中的所有颜色,大小和形状选项?然后,您需要可视化工程师的非常专门的角色来构建自定义可视化并想出更好的方法来揭示数据分析师难以解决的见解。
  • 商业智能工程师
    • 这是一个模棱两可的标题–他们可能是数据科学工程师或数据工程师。

的角色

标题 工作职责 工具/技术
数据分析师  基本业务见​​解 外观 / Tableau,SQL,Excel,Redash
数据科学家 更复杂的业务预测 Jupyter笔记本,Python,Scikit-Learn,Numpy,Scipy,Statsmodels
数据工程师 得到“Big Data”到可以分析以及连接自定义数据源的地步 SQL,Python,Scrapy,Spacy,Selenium,Kafka,Airflow,Luigi,Spark,AWS,Redshift
数据科学工程师或机器学习工程师 实施数据科学家’s models at scale SQL,Python,Scikit-Learn,Numpy,Scipy,AWS,TensorFlow
可视化工程师(稀有) 制作精美的图形以增强每个人’s work 外观 / Tableau,Javascript,D3.js,Highcharts,HTML

但是,为什么每个人都只专注于数据科学?

数据科学是一个流行词,有人用它来表示适合数据工程和分析交叉领域的任何人。公司犯下的最大错误之一就是雇用了太多的数据科学家而没有足够的数据工程师。最近,许多前数学家,化学家,统计学家和其他数量级的毕业生发现,数据科学家正在变得更容易招聘,他们可以轻松地重塑自己的形象或参加3个月的Bootcamp并担任初级职位。但是,他们的模型和洞察力可能会受到限制,因为他们没有’不知道如何扩展/部署它们;他们将花费大量时间来清理数据集,而不是专注于隐藏在其中的消息和预测。当然,作为一个现在主要专注于数据工程的人,我有偏见,但是我想说,每个数据科学家都应与至少一名数据工程师配对。我实际上从数据科学专业转到数据工程专业的原因确实是出于我自己工作的需要。

我希望本指南今天能成功解释’的数据团队。如果您有任何改进建议,请发表评论或给我发送电子邮件。

开源DIMA–方便的数据库监视工具

框架上的数据

在像 框架,我们将收到大量数据-每月超过6700万个事件。高效的分析对于保持市场领导者地位至关重要,我们使用大量工具:

  • GUI之类的 外观Redash and 续集
  • 内部分析和查询并行化微服务
  • 我们为垃圾邮件/入侵检测和销售线索发现而构建的定制AI Slackbots

这意味着我们的数据仓库经常受到大量查询的攻击,无论是在Cron计划中还是在员工探索我们的数据集方面都如此。

数量问题

管理如此大量的查询可能很困难。

  • PostgreSQL表可以锁定-例如,在其他人查询表时尝试交换/删除表将导致它们锁定。理想情况下,分析表仅应进行增量更新,但有时设计限制会阻止这种情况。
  • SQL GUI可能会随机超时,这对快速检查数据库以查看它们是否仍在运行很有用。
  • Using a combination of screen and psql to 跑 queries 在 的 background requires monitoring. Dima 是 great 对于 that.
  • 数百万行表上没有LIMIT的意外SELECT可能会使SQL GUI崩溃。
  • Sometimes a big query just 是 n’t 什么 you wanted. 伪装l没有取消按钮,而托管的GUI(如Redash和Looker)具有“取消”按钮,这些按钮对于长时间运行的查询通常无响应。

迪玛

为了帮助解决此问题,我构建了一个名为dima的小型命令行工具。它最初代表“数据库完整性监控”&分析”,但现在只是“ dima”。它非常简单,而且非常有用,因此我可以将其开源。

Dima 是 a 蟒蛇 script that basically lets you quickly summarize or 在 spect 的  pg_stat_activity internal table 在 Postgres via 的 psycopg2 LIB rary. If you want 至 kill a query 它 will call pg_terminate on 的 PID.

查看 //github.com/Frameio/homebrew-dima.

Install using pip 在 stall dima-db or brew tap Frameio/homebrew-dima && brew 在 stall dima

指令

dima —正在运行的查询摘要

dima show [PID] -检查特定的正在运行的查询

dima R M [-f] Some PID or Keyword —杀死查询/查询

我们如何在Frame.io中分配注册

为60万用户分配800M点击

在  框架 we use 分割 支持我们的应用使用情况分析。可以通过使用事件名称(例如“注册“ 要么 ” 观看视频 ”。

此数据对于我们的A / B测试和分析至关重要。与细分市场与以下服务的出色集成相结合 明比特,我们可以使用公司信息来丰富个人资料,然后跟踪用户首次访问我们的任何服务。这些数据使我们能够确定哪些博客作者吸引了最高的LTV客户,哪些YouTube潜在受众群体产生了最少的粘性用户,等等。

我们利用各种不同的增长渠道滴灌电子邮件活动,Facebook,YouTube,Twitter,Google AdWords,它们都有各自独立的平台,其中一些并不同步到我们的数据仓库中。需要一个系统来均匀化此信息,以便我们可以在一个地方分析客户,渠道,活动和媒体。

归因实际上是从360度角度了解公司的市场契合度,以及其向正确的受众简要说明其服务的能力。

规划归因系统

从概念上讲,归因非常简单-只需在数据库中找到用户ID的第一个结果并提取UTM,对吗?但是,在获取显示用户来源的那一行数据之前,需要进行大量考虑:

  • 即使建立了很好的索引,每天仍要在数百万行中搜索数千个用户,并维护这些行后面的分区和索引可能对数据库造成很大的负担。
  • 用户首次访问该网站时,他们没有user_ids,而是由Segment分配的onymous_id。用户ID仅在用户创建帐户后才与该用户相关联,并且“ iy”呼叫同时使用anonymous_id和user_id。有时,我们会发现一年多以前用户的anonymous_id。拥有用户的全局ID(从系统分配)后,我们必须在分配ID之前回填所有匿名会话。
  • 在注册之前,我们必须对每组用户操作进行会话,并汇总有关他们的第一个/最后一个会话的属性。会话化是将离散的用户事件聚合到页面加载过程中的过程,间隔不超过20分钟。这使我们能够做一些事情,例如分析访问的整体意图并进行批量归因。重新会话涉及巨大的嵌套窗口函数和别名表,因为同一用户经常要合并几个历史的匿名ID。
  • 我们将希望维护一些快速查找表以使其有用。-用户会话计数,有用的会话,也许还有一些汇总,以了解我们在可视化工具(如可视化工具)中的工作方式 外观.
  • 另请注意,细分实际上具有本地 归因 您可以安装带有摘要的系统;但在安装之前无法回溯。,我们的数据可以追溯到2014年。

实施阶段

系统设计基于以下8个查询组/阶段:

  1. 在现有的会话化数据中查找最新的时间戳
    1. 从细分跟踪表中获取所有最新访问数据
    2. 将此数据与最近的每月分区合并,并使用一些代码来检查列是否仍然相同(可以添加新字段)。
  2. 会话化最近的分区(最近24小时可能有重叠,因此请确保覆盖了空白)
    1. 用任何新标识的匿名/用户对更新别名表。
    2. 返回所有历史会话并重新别名-即将匿名ID替换为任何新标识的user_id。
    3. 重新会话化所有历史会话,因为相邻的会话在历史上可能具有不同的匿名ID,但现在具有相同的user_id
  3. 添加额外的一列以指示用户是否注册了会话
    1. 将生成的会话表合并到单个all_sessions表中
    2. 为有用的会话创建查找表-这是第一个会话,并且仅针对每个用户的注册会话
  4. 创建一个有用的归因表,其中包含预先提取的UTM参数和会话计数
  5. 重新索引所有表,并检查分区顺序是否正确(尤其是在新的月份间隔内)。

表结构

表/图式:

  • 混叠
  • 会议
    • 归因
    • all_sessions
    • 有用的会话
  • session_stages
    • all_tracks_2018_01
    • all_tracks_2018_01_aliased
    • all_tracks_2018_01_re_merged
    • all_tracks_2018_01_signup
    • …etc
  • 分割
    • app_tracks_2018_01
    • app_tracks_2018_02
    • app_tracks_2018_03
    • …etc

最终的sessions.attribution表中的列(许多只是快速查找,易于聚合,并且该表已建立大量索引):

  • alias_id
  • session_count_before_signup
  • signup_timestamp
  • blog_url
  • first_page_ever_visited
  • 首次接触(即与任何frame.io属性的首次互动)
    • 时间戳记
    • 来源,广告系列,媒体,引荐来源
  • 最后一次接触(即注册前的最后一次互动)
    • 时间戳记
    • 来源,广告系列,媒体,引荐来源
  • 首次归属接触(如上所述,但带有付费推荐人)
    • 时间戳记
    • 来源,广告系列,媒体,引荐来源
  • 最后归属的联系方式(如上所述,但带有付费引荐来源)
    • 时间戳记
    • 来源,广告系列,媒体,引荐来源

部署和监控

该系统花了大约1.5个月的时间才能正常运行,并且需要大约800行代码(Python,SQL,Shell和YAML)。

像AWS,Google Cloud和Azure这样的云计算生态系统使部署这样的微服务变得非常简单。该代码是Dockerized(在 高山的)并部署在 ECS Fargate 簇。新的版本由处理 代码管道,它监视Github仓库的归属。基础数据库是 极光Postgres.

该系统每天早上大约需要运行4个小时,并且可能会遇到诸如底层表缓慢或不可用之类的困难。为了减轻这种情况,每个查询都有一个2小时的重试系统。

性能已登录  AWS  Cloudwatch,已同步到 数据狗。如果重试后任何查询完全失败,则 寻呼机 ping已发送到我的手机。

结果

  • 出色的统计信息-71%的用户在第一次访问时就注册了!
  • 对Frame.io采取了8亿个操作(我们的细分跟踪表分区的行数-),我们现在有60万用户。
  • 我们不再需要深入研究特定的平台(例如Facebook Business,Google Analytics(分析)),而是将所有分析都集中在一个地方并可以在Looker中将其可视化!
  • 我们可以通过简单的SQL分组法轻松地计算每个广告系列或频道的平均LTV。
  • 我们可以评估来源的粘性-例如我们的YouTube广告能为我们带来长期或快速流失的客户吗?
  • 作为直觉检查,我们要求用户报告他们听说过Frame.io的位置(直接访问的比例为50%,YouTube的比例为14%,Facebook的比例为10%),这些数字与我们的“首次触摸”列完全匹配。

我们从这里去哪里?

  • 此归因系统只是实际分析背后的管道。当我们不得不做出更多的哲学决定时,这将变得更加困难。我们如何确定如何归因于“多点触控”用户?例如。如果用户在一篇博客文章上具有第一接触,而几个月后在另一文章上具有最后接触,那么谁能得到功劳呢?
  • 我们目前正在密切监视性能,该过程大约需要4个小时。但是,我们的流量每个月都在以惊人的速度增长-这种持续时间将持续多长时间?值得庆幸的是,该系统除了最后阶段外,还易于并行化。

 With thanks 至 Kyle Gesuelli 和 Ammon Brown 对于 proof reading, edits 和 suggestions. I originally posted 上 的 框架 blog at: //medium.com/frame-io-engineering/marketing-attribution-at-frame-io-8c2dbde14b37

设置Firefox扩展的开发环境。

这是我用来创建简单的Firefox扩展的方法。本教程是t的前身他的下一篇关于使用Web 工作人员 (即允许代码在后台线程上运行)。

搭建环境

We’将需要Firefox插件SDK。这是python文件的集合,可让您运行测试版(可选为空白)的Firefox。要下载它:

现在解压缩并删除压缩包:

转到目录并启动特殊的shell:

现在您可以看到shell已经在提示的括号中添加了(addon-sdk-1.17)。这意味着该窗口可能是文本的一半,因此我们可以使用以下命令来减少该文本:

干净得多! -

设置扩展模板

现在我们有了这个特殊的addon-sdk shell,导航回到您的文档并为我们的扩展程序创建一个新文件夹。

这个特殊的shell包含各种有用的命令,它们看起来都像  cfx y  。有关他们的更多信息,请参见 这里 。一世n this case 我们用  cfx 在里面

让’s 在 spect 什么 was 被创造:

  •   LIB   包含一个名为 主要 . js   这是所有扩展代码的主要处理程序文件
  • 数据   为空,但可用于存储工作程序(我们将在后面介绍)或大数据文件等内容
  • 测试   可以包含单元测试(很难设置,但对以后的测试驱动开发很有用)
  • . js on   包含有关扩展的元数据–版本号,创建者名称,描述,许可等

您可以开始在main.js中编写代码,它将在浏览器中运行。完成后,使用  cfx  to 测试 它 !

请参阅下一个教程,了解如何使用网络工作者编写firefox扩展!

OrderedDict的快速解决方案’O(1)索引查找在Python中的限制

问题的背景

我定期处理巨大的机器学习数据集。一种非常通用的格式,用于 威卡 是个 “ARFF”(属性关系文件格式)。这本质上创建了一个结构良好的,丰富的CSV文件,可以轻松地在Logistic回归,决策树,SVM等中使用。每个文件,例如:

f0 f1 f2 f3 fn
1 0 1 0 0

进入更简洁的版本,其中您具有功能列表,只需指定功能’的索引和值(如果有):

@ATTRIBUTE f0数值
@ATTRIBUTE f1数值
@ATTRIBUTE f2 NUMERIC
@ATTRIBUTE f3 NUMERIC

@属性fn数字
@数据
{0 1,2 1}

{feature-index-zero为1,feature-index-two为1}, 只需忽略所有零值。

实施问题

This 是 easy enough if you have, say 4 特征, but 什么 if you have over 1 million 特征 和 need 至 find 的 指数 of each 上 e? Searching 对于 a feature 在 a list 是 O(n), 和 if your training 数据 是 huge 至 o, 的 n creating 的 sparse 武装部队 是 going 至 be hugely 在 efficient:

我以为可以通过使用OrderedDict来改善这一点。很简单,这是一个维护其项目顺序的字典–因此您可以以类似堆栈的方式从最后弹出()项目。但是,之后 关于StackOverflow的一些研究,这令人失望’包含任何有效的方法来计算键的索引:

解决方案

我们该怎么办?输入我最喜欢的东西,默认为lambdas:

稍微修改一下lambda,除了索引之外,分配项目值也很简单:

 局限性

这是一个有趣的修复程序,但没有’支持完整的词典功能– deleting 它 ems won’重新排序索引,您可以’轻松地依次进行迭代。但是,由于在创建此ARFF文件时,’无需删除或迭代’s not a problem.

WNYC电台:“黑客马拉松值得吗?”

WNYC电台的记者Jeff Coltin最近与我联系,要求我参加 显示关于黑客马拉松 在纽约。

他精选了我们谈话中的一小段内容,特别是有关黑客社区可以解决的问题。我说(模糊准确的转录):

“…骇客马拉松可以解决的问题太多了。我认为目前媒体上存在一些重大问题,例如NSA间谍丑闻之类的事情。我认为技术社区稍微做不到的一件事就是使加密变得非常容易。那里’是简单性和安全性之间的一种反向关系,因此应用程序越安全,通常使用起来就越不方便。所以我们有这样的事情 TOR ,超长密码(TOR会大大降低您的连接速度),VPN和许多非常安全的服务与主流服务不兼容。因此,用户想要或需要的这种级别的安全性和隐私非常不便,这实际上取决于黑客社区,使他们更容易使用 …”

已经进行了诸如 隐猫 but 它 s adoption rate still needs 至 grow. HTTPS would probably be 的 best example of seamless encryption but this often fails when people either ignore or are at loss as 至 什么 至 do when HTTPS certificates are flagged as 在 valid 通过 的 browser.

密码学是计算机科学领域一个极为艰巨的领域,因此很难创建可靠的安全应用程序。对此进行自我教育可能需要相当超人的努力,而且我非常尊重做出贡献的人们 此字段中的模块到PyPI。一世’我希望开始 Coursera上的加密课程 一旦我有更多的空闲时间,但是击败我提到的安全性-简单逆关系肯定说起来容易做起来难。

黑客马拉松报告– Greener Neighbor –纽约市的邻里绿色度排名

  

背景

2012年7月,我参加并赢得了法官’参加名为“黑客马拉松”的活动“重塑绿色“由NYC.gov在NYU Poly组织。我在那里见面并与 安东·格兰尼克(Anton Granik),一位出色的平面设计师和数字总监。

重塑绿色Hackathon参赛者 介绍绿色邻居

理念– “绿色,更绿色,最绿色”!

我们的想法是创建一个站点,以提高市镇,邮政编码或城市街区之间的竞争力,使其成为最环保的。我基本上从NYCGov导入了我们需要的所有数据–即电力消耗,树木种植等到MySQL数据库中,然后通过邮政编码对其进行索引。然后,安东设计了一个前端,我创建了一些django功能,以使用户可以浏览单个邮政编码,或者查看热图和排名靠前的邮政编码。建造大约花了15个小时。

是什么可以使这个想法变成真正的服务?

新鲜,可靠的数据是此服务的最大问题。我们正在使用NYC OpenData’s 数据 sets, such as “邮政编码2010年的用电量“。该数据包含大量重复项,当时只有2年的历史。为了使它起作用,我们将不得不定期(也许每月)获得新数据。该站点当前处于离线状态,以节省服务器上的处理能力,但是如果您想看一眼,请向我和我发送推文’ll re-enable 它 🙂

骇客马拉松在第25频道播出, 纽约市政府, 纽约市数字, 下一个网站 and 在 的 赫芬顿邮报.

与彭博市长会面