2017-08-07 51 views
0

我有2個數據框是使用熊貓構建的。我可以讓大熊貓告訴我什麼時候我的數據通過使用布爾值索引而落在某個參數之外。 我想在與原始數據相同的圖表上突出顯示我的異常值。我的企圖已經在下面的代碼中被註釋掉了,它們都不起作用。 我的問題是:我如何突出顯示圖中的異常值?突出顯示matplotlib圖中的熊貓數據框的異常值

這是我的代碼,發現在我的dataframes離羣值:

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn 
#plt.style.use("dark_background") 
plt.style.use("seaborn-bright") 

x4 = (e[0].time[:47172]) 
y4 = (e[0].data.f[:47172]) 

x6 = (t[0].time[:47211]) 
y6 = (t[0].data.f[:47211]) 

df4 = pd.DataFrame({'Time': x4, 'Data': y4}) 
df4['Outlier'] = (df4['Data'] < 2) | (df4['Data'] > 4) 
#----This prints out only outliers 
df4[df4.Outlier] 

df6 = pd.DataFrame({'Time': x4, 'Data': y4}) 
df6['Outlier'] = (df6['Data'] < 2) | (df6['Data'] > 4) 
#----This prints out only outliers 
df6[df6.Outlier] 

plt.xlabel('Relative Time in Seconds', fontsize=12) 
plt.ylabel('Data', fontsize=12) 
plt.grid(linestyle = 'dashed') 

這只是繪製的原始數據:

plt.plot(x4, y4) 
plt.plot(x6, y6) 
plt.show() 

這是什麼我的數據框看起來像一個例子:

 Data   Time Outlier 
0  0.000  7.343689  True 
1  0.000  7.391689  True 
2  0.000  7.439689  True 
... ...  ...   ... 
47169 2.315 15402.062500 False 
47170 0.000 15402.110352  True 
47171 0.000 18682.187500  True 
[47172 rows x 3 columns] 

這些是我的企圖不起作用:

#fig = plt.figure() 
#ax=fig.add_subplot(111) 
#ax.plot((df4 < 2), (df4 > 4), color="r") 

^這只是繪製一條直線,這是不正確的。

#df4.plot((df4['Data'] < 2), (df4['Data'] > 4), color = "r") 

^這一個打印出具有「真」和「假上的x軸,而不是時間的曲線圖。

我在想這樣的for循環可能工作,但我不知道如何實現它。任何幫助/反饋將不勝感激。

for True in 'Outlier': 
    plt.plot(x4, y4, color='r') 

回答

1

您已成功地只打印了異常值,所以現在你可以簡單地繪製他們對你的正常數據之上,例如像這樣:

plt.plot(x4, y4) # Data 
plt.plot(x4[df4.Outlier], y4[df4.Outlier], 'r.') # Outlier highlights 
plt.plot(x6, y6) 
plt.plot(x6[df6.Outlier], y6[df6.Outlier], 'r.') 
plt.show() 

重要的是使用Boolean series (例如df4.Outlier)作爲mask以通過索引檢索實際異常值。在您的非功能性示例中,您將改爲繪製mask本身。


邊注1:你可以在你的代碼跳過整個大熊貓部分(除非你需要它在其他地方),只是做:

mask4 = np.logical_or(y4 < 2, y4 > 4) 
mask6 = np.logical_or(y6 < 2, y6 > 4) 

plt.plot(x4, y4) 
plt.plot(x4[mask4], y4[mask4], 'r.') 
plt.plot(x6, y6) 
plt.plot(x6[mask6], y6[mask6], 'r.') 

plt.show() 

邊注2:您創建的行中存在錯誤df6:您使用的是x4y4,而不是x6y6作爲輸入。


附註3:循環的方法是事倍功半/優雅相比Boolean masking,但這裏是它如何工作(學習的緣故):

for index,truth_value in enumerate(df4.Outlier): 
    if truth_value: 
     plt.plot(x4[index], y4[index], 'r.') 

或者作爲列表理解:

[plt.plot(x4[i], y4[i], 'r.') for i,t in enumerate(df4.Outlier) if t]