我有一个庞大的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]
答案 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]