用于存储时间戳数据的高效数据结构&在滚动窗口中计算

时间:2016-07-06 20:28:08

标签: python data-structures moving-average

我有一个庞大的Twitter数据流,我有兴趣分析每条推文中主题标签的关系。例如,如果主题标签A和主题标签B出现在同一条推文中,我会将此推文记录为“A-B”以及推文的时间戳。

因此,样本输入是:

hashtags,       Timestamp 
A-B,     created_time: 2016-04-07T01:33:19Z 
B-C,     created_time: 2016-04-07T03:53:19Z 
C,       created_time: 2016-04-08T03:31:19Z
C-A,     created_time: 2016-04-08T04:33:19Z 
A-D,     created_time: 2016-04-07T07:33:19Z  # (Note: an example of out of order)
B-D,     created_time: 2016-04-09T09:33:19Z

请注意,流数据可能不会按时间排序。

任务: 1)使用流数据构建主题标签(A,B,C,C ...)及其相互关系的图形。 2)计算图形中顶点的平均度数,并在每次出现新的流数据时(在一天的滑动窗口中)更新它。

顶点的平均度定义为:度=边数/节点数。例如,如果当前图是A-B,则平均度= 1(边)/ 2(节点数)。

示例输出:

Output
1/2,
2/3,
1/2,
1/2,
2/3,
1/2

为了计算一天滚动窗口中的平均顶点度数,存储此类时间戳数据的最有效的Python数据结构是什么?*

我的直觉是使用字典来存储和维护主题标签作为键,以及created_time作为值。因此,为了维持一天的窗口,我需要先对字典进行排序,这需要花费大量时间。是否有更有效的方法根据时间自动存储时间戳数据(无需排序)?

我发现使用Pandas DataFrame的帖子和滚动功能来执行类似的任务。但在我的情况下,我正在寻找一个最有效的数据结构来完成任务。

更新: 在对我的问题进行更多研究之后,我发现这个问题与我的问题非常吻合。 Ideal data structure with fast lookup, fast update and easy comparison/sorting

关键的想法是使用[heapq][2]

2 个答案:

答案 0 :(得分:1)

可以预期推文大部分都是排序的,因此使用insertion sort的序列类型应该是获得排序的好方法。在24小时后添加滚动窗口以替换最旧的窗口。

对于有效插入,您需要一种插入支持比list更好的序列类型。我试试blist。实际上它提供了sortedlist类型,因此您可以试一试,看看它实现了什么样的性能。

这一切都假设您的信息流不会过快增长,无法在内存中保留一整天的推文。如果是,您将 委托给某种数据库。

答案 1 :(得分:1)

我会用熊猫。这是一个示例实现,它根据窗口对时间戳进行排序。您需要先将数据复制到数据框中。

import datetime
import dateutil.relativedelta

days_back = 1
datetimeFormat = '%Y-%m-%d %H:%M:%S'
dt_now = datetime.datetime.now()
start_date = dt_now - dateutil.relativedelta.relativedelta(days=days_back)
start_date = start_date.strftime(datetimeFormat)
df2 = df[df['time_stamp'] > start_date]