2017-10-12 51 views
0

我有一個由財務股票ID [0,1400]和時間戳[0,1800]組成的數據集。對於給定的ID,它既可以有也可以沒有給定時間戳的數據。繪製一個圖表,顯示一組列表中存在一個範圍內的值

我已經創建了一個字典,其中每個鍵是一個ID,每個值都是該ID具有數據的所有時間戳的列表。

我現在想繪製一個圖表,每行對應一個ID,每列對應一個時間戳。如果ID i具有時間戳記jif j in dict[i])的數據,則圖表的每個單元格[i, j]都將被標記爲綠色,如果不存在,則爲紅色。

這裏有一個例子我在Excel中手動生產:

enter image description here

可以通過這種或matplotlip一些其他圖書館做什麼?

由於圖表大小爲1400x1800,因此單元格可能非常小。我正在嘗試對數據進行重新排序,以便相鄰ID之間相交的綠色單元格的數量達到最大化,因此此圖表可以讓我提供可視化的數據集跨越/交叉的完成情況。爲了提供一些數據,我只是遍歷我的字典中的前20個ID,並打印出ID和它的時間戳列表。 each line is in the form of ID [list of IDs timestamps]

編輯:

這是我在一個小規模的數據的例子的第一次嘗試。雖然這確實達到了我所要做的,但這是一個非常暴力的解決方案,所以有關改進的任何建議都將值得讚賞。

import matplotlib.pyplot as plt 
import pandas as pd 

TSs = [0, 1, 2, 3, 4, 5] 
ID_TS = {0: [1, 2, 3], 1: [2, 3, 4, 5]} 

df = pd.DataFrame(index=ID_TS.keys(), columns=TSs) 

for ID, TS in ID_TS.items(): 
    bools = [] 
    for i in TSs: 
     if i in TS: 
      bools.append(True) 
     else: 
      bools.append(False) 
    df.loc[ID] = bools 

plt.imshow(df, cmap='hot', interpolation='nearest') 
plt.show() 
+0

你能提供一些示例數據? – akilat90

+1

這個數據集非常龐大,不僅僅是ID和時間戳,還有一些困難。我可以打印出來並提供前20個ID及其相應的時間戳列表? – KOB

+0

是的,[MCVE](https://stackoverflow.com/help/mcve) – akilat90

回答

0

您的代碼來生成您的數據框不起作用。所以我把一些自由與...

import numpy 
import pandas 
from matplotlib import pyplot 
from matplotlib import ticker 

TSs = [0, 1, 2, 3, 4, 5] 
ID_TS = {0: [1, 2, 3, numpy.nan], 1: [2, 3, 4, 5]} 

fig, ax = pyplot.subplots() 

img = ( 
    pandas.DataFrame(data=ID_TS, columns=TSs) 
     .isnull() 
     .pipe(numpy.bitwise_not) 
     .pipe(ax.pcolor, cmap='RdYlGn', edgecolors='k') 
) 

unit_ints = ticker.MultipleLocator(1) 

ax.set_xlabel('Time') 
ax.set_ylabel('ID') 
ax.yaxis.set_major_locator(unit_ints) 
ax.xaxis.set_major_locator(unit_ints) 

enter image description here

+0

該問題的代碼正常工作並生成[此輸出](https://i.stack.imgur.com/f54el.png)。 (有兩個ID和6次)。無論你的代碼在做什麼,它都不會回答我要說的問題。 – ImportanceOfBeingErnest

相關問題