本文是基於StackAbuse的一篇講解Seaborn的文章編寫。 附示例及實現程式碼,可直接前往BigQuant人工智慧量化投資平臺一鍵克隆程式碼進行實踐。程式碼連結見文末。
簡介
在本文中,我們將研究Seaborn,它是Python中另一個非常有用的資料視覺化庫。Seaborn庫構建在Matplotlib之上,並提供許多高階資料視覺化功能。
儘管Seaborn庫可以用於繪製各種圖表,如矩陣圖、網格圖、迴歸圖等,但在本文中,我們將瞭解如何使用Seaborn庫繪製分佈和分類圖。在本系列的第二部分中,我們將瞭解如何繪製迴歸圖、矩陣圖和網格圖。
下載Seaborn庫
我們可以通過幾種方式下載seaborn庫。如果您正在為Python庫使用pip安裝程式,您可以執行以下命令來下載這個庫:
pip install seaborn
或者,如果您正在使用Python的Anaconda發行版,您可以使用以下命令來下載seaborn庫:
conda install seaborn
在BigQuant平臺上,你可以跳過這一步,直接在策略編寫中import seaborn,即可使用
資料集
我們選取財報資料17年到19年的資料進行繪製,首先在策略模板中輸入如下程式碼:
import numpy as np
import pandas as pd
import seaborn as sns df = DataSource('financial_statement_CN_STOCK_A').read(start_date='2017-01-01',end_date='2019-01-02')
#刪除Na值,否則後續繪圖會報錯,在進行資料探勘時,資料清洗也同樣十分重要
df = df.dropna() df.head()
'df.head()'顯示了df的前五行:
分佈圖
sns.distplot(df['fs_roe'])
這裡繪製的是各個股票的淨資產收益率(fs_roe),結果如下:
聯合分佈圖
jointplot()用於顯示各列的相互分佈。您需要向jointplot傳遞三個引數。第一個引數是要在x軸上顯示資料分佈的列名。第二個引數是要在y軸上顯示資料分佈的列名。最後,第三個引數是資料幀的名稱。
我們來畫一個淨資產收益率(fs_roe)和總資產報酬率 (TTM)(fs_roa_ttm)的聯合分佈圖看看能不能找到兩者之間的關係,程式碼如下:
# 這裡kind='reg'表示在畫完連線圖後,做出兩者之間的線性關係
sns.jointplot(x='fs_roe', y='fs_roa_ttm', data=df,kind='reg')
從圖中我們可以發現兩者有一定的線性關係。本文為了簡潔,只使用了財務報表的資料。其中’kind’一欄代表圖形型別,可使用 scatter,reg,resid,kde,hex…此處不再贅述
Pair Plot
paitplot()是一種分佈圖,它基本上為資料集中所有可能的數字列和布林列的組合繪製聯合圖。您只需要將資料集的名稱作為引數傳遞給pairplot()函式,如下所示:
df_0 = DataSource('west_CN_STOCK_A').read(start_date='2017-01-01',end_date='2019-01-02') df_0 = df_0.dropna() sns.pairplot(df_0)
由於財報資料列數過多,這裡我們使用一致預期(west_CN_STOCK_A)
從pair plot的輸出中,您可以看到一致預期中所有數字列和布林列的分佈圖。
要將分類列的資訊新增到pair plot中,可以將分類列的名稱傳遞給hue引數。
sns.pairplot(dataset, hue='你想用來分類的列')
本文選取的報表分類效果均不理想,讀者可以使用自己找到的例子自行嘗試、感受。
Rug Plot
ugplot()用於為資料集中的每個點沿x軸繪製小條。要繪製rug圖,需要傳遞列的名稱。我們來畫個小的rug plot。
sns.rugplot(df['fs_roe'])
從輸出中可以看到,與distplot()的情況一樣,fs_roe的大多數例項的值都在(-50,50)之中。
Bar Plot
barplot()用於顯示分類列中的每個值相對於數字列的平均值。第一個引數是分類列,第二個引數是數值列,第三個引數是資料集。例如,如果您想知道各個股票營業收入這段時間的平均值,您可以使用如下的條形圖。
sns.barplot(x='instrument', y='fs_operating_revenue', data=df)
如圖,橫座標對應股票,縱座標對應營業收入,彩色部分長度代表均值,黑色部分代表不同時間點波動的幅度(事實上每個股票對應的“柱”是有寬度的,文章原文是泰坦尼克號失事人員的資訊表,此處統計的是失事男女的平均年齡。原則上x軸上元素不宜過多)
除了求平均值之外,Bar Plot還可以用於計算每個類別的其他聚合值。為此,需要將聚合函式傳遞給估計器。例如,你可以計算每個股票營業收入的標準差如下:
sns.barplot(x='instrument', y='fs_operating_revenue', data=df, estimator=np.std)
注意:此程式碼用到了numpy庫
統計圖
統計圖與條形圖類似,但是它顯示特定列中類別的計數。例如,如果我們想要計算每日被寫入財報資料的股票資訊數量,我們可以使用count plot這樣做:
sns.countplot(x='date', data=df)
箱線圖
box plot用於以四分位數的形式顯示分類資料的分佈。框的中心顯示了中值。從下須到盒底的值顯示第一個四分位數。從盒子的底部到盒子的中部是第二個四分位數。從盒子的中間到頂部是第三個四分位數,最後從盒子的頂部到頂部鬍鬚是最後一個四分位數。
現在我們畫一個方框圖,顯示年齡和性別的分佈。您需要將分類列作為第一個引數(在我們的示例中是年份),而數字列(在我們的示例中是淨資產收益率)作為第二個引數。最後,將資料集作為第三個引數傳遞,請看下面的指令碼:
為使影象表達出的資訊更加直接有用,方便閱讀,我先對資料進行了去極值處理。(未去極值的結果在後面附上的程式碼中可以看到)
boxplot會自動對資料進行標記極值處理。若有資料超出某範圍,則會被標記為異常值,在途中以點的形式顯示。為被標記的資料則會以箱型的形式顯示。“箱子”的五根線分別為資料的0%,25%,50%,75%,100%。
通過新增另一層分佈,您可以使您的方框繪圖更加美觀。例如,如果你想檢視不同季度的資料,以及他們淨資產收益率的資訊,你可以將不同季度的資料傳遞給hue引數,如下圖所示:
sns.boxplot(x='fs_quarter_year', y='fs_roe', data=df_1,hue='fs_quarter_index')
Violin Plot
小提琴圖與box圖類似,但是小提琴圖允許我們顯示與資料點實際對應的所有元件。函式的作用是:繪製小提琴的曲線圖。與box plot類似,第一個引數是分類列,第二個引數是數值列,第三個引數是資料集。
讓我們畫一個小提琴圖來展示年份和淨資產收益率的分佈。
sns.violinplot(x='fs_quarter_year', y='fs_roe', data=df_1)
像box plot一樣,您還可以使用hue引數向小提琴plot新增另一個類別變數,如下所示:
sns.violinplot(x='fs_quarter_year', y='fs_roe', data=df_1,hue='fs_quarter_index')
現在你可以在Violin Ploe上看到很多資訊。然而,不利的一面是,理解小提琴的情節需要一些時間和精力。
你可以把一個小提琴圖分成兩半,一半代表倖存的乘客,另一半代表沒有幸存的乘客。為此,需要將True作為violinplot()函式的分割引數的值傳遞。然而,需要注意的是:此時hue必須有且僅有兩種情況,否則程式碼報錯。這裡給出文章原文的程式碼:
sns.violinplot(x='sex', y='age', data=dataset, hue='survived', split=True)
(dataset為原文作者使用的DataFrame,sex、age、survived為乘客的資訊表)
Violin Plot和Box Plot都非常有用。但是,根據經驗,如果您向非技術人員展示資料,那麼最好使用Box Plot,因為它們很容易理解。另一方面,如果你把你的研究成果展示給研究團體,那麼使用Violin Plot來節省空間和在更短的時間內傳達更多的資訊,這會使一切變得更方便。
The Strip Plot
條形圖繪製一個散點圖,其中一個變數是分類變數。我們已經看到了散點圖在聯合圖和成對圖中我們有兩個數值變數。在這種情況下,條形圖的不同之處在於其中一個變數是分類變數,對於分類變數中的每個類別,您將看到與數字列相關的散點圖。
函式的作用是:繪製小提琴的曲線圖。與box plot類似,第一個引數是分類列,第二個引數是數值列,第三個引數是資料集。請看下面的程式碼:
sns.stripplot(x='fs_quarter_year', y='fs_roe', data=df_1)
你可以看到各個股票每年的淨資產收益率分佈。資料點看起來像條。理解這種形式的資料分佈有點困難,為了更好地理解資料,我們給抖動引數傳遞True,它會給資料新增一些隨機噪聲。請看下面的程式碼:
sns.stripplot(x='fs_quarter_year', y='fs_roe', data=df_1,jitter=True)
就像小提琴圖和盒子圖一樣,您可以使用色相引數為條形圖新增額外的分類列,如下圖所示:
sns.stripplot(x='fs_quarter_year', y='fs_roe', data=df_1,jitter=True,hue='fs_quarter_index')
同理,“split=True”同樣適用,同時也要求hue的列值只有兩種情況
The Swarm Plot
Swarm Plot是Strip Plot和 Violin Plots的結合。在Swarm Plot中,這些點以不重疊的方式調整。讓我們畫一個Swarm Plot來表示年份和淨資產收益率的關係。函式的作用是:繪製小提琴的曲線圖。與box plot類似,第一個引數是分類列,第二個引數是數值列,第三個引數是資料集。請看下面的程式碼:
sns.swarmplot(x='fs_quarter_year', y='fs_roe', data=df_1)
可以清楚地看到,上面的圖中包含了散在的資料點,比如條形圖,資料點沒有重疊。相反,他們和Violin Plot很相似。
讓我們使用hue引數向群圖中新增另一個分類列。
sns.swarmplot(x='fs_quarter_year', y='fs_roe', data=df_1,hue='fs_quarter_index')
同理,“split=True”同樣適用,同時也要求hue的列值只有兩種情況
Combining Swarm and Violin Plots
如果您有一個龐大的資料集,不推薦使用群體圖,因為它們不能很好地伸縮,因為它們必須繪製每個資料點。如果你真的喜歡群體圖,一個更好的方法是結合兩個圖。例如,要將Swarm Plot 與 Violin Plot結合起來,程式碼如下:
sns.violinplot(x='fs_quarter_year', y='fs_roe', data=df_1) sns.swarmplot(x='fs_quarter_year', y='fs_roe', data=df_1, color='black')
總結
Seaborn是一種基於Matplotlib庫的高階資料視覺化庫。在本文中,我們研究瞭如何使用Seaborn庫繪製分佈和分類圖。這是關於Seaborn的系列文章的第1部分。在本系列的第二篇文章中,我們將瞭解如何在Seaborn中處理網格功能,以及如何在Seaborn中繪製矩陣和迴歸圖。
實現原始碼:《Pandas資料視覺化工具——Seaborn用法整理》
本文由BigQuant人工智慧量化投資平臺原創推出,版權歸BigQuant所有,轉載請註明出處。