使用redis位图的强大分析库

bitmapist4的Python项目详细描述


bitmapist

构建状态<

新!试用我们新的独立的bitmapist服务器,它可以将内存效率提高443倍,使您的设置更便宜、更可扩展。它与运行在redis上的bitmapist完全兼容。

bitmapist:一个强大的redis分析库

这个python库使实现实时、高度可伸缩的分析成为可能,这些分析可以回答以下问题:

  • 用户123今天在线了吗?这个星期?这个月?
  • 用户123是否执行了动作"x"?
  • 这个月活跃了多少用户?这一小时?
  • 本周有多少个独特的用户执行了动作"x"?
  • 上周活跃的用户中有多少%仍然活跃?
  • 上个月活跃的用户中有多少%在本月仍然活跃?
  • 哪些用户执行了操作"x"?

这个库非常易于使用,使您能够轻松创建自己的报表。

使用redis位图,您可以在非常小的内存(兆字节)中存储数百万用户的事件。 您应该小心使用巨大的id,因为这可能需要更大的内存。ID应该在[0,2^32]范围内。

此外,bitmapist还可以生成队列图,可以执行以下操作:

  • 超过用户保留的群组
  • 上一次(日、周、月)处于活动状态的用户中有多少%仍处于活动状态?
  • 执行action x的用户中有多少%也执行action y(而且随着时间的推移)
  • 还有很多其他的事情!

如果您想了解有关位图的更多信息,请阅读以下内容:

安装

可通过以下方式轻松安装:

$ pip install bitmapist4

端口

  • php端口:https://github.com/jeremyfreeagent/bitter" rel="nofollow">https://github.com/jeremyfreeagent/bitter

示例

设置:

importbitmapist4b=bitmapist4.Bitmapist()

将用户123标记为活动并播放了一首歌曲:

b.mark_event('active',123)b.mark_event('song:played',123)

如果用户123本月处于活动状态,请回答:

assert123inb.MonthEvents('active')assert123inb.MonthEvents('song:played')

本周有多少用户处于活动状态?

len(b.WeekEvents('active'))

对本周活动的所有用户进行迭代:

foruidinb.WeekEvents('active'):print(uid)

要探索任何特定的日期、周、月或年,而不是当前的日期、周、月或年, uou可以从任何datetime对象创建一个带有from_datestatic的事件 方法:

specific_date=datetime.datetime(2018,1,1)ev=b.MonthEvents('active').from_date(specific_date)print(len(ev))

有返回"兄弟"事件和 让你不需要任何复杂的 迭代器。方法允许您向前或向后跳转 不止一步。统一api允许您使用所有类型的基本事件 (从一小时到一年)使用相同的代码。

current_month=b.MonthEvents('active')prev_month=current_month.prev()next_month=current_month.next()year_ago=current_month.delta(-12)

每个事件对象h作为period_startperiod_end方法来查找 事件的时间跨度。这对于缓存值非常有用 "未来的事件"不可取:

ev=b.MonthEvent('active',dt)ifev.period_end()<datetime.datetime.utcnow():cache.set('active_users_<...>',len(ev))

禁用每小时跟踪(以节省内存!)你可以用 构造函数参数。

$ pip install bitmapist4
0

此外,您还可以为标记事件提供额外的参数以绕过默认值:

$ pip install bitmapist4
1

独特事件

有时事件的数据没有什么意义,你更感兴趣 如果用户一生中至少发生一次特定事件。

为此,有一个UniqueEvents模型。模型只创建一个 redis键,不取决于日期。

您可以将独特的事件与其他类型的事件结合起来。

A/B测试示例:

$ pip install bitmapist4
2

您可以用b.mark_unique标记这些用户,也可以自动 为所有标记的密钥填充额外的唯一队列

$ pip install bitmapist4
3

执行位操作

上个月活跃的用户有多少在这个月仍然活跃?

$ pip install bitmapist4
4

支持运算符&;和^

这适用于嵌套位操作(想象一下您可以用它做什么;-)!

删除事件

如果要在任何时间段内永久删除标记的事件,可以使用delete()方法:

$ pip install bitmapist4
5

如果要删除所有位图列表事件,请使用:

$ pip install bitmapist4
6

默认情况下,位操作的结果被缓存。它们被缓存了60秒 对于操作,包含未完成时段,否则为24小时。

您可能需要显式重置缓存:

$ pip install bitmapist4
7

批量更新事务

如果您经常一次执行多个更新,那么可以从redis中获益。 管道,作为bitmapist中的事务包装。

$ pip install bitmapist4
8

从以前版本迁移

"bitmapist4.bitmapist"实例的api与 bitmapist以前版本的api(模块级)。概述的显著变化 下面,

  • 删除了用于选择服务器的"system"属性。你应该 请改用不同的位图列表类实例。如果你用"系统"来 使用管道时,应切换到事务。
  • bitmapist.track_hourly和bitmapist.track_unique模块级常量 已移动到BitMapist4。BitMapist属性,可以使用类设置 建造商。
  • 在数据库级别,新的bitmapist4对redis密钥使用"bitmapist"前缀, 而老的位图专家出于历史原因使用"trackist"。如果你想要 继续使用旧数据库,或希望使用BitMapist和BitMapist4 对于同一个数据库,需要显式地设置密钥前缀 "追踪器手"
  • 如果使用Bitmapist服务器,请确保使用1.2或更高版本。 此版本添加了对expire命令的支持,该命令用于expire 临时bitop键。

替换可能如下所示的旧代码:

$ pip install bitmapist4
9

像这样:

importbitmapist4b=bitmapist4.Bitmapist()
0

位图组

队列是一组具有明确特征的受试者(通常 在选定的时间段内经历一个共同事件的受试者,例如 出生或毕业)。

您可以使用bitmapist4.courrent.get_courrent_table() 功能。

此表的每一行都回答了"队列的哪一部分" 随着时间的推移执行了活动,该行的第n个单元格表示 仍执行活动的用户数(绝对或百分比) n天后(或数周或数月)。

队列中的每一个新列都展示了不同相似的行为 随着时间的推移。最新一行显示队列的行为, 作为参数提供,上面的一个显示类似的 队列,但转移1天(或一周或一个月前等。

例如,考虑以下队列统计

importbitmapist4b=bitmapist4.Bitmapist()
1

此表显示注册用户仍处于活动状态的速率 注册后同一周,然后一周,然后两周 注册后等。

默认情况下,表格显示20行。

第一行表示来自注册用户群的统计信息 20周前。第二行表示用户的相同统计信息, 19周前注册,以此类推,直到最后一行显示用户 本周注册。当然,最后一行只包含一个单元格, 本周注册并在此活动的用户数 还有一周。

然后您可以自己将其呈现为html,或者导出为pandas数据帧 使用df()方法。

来自http://www.gharchive.org/" rel="nofollow">http://www.gharchive.org/

上用户活动的示例
importbitmapist4b=bitmapist4.Bitmapist()
2

数据帧可以进一步着色(在jupyter笔记本中显示) 使用styleze()。


版权所有:2012-2018 DOIST LTD.

许可证:BSD

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
使用jaxrpc的Java eclipse WebService客户端   java编程方式在对象上写入名称   java Spring批处理:重试后跳过   java Android错误:错误:任务执行失败:应用程序:transformClassesWithDexForDebug'   带有清单文件nullPointerException的java Android元数据   spring Java Quartz调度作业停止运行   JavaMockito:如何在不调用实际方法的情况下,模拟带有参数和无效返回类型的静态方法?   java Tomcat连接池问题无法在关闭的连接上调用方法   java如何交换列表中的项目?   java如何停止线程并通过Toast在线程中正确显示文本?   java为什么连续写入OutputStream时偏移量0不会导致重复字节?   java我无法生成头文件   不兼容的返回类型错误java   修改值后键值对的java Jolt转换规范   java有自动更新Javadoc的工具吗?   java线程如何在ints自身实例类中共享变量   java继承一个非gwt模块   java Hibernate xml配置   使用netty4异步调用的java链接HTTP请求响应