用于实时分析的正确 Python 数据结构?

Posted

技术标签:

【中文标题】用于实时分析的正确 Python 数据结构?【英文标题】:Proper Python data structure for real-time analysis? 【发布时间】:2016-10-18 10:22:44 【问题描述】:

社区,

目标:我正在运行一个 Pi 项目(即 Python),它与 Arduino 通信以每秒一次从称重传感器获取数据。我应该使用什么数据结构在 Python 中记录(并进行实时分析)这些数据?

我希望能够做以下事情:

    对数据进行切片以获得最后记录的数据点的值。 对数据进行切片以获得过去 n 秒内数据点的平均值。 对最后 n 个数据点执行回归以获得 g/s。 从日志中删除超过 n 秒的数据点。

当前尝试:

字典:我在字典中添加了一个带有舍入时间的新键(见下文),但这使得切片和分析变得困难。

log = 

def log_data():
    log[round(time.time(), 4)] = read_data()

Pandas DataFrame:这是我一直想要的,因为它使时间序列切片和分析变得容易,但这 (How to handle incoming real time data with python pandas) 似乎说这是个坏主意。我无法遵循他们的解决方案(即存储在字典中,并且每隔几秒批量存储df.append()-ing),因为我希望我的速率计算(回归)是实时的。

这个问题(ECG Data Analysis on a real-time signal in Python)似乎和我有同样的问题,但没有真正的解决方案。

目标:

那么在 Python 中处理和分析实时时间序列数据的正确方法是什么?这似乎是每个人都需要做的事情,所以我想必须为此预先构建功能?

谢谢,

迈克尔

【问题讨论】:

你看过双端队列吗? docs.python.org/2/library/collections.html#deque-objects另外,这篇文章真的很广泛。您应该考虑缩小范围。 我认为双端队列会比列表更好,但它们实际上只能解决问题1。在 problem 24 中,我将在最后 n 秒前删除,而不是 n 项 @Alexander 顺便说一句-您提到数据每秒输入一次。因此,在您的应用程序中,您不能忽略时间戳并根据计数进行切片吗?这会让事情变得简单一些。换句话说,如果你想要最后 5 秒,你可以只做data[-5:] 并假设最后 5 项是最后 5 秒吗? 我想保持灵活性,以防我决定更频繁地采样。 【参考方案1】:

首先,我要质疑两个假设:

    您在帖子中提到数据每秒输入一次。如果可以依赖它,则根本不需要时间戳 - 查找最后 N 个数据点与查找最后 N 秒的数据点完全相同。 您的摘要数据需要绝对 100% 实时。这可能会使生活变得更加复杂——是否可以完全放松?

无论如何,这是一种使用列表的非常幼稚的方法。它满足您的需求。性能可能会成为问题,具体取决于您需要存储多少先前的数据点。

另外,您可能没有想到这一点,但是您需要完整记录过去的数据吗?或者你可以直接扔东西吗?

data = []

new_observation = (timestamp, value)

# new data comes in
data.append(new_observation)


# Slice the data to get the value of the last logged datapoint.
data[-1]

# Slice the data to get the mean of the datapoints for the last n seconds.
mean(map(lambda x: x[1], filter(lambda o: current_time - o[0] < n, data)))

# Perform a regression on the last n data points to get g/s.
regression_function(data[-n:])

# Remove from the log data points older than n seconds.
data = filter(lambda o: current_time - o[0] < n, data)

【讨论】:

100% 实时不是必需的,因为计算将更新 GUI 上的信息;但是,我想要实时“足够”,用户不会注意到延迟(即 2 秒内)。

以上是关于用于实时分析的正确 Python 数据结构?的主要内容,如果未能解决你的问题,请参考以下文章

python爬虫等获取实时数据+Flume+Kafka+Spark Streaming+mysql+Echarts实现数据动态实时采集分析展示

有没有办法实时从UDP数据包中提取有效负载并将该有效负载用于其他应用程序?

流数据分析技术笔记5 分布式实时处理系统

Flume+Kafka+Storm+Redis实时分析系统基本架构

Flume+Kafka+Storm+Redis实时分析系统基本架构

用于 Web 访问日志的实时数据仓库