用于实时分析的正确 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 2 和 4 中,我将在最后 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数据包中提取有效负载并将该有效负载用于其他应用程序?
Flume+Kafka+Storm+Redis实时分析系统基本架构