A. python數據可視化--可視化概述
數據可視化是python最常見的應用領域之一,數據可視化是藉助圖形化的手段將一組數據以圖形的形式表達出來,並利用數據分析和開發工具發現其中未知信息的數據處理過程。
在學術界有一句話廣為流傳,A picture worths thousand words,就是一圖值千言。在課堂上,我經常舉的例子就是大家在刷朋友圈的時候如果看到有人轉發一篇題目很吸引人的文章時,我們都會點擊進去,可能前幾段話會很認真地看,文章很長的時候後面就會一目十行,失去閱讀的興趣。
所以將數據、表格和文字等內容用圖表的形式表達出來,既能提高讀者閱讀的興趣,還能直觀表達想要表達的內容。
python可視化庫有很多,下面列舉幾個最常用的介紹一下。
matplotlib
它是python眾多數據可視化庫的鼻祖,也是最基礎的底層數據可視化第三方庫,語言風格簡單、易懂,特別適合初學者入門學習。
seaborn
Seaborn是在matplotlib的基礎上進行了更高級的API封裝,從而使得作圖更加容易,在大多數情況下使用seaborn能做出很具有吸引力的圖,而使用matplotlib就能製作具有更多特色的圖。應該把Seaborn視為matplotlib的補充,而不是替代物。
pyecharts
pyecharts是一款將python與echarts結合的強大的數據可視化工具,生成的圖表精巧,交互性良好,可輕松集成至 Flask,Sanic,Django 等主流 Web 框架,得到眾多開發者的認可。
bokeh
bokeh是一個面向web瀏覽器的互動式可視化庫,它提供了多功能圖形的優雅、簡潔的構造,並在大型數據集或流式數據集上提供高性能的交互性。
python這些可視化庫可以便捷、高效地生成豐富多彩的圖表,下面列舉一些常見的圖表。
柱形圖
條形圖
坡度圖
南丁格爾玫瑰圖
雷達圖
詞雲圖
散點圖
等高線圖
瀑布圖
相關系數圖
散點曲線圖
直方圖
箱形圖
核密度估計圖
折線圖
面積圖
日歷圖
餅圖
圓環圖
馬賽克圖
華夫餅圖
還有地理空間型等其它圖表,就不一一列舉了,下節開始我們先學習matplotlib這個最常用的可視化庫。
B. 數據分析員用python做數據分析是怎麼回事,需要用到python中的那些內容,具體是怎麼操作的
大數據!大數據!其實是離不開數據二字,但是總體來講,自己之前對數據的認知是不太夠的,更多是在關注技術的提升上。換句話講,自己是在做技術,這些技術處理的是數據,而不能算是自己是在做數據的。大規模數據的處理是一個非常大的課題,但是這一點更偏向於是搞技術的。
與數據分析相關的Python庫很多,比如Numpy、pandas、matplotlib、scipy等,數據分析的操作包括數據的導入和導出、數據篩選、數據描述、數據處理、統計分析、可視化等等。接下來我們看一下如何利用Python完成數據的分析。
生成數據表
常見的生成方法有兩種,第一種是導入外部數據,第二種是直接寫入數據,Python支持從多種類型的數據導入。在開始使用Python進行數據導入前需要先導入pandas庫,為了方便起見,我們也同時導入Numpy庫。代碼是最簡模式,裡面有很多可選參數設置,例如列名稱、索引列、數據格式等等。
檢查數據表
Python中使用shape函數來查看數據表的維度,也就是行數和列數。你可以使用info函數查看數據表的整體信息,使用dtypes函數來返回數據格式。Isnull是Python中檢驗空值的函數,你可以對整個數據表進行檢查,也可以單獨對某一列進行空值檢查,返回的結果是邏輯值,包含空值返回True,不包含則返回False。使用unique函數查看唯一值,使用Values函數用來查看數據表中的數值。
數據表清洗
Python中處理空值的方法比較靈活,可以使用Dropna函數用來刪除數據表中包含空值的數據,也可以使用fillna函數對空值進行填充。Python中dtype是查看數據格式的函數,與之對應的是astype函數,用來更改數據格式,Rename是更改列名稱的函數,drop_plicates函數刪除重復值,replace函數實現數據替換。
數據預處理
數據預處理是對清洗完的數據進行整理以便後期的統計和分析工作,主要包括數據表的合並、排序、數值分列、數據分組及標記等工作。在Python中可以使用merge函數對兩個數據表進行合並,合並的方式為inner,此外還有left、right和outer方式。使用ort_values函數和sort_index函數完成排序,使用where函數完成數據分組,使用split函數實現分列。
數據提取
主要是使用三個函數:loc、iloc和ix,其中loc函數按標簽值進行提取,iloc按位置進行提取,ix可以同時按標簽和位置進行提取。除了按標簽和位置提起數據以外,還可以按具體的條件進行數據,比如使用loc和isin兩個函數配合使用,按指定條件對數據進行提取。
數據篩選匯總
Python中使用loc函數配合篩選條件來完成篩選功能,配合sum和 count函數還能實現excel中sumif和countif函數的功能。Python中使用的主要函數是groupby和pivot_table。groupby是進行分類匯總的函數,使用方法很簡單,制定要分組的列名稱就可以,也可以同時制定多個列名稱,groupby 按列名稱出現的順序進行分組。
隨著數據挖掘分析在企業業務層面的深度應用,我們會發現,在實際業務場景中,數據分析工作已經逐漸分為2個層次;較為流程化但與業務深度結合的數據分析工作,會更傾向於讓業務人員通過專業分析工具進行自主 探索 分析,比如我們的Tempo大數據分析平台,就可以通過拖拽式、智能化的簡便操作,幫助業務人員快速上手數據分析工作,快速將業務數據價值變現。
而針對一些閉喊更加細致、專業化的建模分析需求,其實還是通過代碼的方式去實現更加高效靈活。Tempo大數據分析平台正是考慮到廣大專業數據分析人員的實際需求,專門開發了 【擴展編程】 這一功能模塊,讓自定義編程和平台中已有的節點結合使用,快速提高數據分析工作效率!
為了讓廣大數據分析師在Tempo平台中,既可以通過編程實現更加靈活的建模,也能避免原生Python編程的一些使用局限,我們還通過廣泛的用戶調研,在【擴展編程】模塊設計了 3個提高Python編程易用性的小功能 ,下面我們一起來看看這三個功能都具體解決了哪些問題~
1、Python洞察不直觀 ,分析結果可讀性低
我們常說「一圖勝千言」,對於數據分析工作來說更是如此。分析結果最終還是要直接賦能實際業務,由於Python代碼行的形式讓分析結果可讀性極低,分析人員無法快速實現對數據的直觀 探索 分析,導致整體工作效率的降低。
2、Python調試分析難 ,校驗調試流程多,反復折騰易出錯
調試和分析是Python開發中非常重要的環節,但代碼 校驗報錯結果難查看 的問題,讓很多數據分析人員大傷腦筋。
尤其是現在很多企業數據分析項目是在自己的數據平台中進行的,分析人員只能把平台中的代碼復制到第三方平台中進行校驗,調試好後再粘貼回平台中運行,非常麻煩。
3、Python運行總「缺包」 ,寫碼大半天,報錯一瞬間
在一般的企業數據分析項目中,預先有可能會設置有多套Python環境,版本並不統一。這就會導致分析人員常常卜盯並不清楚自己當前使用的到底是哪一套Python環境,在編碼時引用的Python包,在不同的Python環境上運行很有可能會出現缺失,引起代碼執行報錯,而且這種錯誤信息並不好排查,一旦報錯只能從頭再來,讓程序員們白白做了無用功。
以往專業數據分析人員遇到以上問題,只能選擇用更多的時間和精力去修復bug,那麼在我們的Tempo大數據分析平台之中,又是如何解決這些問題,讓 Python編程的應用 更簡便、更高效、更適應企業實際需求呢?
1、圖形化洞察,快速 探索 數據價值
針對傳統編碼數據分析方式難以直觀展示數據分析結果的缺點,Tempo大數據分析平台——擴展編程模塊特別支持在代碼區域設置 通過matplotlib/seabron等圖形方法實現節點洞察 ,校驗通過後,就可以直接在洞察區域中查看繪制的圖形,比如:折線圖、直方圖、條形圖、餅圖等。
以後業務部門簡單的可視化分析需求就可以直接在建模挖掘分析的同時快速產出,立等可取,無需再周轉其他可視化分析工具,大大提高的數據價值變現的效率。
2、控制台,讓調試分析更便捷
針對傳統Python編程調試報錯信息不好查看的問題, Tempo大數據分析平台—擴展編程模塊中的控制台功能,可以 直接在指定區域中顯示錯誤信息和代碼中需要print的部分 ,便於使用者快速發現問題,立即調整代碼。
除了幫助專業數據分析人員提高工作效率,控制台中的【示例】小模塊還內置了常用的參考代碼,可以幫助一些不太能熟練應用Python編程語言的小白用戶,通過復用或小部分修改邏輯代碼的方式,也能快速完成數據邏輯處理工作。用好轎弊野這個功能,團隊內部的技能培訓也能更有章法了呢!
3、快速查詢Python環境和包版本,事前預防,再也不怕「丟包缺包」
Python編程最怕丟包缺包問題,在Tempo大數據分析平台中,我們內置了Python環境版本和包版本的信息查詢組件,分析人員在編碼之前,可以預先查詢一下當前的Python環境版本和包版本,如果發現有缺包就可以在編碼工作開始之前補充安裝,把「丟包缺包」造成的代碼報錯風險降到最低。
今天的Tempo小課堂中,小T主要給大家介紹了如何通過Python擴展編程的三個小功能,幫助代碼偏好的專業數據分析人員減少不必要的麻煩操作,提高工作效率。
D. 怎麼得到python中歸一化直方圖橫坐標的對應值
a=plt.hist()
a[0]就是bins的高度,a[1]就是bins的列表
E. 數字圖像處理Python實現圖像灰度變換、直方圖均衡、均值濾波
import CV2
import
import numpy as np
import random
使用的是pycharm
因為最近看了《銀翼殺手2049》,裡面Joi實在是太好看了所以原圖像就用Joi了
要求是灰度圖像,所以第一步先把圖像轉化成灰度圖像
# 讀入原始圖像
img = CV2.imread('joi.jpg')
# 灰度化處理
gray = CV2.cvtColor(img, CV2.COLOR_BGR2GRAY)
CV2.imwrite('img.png', gray)
第一個任務是利用分段函數增強灰度對比,我自己隨便寫了個函數大致是這樣的
def chng(a):
if a < 255/3:
b = a/2
elif a < 255/3*2:
b = (a-255/3)*2 + 255/6
else:
b = (a-255/3*2)/2 + 255/6 +255/3*2
return b
rows = img.shape[0]
cols = img.shape[1]
cover = .deep(gray)
for i in range(rows):
for j in range(cols):
cover[i][j] = chng(cover[i][j])
CV2.imwrite('cover.png', cover)
下一步是直方圖均衡化
# histogram equalization
def hist_equal(img, z_max=255):
H, W = img.shape
# S is the total of pixels
S = H * W * 1.
out = img.()
sum_h = 0.
for i in range(1, 255):
ind = np.where(img == i)
sum_h += len(img[ind])
z_prime = z_max / S * sum_h
out[ind] = z_prime
out = out.astype(np.uint8)
return out
covereq = hist_equal(cover)
CV2.imwrite('covereq.png', covereq)
在實現濾波之前先添加高斯雜訊和椒鹽雜訊(代碼來源於網路)
不知道這個椒鹽雜訊的名字是誰起的感覺隔壁小孩都饞哭了
用到了random.gauss()
percentage是雜訊佔比
def GaussianNoise(src,means,sigma,percetage):
NoiseImg=src
NoiseNum=int(percetage*src.shape[0]*src.shape[1])
for i in range(NoiseNum):
randX=random.randint(0,src.shape[0]-1)
randY=random.randint(0,src.shape[1]-1)
NoiseImg[randX, randY]=NoiseImg[randX,randY]+random.gauss(means,sigma)
if NoiseImg[randX, randY]< 0:
NoiseImg[randX, randY]=0
elif NoiseImg[randX, randY]>255:
NoiseImg[randX, randY]=255
return NoiseImg
def PepperandSalt(src,percetage):
NoiseImg=src
NoiseNum=int(percetage*src.shape[0]*src.shape[1])
for i in range(NoiseNum):
randX=random.randint(0,src.shape[0]-1)
randY=random.randint(0,src.shape[1]-1)
if random.randint(0,1)<=0.5:
NoiseImg[randX,randY]=0
else:
NoiseImg[randX,randY]=255
return NoiseImg
covereqg = GaussianNoise(covereq, 2, 4, 0.8)
CV2.imwrite('covereqg.png', covereqg)
covereqps = PepperandSalt(covereq, 0.05)
CV2.imwrite('covereqps.png', covereqps)
下面開始均值濾波和中值濾波了
就以n x n為例,均值濾波就是用這n x n個像素點灰度值的平均值代替中心點,而中值就是中位數代替中心點,邊界點周圍補0;前兩個函數的作用是算出這個點的灰度值,後兩個是對整張圖片進行
#均值濾波模板
def mean_filter(x, y, step, img):
sum_s = 0
for k in range(x-int(step/2), x+int(step/2)+1):
for m in range(y-int(step/2), y+int(step/2)+1):
if k-int(step/2) 0 or k+int(step/2)+1 > img.shape[0]
or m-int(step/2) 0 or m+int(step/2)+1 > img.shape[1]:
sum_s += 0
else:
sum_s += img[k][m] / (step*step)
return sum_s
#中值濾波模板
def median_filter(x, y, step, img):
sum_s=[]
for k in range(x-int(step/2), x+int(step/2)+1):
for m in range(y-int(step/2), y+int(step/2)+1):
if k-int(step/2) 0 or k+int(step/2)+1 > img.shape[0]
or m-int(step/2) 0 or m+int(step/2)+1 > img.shape[1]:
sum_s.append(0)
else:
sum_s.append(img[k][m])
sum_s.sort()
return sum_s[(int(step*step/2)+1)]
def median_filter_go(img, n):
img1 = .deep(img)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
img1[i][j] = median_filter(i, j, n, img)
return img1
def mean_filter_go(img, n):
img1 = .deep(img)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
img1[i][j] = mean_filter(i, j, n, img)
return img1
完整main代碼如下:
if __name__ == "__main__":
# 讀入原始圖像
img = CV2.imread('joi.jpg')
# 灰度化處理
gray = CV2.cvtColor(img, CV2.COLOR_BGR2GRAY)
CV2.imwrite('img.png', gray)
rows = img.shape[0]
cols = img.shape[1]
cover = .deep(gray)
for i in range(rows):
for j in range(cols):
cover[i][j] = chng(cover[i][j])
CV2.imwrite('cover.png', cover)
covereq = hist_equal(cover)
CV2.imwrite('covereq.png', covereq)
covereqg = GaussianNoise(covereq, 2, 4, 0.8)
CV2.imwrite('covereqg.png', covereqg)
covereqps = PepperandSalt(covereq, 0.05)
CV2.imwrite('covereqps.png', covereqps)
meanimg3 = mean_filter_go(covereqps, 3)
CV2.imwrite('medimg3.png', meanimg3)
meanimg5 = mean_filter_go(covereqps, 5)
CV2.imwrite('meanimg5.png', meanimg5)
meanimg7 = mean_filter_go(covereqps, 7)
CV2.imwrite('meanimg7.png', meanimg7)
medimg3 = median_filter_go(covereqg, 3)
CV2.imwrite('medimg3.png', medimg3)
medimg5 = median_filter_go(covereqg, 5)
CV2.imwrite('medimg5.png', medimg5)
medimg7 = median_filter_go(covereqg, 7)
CV2.imwrite('medimg7.png', medimg7)
medimg4 = median_filter_go(covereqps, 7)
CV2.imwrite('medimg4.png', medimg4)
F. 直方圖均衡化
想像一下,如果一副圖像中的大多是像素點的像素值都集中在一個像素值范圍之內會怎樣呢?例如,如果一幅圖片整體很亮,那所有的像素值應該都會很高。但是一副高質量的圖像的像素值分布應該很廣泛。所以你應該把它的直方圖做一個橫向拉伸(如下圖),這就是直方圖均衡化要做的事情。通常情況下,這種操作會改善圖像的對比度。
這種方法通常用來增加許多圖像的全局 對比度 ,尤其是當圖像的有用數據的對比度相當接近的時候。通過這種方法, 亮度 可以更好地在直方圖上分布。這樣就可以用於增強局部的對比度而不影響整體的對比度,直方圖均衡化通過有效地擴展常用的亮度來實現這種功能。
這種方法對於背景和前景都太亮或者太暗的圖像非常有用,這種方法尤其是可以帶來 X光 圖像中更好的 骨骼 結構顯示以及曝光過度或者曝光不足 照片 中更好的細節。這種方法的一個主要優勢是它是一個相當直觀的技術並且是 可逆 操作,如果已知均衡化 函數 ,那麼就可以恢復原始的直方圖,並且計算量也不大。這種方法的一個缺點是它對處理的數據不加選擇,它可能會增加背景 雜訊 的對比度並且降低有用 信號 的對比度。
我們先來看看相應的直方圖和累積直方圖,然後使用 OpenCV 進行直方圖均衡化。
我們可以看出來直方圖大部分在灰度值較高的部分,而且分布很集中。而我們希望直方圖的分布比較分散,能夠涵蓋整個 x 軸。所以,我們就需要一個變換函數幫助我們把現在的直方圖映射到一個廣泛分布的直方圖中,這就是直方圖均衡化。
**限制對比度自適應性直方圖均衡化 CLAHE **
在上邊做的直方圖均衡化會改變整個圖像的對比度,但是在很多情況下,這樣做的效果並不好。的確在進行完直方圖均衡化之後,圖片背景的對比度被改變了。但是你再對比一下兩幅圖像中雕像的面圖,由於太亮我們丟失了很多信息。
原理:
為了解決這個問題,我們需要使用自適應的直方圖均衡化 CLAHE (Contrast Limited Adaptive Histogram Equalization)。這種情況下,整幅圖像會被分成很多小塊,這些小塊被稱為「tiles」(在 OpenCV 中 tileGridSize默認是 8x8),然後再對每一個小塊分別進行直方圖均衡化(跟前面類似)。所以在每一個的區域中,直方圖會集中在某一個小的區域中(除非有雜訊干擾)。如果有雜訊的話,雜訊會被放大。為了避免這種情況的出現,要使用對比度限制。
CLAHE中,每一個像素鄰域都要進行對比度限制,從而得到對應的變換函數,被用來降低AHE中雜訊的增強,這主要是通過限制AHE中的對比度增強來實現的。像素周圍鄰域雜訊的增強主要是由變換函數的斜率造成的,由於像素鄰域的雜訊與鄰域的CDF成正比,因此也與鄰域直方圖在該中心像素位置的值成正比,CLAHE之所舉仿以能夠限制對比度,是因為它在計算鄰域的CDF之前在指定閾值處對直方正辯纖圖進行了修剪,如下圖所示,這一做法不僅限制了CDF的斜率,也限制了變換函數的斜率,其中對直方圖進行切割所使用的閾值,被稱作修剪限制度(clip limit),這個參數不僅依賴於直方圖的歸一化,而且依賴於像素鄰域的size大小,通常設為3到4之間。
對於每個小塊來說,如果直方圖中的 bin 超過對灶明比度的上限的話,就把其中的像素點均勻分散到其他 bins 中,然後在進行直方圖均衡化。最後,為了去除每一個小塊之間「人造的」(由於演算法造成)邊界,再使用雙線性差值,與原圖做圖層濾色混合操作(可選)。
實現:
參考文獻:
網址: 直方圖均衡化
Adaptive_histogram_equalization
書籍:《數字圖像處理》《OpenCV-Python 中文教程》