适当的Python数据结构用于实时分析?

时间:2016-06-16 18:40:35

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

社区,

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

我希望能够做到这样的事情:

  1. 切片数据以获取上次记录的数据点的值。
  2. 切片数据以获得最近n秒的数据点的平均值。
  3. 对最后n个数据点执行回归以获得g / s。
  4. 从超过n秒的日志数据点中删除。
  5. 当前尝试:

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

    .highlight:hover {
        transition-delay: 3s;
        /* ... */
    }
    

    Pandas DataFrame :这是我跳过的那个,因为它使时间序列切片和分析变得容易,但是这个(How to handle incoming real time data with python pandas)似乎说它是一个坏主意。我不能按照他们的解决方案(即存储在字典中,并且每隔几秒就散布log = {} def log_data(): log[round(time.time(), 4)] = read_data() - 因为我希望我的费率计算(回归)是实时的。

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

    目标:

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

    谢谢,

    迈克尔

1 个答案:

答案 0 :(得分:1)

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

  1. 您在帖子中提到数据每秒输入一次。如果您可以依赖它,则根本不需要时间戳 - 找到最后N个数据点与查找最后N秒的数据点完全相同。
  2. 您有一个约束,即您的摘要数据必须绝对100%实时。这可能会让生活更加复杂 - 是否有可能放松一下呢?
  3. 无论如何,这是一个非常天真的使用列表的方法。它满足您的需求。性能可能会成为问题,具体取决于您需要存储的先前数据点的数量。

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

    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)