入门指南

在本节中,我们将通过一个现实世界的示例来探讨JQL的核心概念。

想象一下,我们是一家免费的SaaS业务,具有两个付费计划,即基本和高级,我们想了解每种计划中有多少个计划,以及用户从免费付费转换需要多长时间。

Mixpanel中的运行和保存查询

当您准备在Mixpanel中针对自己的数据运行查询时,只需登录,转到应用程序,然后单击应用程序JQL能够交互运行查询并保存它们。保存的报告可供项目的其他成员使用。

该控制台是使用JQL的推荐方法,因为它是团队中最明显的方法,并且编辑器是专门为JQL语法构建的。

JQL控制台对其可以查询的数据有5GB的限制,并且对结果输出的限制为2GB。

从命令行运行查询:Mac OS X或Linux

可以通过HTTP端点执行JQL,并在邮政请求的正文中提供JQL查询。在查询中保存在QUERY.JS文件中的情况下,以下命令使用curl实用程序上传我们的查询并以JSON格式返回结果。

API对其可以查询的数据有5GB的限制,并且对结果输出的限制为2GB。

#将`QUERY.JS`中的JQL代码发送到API#到一个带有此教程curl //www.jy710.com/api/2.0/jql \ -U CE0872555555555CEEC741819A5717174CE5:\ -DATATAA -DATATAA的项目,[电子邮件保护]|Python -M JSON.Tool

为了进行身份验证请求-U标志使我们可以通过用户名和密码。要查询您项目的JQL API,请使用空白密码使用其API Secret作为用户名。

要了解有关查询身份验证的更多信息,请查看数据导出API文档。

如果您遇到的错误说缺少必需的参数:脚本,您可能忘了将代码保存在QUERY.JS文件中。

步骤1:查询事件

首先,让我们看一下最简单的JQL查询,该查询可以检索两个日期之间的所有事件:

函数main(){返回事件({{from_date:“ 2016-01-01”,to_date:“ 2016-01-07”}}}}}

所有JQL查询必须满足两个要求:

  1. 他们必须定义一个主()函数。我们对您的JavaScript进行编译,并根据您的原始数据执行main()函数以执行分析。

  2. 主()函数必须调用events()或者人们()功能以选择要分析的集合。

如您所见,我们的简单示例可以满足这两个标准,而不再满足。它使用事件集合。当您运行此最小查询时,它将返回2016年1月1日至1月7日之间发送给您项目的所有事件的JSON列表:

[{“ name”:“登录”,“ dimption_id”:4,“ time”:1420124166000,“ properties”:{}},{“ name”:“ publice”,“ time”,“ time”:1420120626000,“ properties” properties':{{“ plan”:“基本”,“ signup_date”:“ 2014-12-03”}},... //更多事件]

JQL框架围绕两个概念旋转:收藏转型。集合是一个值列表,可以将其转换为其他集合以执行分析并回答复杂问题。

一个示例转换是筛选(),用于将收藏集滤成到您关心的值。

步骤2:过滤数据集

我们只对“购买”活动感兴趣,因此下一步是将事件集合过滤到这些事件:

函数main(){返回事件({{from_date:“ 2016-01-01”,to_date:“ 2016-01-07”})。filter(function(event){return evert.name = = ='publice'});}

当您运行此查询时,输出仍然是事件的列表,但已被过滤为仅购买事件:

[{“ name”:“ publice”,“ time”:1420120626000,“ properties”:{“ plan”:“ basic”,“ signup_date”:“ 2014-12-03”}},{“ name”:“购买”:“,“ time”:1420380728000,“属性”:{“ plan”:“ basic”,“ signup_date”:“ 2014-11-17”}}},{“ name”:“购买”,“ time”,“ time”:1420603167000,“ properties”:{“ plan”:“ premium”,“ signup_date”:“ 2014-12-29”}},... //更多购买活动]

步骤3:计算购买活动

现在我们可以回答一个真正的问题:那里有多少购买?为此,我们可以使用另一个转换,降低(),用于将集合减少到单个值。

函数main(){返回事件({{from_date:“ 2016-01-01”,to_date:“ 2016-01-07”}).filter(function(event){return evert.name ==“ publice” publice'})。降低(函数(累加器,事件){var ret = events.length; //添加先前累积的降低功能结果。(var i = 0; i 

结果等于:

[359]

重要的是要注意只打电话降低()本身无所事事 - 您必须告诉它该怎么做。像其他变性一样降低()具有必需的函数参数 - 简化函数。该功能实现了以下签名:

函数(累加器,项目){//将以前的“累加器”与新项目相结合并返回结果。}

还原函数接受两个参数:其先前结果的数组(累加器)和一系列可减少的项目。第一个参数 - 累加器 - 用于将初始值集分解为还原函数的许多调用。JQL以层次的方式运行减少,其中一些输入子集首先减少到累加器值,然后将多个累加器值组合在一起。

Mixpanel提供了许多内置还原功能用于经常使用的聚合。为了计算输入的数量,就像上面的示例一样,我们可以通过mixpanel.reducer.count()。降低()

函数main(){返回事件({{from_date:“ 2016-01-01”,to_date:“ 2016-01-07”,}).filter(function(event)).Reduce(mixpanel.reducer.count());}

步骤4:按计划进行分组

因此,现在我们知道一月份的那一周内发生了多少次购买。但是人们买了什么?我们有两个计划,我们想看看每个计划的售出了多少。

我们可以使用我们的另一种转型来做到这一点,通过...分组(),在计算这些交易之前,通过“计划”对这些交易进行分组:

函数main(){返回事件({{from_date:“ 2016-01-01”,to_date:“ 2016-01-07”}).filter(function(event){return evert.name ==“ publice” publice'})。groupby([“ properties.plan”],mixpanel.reducer.count());}

您会注意到我们已经取代了我们的降低()通过...分组()通过...分组()用于将集合分组分组。分组后,减少功能传递给通过...分组()单独调用每个组。

这个查询变得越来越复杂,所以让我们退后一步,重申其正在做的事情:

  1. 在7天内获得所有活动。
  2. 过滤到仅购买活动。
  3. 将事件按其“计划”属性分组。
  4. 计算每个组中事件的数量。

当我们执行查询时,我们将获得以下输出:

[{“ value”:254,“键”:[“ basic”},{“ value”:105,“ key”:[“ premium”]}]

现在这变得有趣了。我们的分析表明,我们在那一周出售了254个基本计划和105个高级计划。

步骤5:计算注册和购买之间的天数

让我们进一步迈出一步,回答一个更复杂的问题:用户注册这些不同的计划需要多长时间?将用户转换为高级计划比基本计划需要花费或多或少的时间?

这将要求我们计算每个事件的“购买天数”值,我们可以使用“ Insigup_date”属性和购买活动的时间戳来实现。

我们想计算平均购买天数,但我们不能直接去那里。首先,我们必须获得获得平均值的组件:数字和总数。

函数main(){返回事件({{from_date:“ 2016-01-01”,to_date:“ 2016-01-07”}).filter(function(event){return evert.name ==“ publice” publice'})。groupby([“ properties.plan”],函数(累加器,项目){var ret = {sum:0.0,count:0.0}; for(var i = 0; i 

当我们运行此查询时,我们会看到:

[{“ value”:{“ count”:254,“ sum”:14745.350497685187,},“ key”:[“基本”]},{“ value”:{“ count”:105,“ sum”:3492.4220370370370370363,},“键”:[“ premium”]}]]

对于最后一步,我们将使用地图()转换以从总和和计数中获得平均值。地图()每当我们想通过将提供的功能应用于集合的每个元素来进行集合的一对一转换时都可以使用。

函数main(){返回事件({{from_date:“ 2016-01-01”,to_date:“ 2016-01-07”}).filter(function(event){return evert.name ==“ publice” publice'})。groupby([“ properties.plan”],函数(累加器,项目){var ret = {sum:0.0,count:0.0}; for(var i = 0; i 

当我们运行此查询时,我们将获得以下输出:

[{“ plan”:“ basic”,“购买的avg天数”:58.05256101450859},{“ plan”:“ premium”,“ avg days topers of oferage”:33.2611622257495585}]]

这是最终的结果:用户花费的时间大约是购买高级计划的基本计划的两倍。这是一个人为的例子,但是在现实世界中,您的下一步可能是

  • 计算分布并找出中位数而不是平均值。
  • 进一步挖掘以找出这些用户组之间还有什么不同。

步骤6:检查行为模式

分析任务通常集中在人行为序列 - 特定用户执行的动作序列。我们经常对用户所做的事件,这些事件发生以及以什么顺序感兴趣。

JQL提供了GroupByuser()转换,允许其参数函数查看每个用户的事件历史记录。

此转换的结果是每个用户包含一个对象的集合。每个对象都有以下概述的结构:

{键:[<用户独特的ID>]值:<转换函数的返回值>}

在本教程步骤中,我们使用GroupByuser()找出用户在登录后直接进行购买的频率。

函数main(){返回事件({{from_date:“ 2016-01-01”,to_date:“ 2016-02-01”})。groupByuser(function(state,events){state = state = state = state || {last_login:faste_login:false,false,false,false,false,false,false,false计数:0}; if(event.length> 0){if(state.last_login && events [0] .name ==“ puferage”){++ state.count;} for(var i = 0; i = e events; i 

注意提供给的转换功能GroupByuser()采用两个参数 - 状态对象和事件列表。当属于单个用户的事件列表很长,JQL将该列表分解为还原函数的多个调用。

在这种情况下,状态参数用于呼叫之间的通信 - 它包含对还原函数的最后一个呼叫的返回值。

在上面的示例中,输出收集将由对象组成,这些对象包括由还原函数计算的属性,在值字段中。

{“ value”:{“ count”:4,“ last_login”:false},“ key”:[“ 3f151e8d-2bf4-4ecd-91e3-dbe8a86666eb0”]},{“值“ last_login”:false},“ key”:[da1ab57e-8fed-4ae4ae4-9b65-5ea648b0f686“]} //更多每个用户记录。

写自己的查询

此查询演练向您介绍了编写自己的JQL查询所需的大多数概念。我们涵盖了:

有关这些概念的更多信息(还有一些我们尚未介绍的信息),请阅读完整的API参考