2016-07-05 42 views
2

我有多個時間序列,它們是各種算法的輸出。這些算法可以有不同的參數和它們所產生的時間序列的結果:從包含多個鍵的字典列表創建熊貓時間序列號

timestamp1=1; 
value1=5; 
timestamp2=2; 
value2=8; 
timestamp3=3; 
value3=4; 
timestamp4=4; 
value4=12; 

resultsOfAlgorithms=[ 
{ 
'algorithm':'minmax', 
'param-a':'12', 
'param-b':'200', 
'result-of-algorithm':[[timestamp1,value1],[timestamp2,value2]] 
}, 
{ 
'algorithm':'minmax', 
'param-a':'12', 
'param-b':'30', 
'result-of-algorithm':[[timestamp1,value1],[timestamp3,value3]] 
}, 
{ 
'algorithm':'minmax', 
'param-a':'12', 
'param-b':'30', 
'result-of-algorithm':[[timestamp2,value2],[timestamp4,value4]] 
}, 
{ 
'algorithm':'delta', 
'param-a':'12', 
'param-b':'50', 
'result-of-algorithm':[[timestamp2,value2],[timestamp4,value4]] 
} 
] 

我希望能夠通過算法和參數和情節過濾時間序列篩選時間序列看給定參數是如何影響輸出。要做到這一點,我需要知道給定參數的所有出現值,然後才能夠選擇具有所需參數的時間序列。例如。我想用param-b == 30來繪製minmax算法的所有結果。有2個結果是用minmax算法和param-b == 30生成的。因此我想要有一個有2個時間序列的情節。

這可能是熊貓還是熊貓的功能?這怎麼可能實現?

編輯: 搜索更多的互聯網我認爲我正在尋找一種使用分層索引的方法。時間序列也應該保持分開。每個結果都是一個單獨的時間序列。它不應該與其他結果合併在一起。我需要通過使用的參數來過濾算法的結果。過濾器的結果應該仍然是時間序列列表。

編輯2: 有多個子問題:

  1. 找到每個參數的所有現有值(用戶不知道所有的值,因爲參數可以自動生成由系統)

  2. 用戶選擇一些值的用於過濾這可以通過用戶提供 一種方式是一個字典(但更用戶友好的想法,歡迎):

    濾波器= { 'PARAM-B':[30,50], '算法': '極大極小' }從resultsOfAlgorithms

  3. 時間序列[1:2](第二和第三結果)給定爲濾波的結果,因爲這些結果是通過極大極小算法和param-b產生的爲30。因此,在這種情況下

    [ [[timestamp1,值1],[timestamp3,值3], [[timestamp1,值1],[timestamp3,值3]] ]

  4. 過濾的結果將返回多個時間序列,我想繪製和比較。

  5. 用戶想嘗試不同的過濾器,看看它們是如何影響結果

我做的這一切Jupyter筆記本。我希望允許用戶嘗試各種過濾器,儘可能減少麻煩。

結果中的時間戳不共享。結果之間的時間戳不一定是共享的。例如。所有時間序列可能發生在下午1點到下午3點之間,並且具有完全相同的值,但時間戳或值的數量不相同。

+0

是否要單獨存放時間序列(在列表中,或者只是因爲它們是這裏,在'resultsOfAlgorithms')?或者將它們保留爲數據框中的列不是更好嗎?如果有一些自然的,普通的時間戳空間,那麼後者更方便。這些列將被分級索引,並且對所選系列進行迭代可能會更容易。 – ptrj

+0

在按照算法和參數過濾的情況下,「時間序列應該保持分離」是什麼意思?也許上面的數據應該如何看最終結果的例子會有所幫助。 – Jeff

+0

「resultsOfAlgorithms」中的第二項和第三項具有相同的參數,但「算法結果」不同,因此時間序列不是由它們的參數唯一確定的。這是對的嗎?至於共享時間戳空間,我認爲如果系列的時間戳重疊,則所有時間戳的聯合可能是明智的。 (時間序列將包含NaN的缺失)。 – ptrj

回答

1

所以這裏有兩種選擇,一種是首先清理字典,然後將其輕鬆轉換爲數據幀,第二種是將其轉換爲數據幀,然後清理將嵌套列表的列。對於第一個解決方案,你可以重組的字典是這樣的:

import pandas as pd 
from collections import defaultdict 

data = defaultdict(list) 
for roa in resultsOfAlgorithms: 
    for i in range(len(roa['result-of-algorithm'])): 
     data['algorithm'].append(roa['algorithm']) 
     data['param-a'].append(roa['param-a']) 
     data['param-b'].append(roa['param-b']) 
     data['time'].append(roa['result-of-algorithm'][i][0]) 
     data['value'].append(roa['result-of-algorithm'][i][1]) 

df = pd.DataFrame(data) 

In [31]: df 
Out[31]: 
    algorithm param-a param-b time value 
0 minmax  12  200  1  5 
1 minmax  12  200  2  8 
2 minmax  12  30  1  5 
3 minmax  12  30  3  4 
4 minmax  12  30  2  8 
5 minmax  12  30  4  12 
6  delta  12  50  2  8 
7  delta  12  50  4  12 

,從這裏你可以做任何你需要分析它,無論是策劃還是使時間列的索引或分組和彙總,並等等。您可以比較這對在這個環節上首先製作一個數據幀:

Splitting a List inside a Pandas DataFrame

當他們基本上做同樣的事情,與分裂列表的列到多行。我認爲修復字典將會變得更容易,這取決於您的簡單示例對真實數據的代表性。

編輯:如果你想變成一個多指標,則可以添加更多的行:

df_mi = df.set_index(['algorithm', 'param-a', 'param-b']) 

In [25]: df_mi 
Out[25]: 
          time value 
algorithm param-a param-b 
minmax 12  200   1  5 
        200   2  8 
        30   1  5 
        30   3  4 
        30   2  8 
        30   4  12 
delta  12  50   2  8 
        50   4  12 
+0

這似乎合併/連接時間序列 - OP想要避免的東西 – ptrj

+0

我的答案後編輯爲原始問題。無論如何,如果你這樣做,你可以使用'groupby'獨立檢查不同的時間序列。 – Jeff

相關問題