2016-06-16 34 views
4

社區,適當的Python數據結構進行實時分析?

目的:我正在與一個Arduino通信從稱重傳感器每秒一次得到的數據丕項目(即蟒蛇)。我應該使用什麼數據結構來記錄(並進行實時分析)Python中的這些數據?

我希望能夠做的事情,如:

  1. 切片數據,以獲得最後的記錄數據點的值。
  2. 切片數據以獲取最後n秒數據點的平均值。
  3. 對最後n個數據點進行迴歸以得到g/s。
  4. 從日誌中刪除超過n秒的數據點。

當前嘗試:

字典:我已經附加了一個圓形的時間字典一個新的密鑰(見下文),但是這使得切片和分析難。

log = {} 

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

熊貓據幀:這是一個我一直在跳了,因爲是使時間序列切片和分析變得更簡單,但是這(How to handle incoming real time data with python pandas)似乎是說其是一個壞主意。我無法遵循他們的解決方案(即存儲在字典中,並且每隔幾秒鐘批量處理一次),因爲我希望實時計算費率(迴歸)。

這個問題(ECG Data Analysis on a real-time signal in Python)似乎與我有同樣的問題,但沒有真正的解決方案。

目標:

那麼,什麼是在Python處理和分析實時的時間序列數據的正確方法?這似乎是每個人都需要做的事情,所以我想有必要爲此預建功能?

感謝,

邁克爾

+0

你看過deques嗎? https://docs.python.org/2/library/collections.html#deque-objects此外,這篇文章確實非常廣泛。你應該考慮縮小範圍。 – Alexander

+0

我認爲deques會比列表更好,但他們真的只解決*問題1 *。在*問題2 *和* 4 *我最後n秒刪除,而不是n個項目@Alexander –

+0

順便說一句 - 你提到數據每秒進入一次。所以在你的應用程序中,你不能忽略時間戳,只是基於計數來切片?這會讓事情變得更簡單。換句話說,如果你想要最後5秒,你可以只做'data [-5:]'並且假設最後5個項目是最後5秒? – exp1orer

回答

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) 
+0

100%的實時性並不是必需的,因爲計算將更新GUI上的信息;然而,我希望實時的'足夠',使用戶不會注意到延遲(即2秒)。 –