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

社区,

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

我希望能够做以下事情:

  1. 对数据进行切片以获得最后记录的数据点的值。
  2. 对数据进行切片以获得过去 n 秒内数据点的平均值。
  3. 对最后 n 个数据点执行回归以获得 g/s。
  4. 从日志中删除超过 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 秒吗?
  • 我想保持灵活性,以防我决定更频繁地采样。

标签: python-2.7 dictionary pandas time-series real-time


【解决方案1】:

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

  1. 您在帖子中提到数据每秒输入一次。如果可以依赖它,则根本不需要时间戳 - 查找最后 N 个数据点与查找最后 N 秒的数据点完全相同。
  2. 您的摘要数据需要绝对 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 秒内)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 2011-08-07
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多