社区,
目标:我正在运行一个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() – 每隔几秒钟批量处理),因为我希望我的费率计算(回归)是实时的.
这个问题(ECG Data Analysis on a real-time signal in Python)似乎和我一样有问题,但没有真正的解决方案.
目标:
那么在Python中处理和分析实时时间序列数据的正确方法是什么?这似乎是每个人都需要做的事情,所以我想有必要为此预先构建功能?
谢谢,
迈克尔
最佳答案 首先,我会质疑两个假设:
>您在帖子中提到数据每秒输入一次.如果您可以依赖它,则根本不需要时间戳 – 查找最后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)