Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 亚洲一区中文,欧美在线成人免费国产,99国产精品国产精品

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          「Python數(shù)據(jù)分析與可視化」期末復(fù)習(xí)筆記看完不掛

          「Python數(shù)據(jù)分析與可視化」期末復(fù)習(xí)筆記看完不掛科

          Python數(shù)據(jù)分析與可視化】期末復(fù)習(xí)筆記

          • 1. 數(shù)據(jù)分析與可視化概述
          • 5. Pandas數(shù)據(jù)載入與預(yù)處理
          • 10. SciPy科學(xué)計(jì)算基礎(chǔ)

          1. 數(shù)據(jù)分析與可視化概述

          • 數(shù)據(jù)分析 是一個(gè)探索性的過程,通常從特定的問題開始。它需要好奇心、尋找答案的欲望和很好的韌性,因?yàn)檫@些答案并不總是容易得到的。
          • 數(shù)據(jù)可視化 ,即數(shù)據(jù)的可視化展示。有效的可視化可顯著減少受眾處理信息和獲取有價(jià)值見解所需的時(shí)間。
          • 數(shù)據(jù)分析和數(shù)據(jù)可視化這兩個(gè)術(shù)語密不可分。在實(shí)際處理數(shù)據(jù)時(shí),數(shù)據(jù)分析先于可視化輸出,而可視化分析又是呈現(xiàn)有效分析結(jié)果的一種好方法。

          數(shù)據(jù)可視化:是關(guān)于數(shù)據(jù)視覺表現(xiàn)形式的科學(xué)技術(shù)研究。其中,這種數(shù)據(jù)的視覺表現(xiàn)形式被定義為“一種以某種概要形式抽提出來的信息,包括相應(yīng)信息單位的各種屬性和變量”。

          數(shù)據(jù)可視化主要是借助于圖形化手段,清晰有效地傳達(dá)與溝通信息。

          常用工具

          1. Microsoft Excel
          2. R語言
          3. Python語言
          4. SAS軟件
          5. SPSS
          6. 專用的可視化分析工具
          Power BI、Tableau、Gehpi和Echarts

          Python常用類庫

          1. Numpy
          2. SciPy
          3. Pandas
          4. Matplotlib
          5. Seaborn
          6. Scikit-learn

          Jupyter notebook中的常用快捷方式

          2. Python編程基礎(chǔ)

          Python是一個(gè)結(jié)合了 解釋性、編譯性、互動(dòng)性和面向?qū)ο?/strong> 的高級(jí)程序設(shè)計(jì)語言,結(jié)構(gòu)簡(jiǎn)單,語法定義清晰。Python最具特色的就是使用縮進(jìn)來表示代碼塊,不需要使用大括號(hào){}。縮進(jìn)的空格數(shù)是可變的,但是同一個(gè)代碼塊的語句必須包含相同的縮進(jìn)空格數(shù)。

          • Python3 中有六個(gè)標(biāo)準(zhǔn)的數(shù)據(jù)類型:Number(數(shù)字)、String(字符串)、List(列表)、Tuple(元組)、Set(集合)、Dictionary(字典)。其中, 不可變數(shù)據(jù)類型 有:Number、String、Tuple; 可變數(shù)據(jù)類型有 :List、Dictionary、Set。
          • Python3支持的數(shù)字類型有int(整數(shù))、float(浮點(diǎn)數(shù))、bool(布爾型)、complex(復(fù)數(shù))四種類型。
          • Python 中的變量是不需要聲明數(shù)據(jù)類型的,變量的“ 類型 ”是 所指的內(nèi)存中被賦值對(duì)象的類型
          • 同一變量可以反復(fù)賦值 ,而且可以是不同類型的變量,這也是Python語言稱之為動(dòng)態(tài)語言的原因。
          • 反斜杠為轉(zhuǎn)義符
          • 字典 中的鍵必須是唯一的,只能使用 不可變的對(duì)象 (比如字符串)來作為字典的鍵,字典中的鍵/值對(duì)是沒有順序的。
          • 集合 是一個(gè)由唯一元素組成的非排序集合體。也就是說,集合中的元素沒有特定順序, 集合中沒有重復(fù)項(xiàng) 。可以使用大括號(hào){ }或者set()函數(shù)創(chuàng)建集合,但是, 創(chuàng)建一個(gè)空集合必須用 set() ,因?yàn)閧 }是用來創(chuàng)建一個(gè)空字典。

          Python第三方包的安裝方式較多,本書建議采用以下方式進(jìn)行安裝和管理:

          (1)在CMD命令窗口中,使用conda命令進(jìn)行自動(dòng)下載安裝,用法如下:

          conda install <包名稱列表>   #安裝包
          conda remove <包名稱列表>  #卸載包
          conda search<搜索項(xiàng)>       #搜索包
          conda list                  #查看所有包
          conda update<包名稱>       #升級(jí)包

          (2)在CMD命令窗口中使用pip命令,用法如下:

          pip install <包名>            #安裝包  
          pip install--upgrade <包名>    #更新包
          pip uninstall <包名>          #刪除包

          也可以在 Jupyter notebook 的cell中運(yùn)行pip命令執(zhí)行相應(yīng)的命令,只需在命令前加“!”,如執(zhí)行 !pip install 包名 進(jìn)行包的安裝。

          esc 鍵切換為命令模式,按 enter 鍵進(jìn)入編輯模式

          3. NumPy數(shù)值計(jì)算基礎(chǔ)

          NumPy簡(jiǎn)介

          NumPy是在1995年誕生的Python庫 Numeric 的基礎(chǔ)上建立起來的,但真正促使NumPy的發(fā)行的是Python的SciPy庫。 但SciPy中并沒有合適的類似于Numeric中的對(duì)于基礎(chǔ)數(shù)據(jù)對(duì)象處理的功能 。于是,SciPy的開發(fā)者將SciPy中的一部分和Numeric的設(shè)計(jì)思想結(jié)合,在2005年發(fā)行了NumPy。

          NumPy是Python的一種開源的數(shù)值計(jì)算擴(kuò)展庫。它包含很多功能,如 創(chuàng)建n維數(shù)組(矩陣)、對(duì)數(shù)組進(jìn)行函數(shù)運(yùn)算、數(shù)值積分 等。 NumPy的誕生彌補(bǔ)了這些缺陷,它提供了兩種基本的對(duì)象:

          • ndarray:是儲(chǔ)存單一數(shù)據(jù)類型的多維數(shù)組。
          • ufunc:是一種能夠?qū)?shù)組進(jìn)行處理的函數(shù)。

          NumPy常用函數(shù)

          通常來說,ndarray是一個(gè)通用的同構(gòu)數(shù)據(jù)容器,即其中的所有元素都需要相同的類型。利用array函數(shù)可創(chuàng)建ndarray數(shù)組。

          • np.array(object, dtype,ndmin):利用array函數(shù)創(chuàng)建數(shù)組對(duì)象
            • ndmin:接收int,制定生成數(shù)組應(yīng)該具有的最小維數(shù),默認(rèn)為None
          • np.arange(start, stop, step, dtype):創(chuàng)建等差一維數(shù)組
            • step:步長(zhǎng),可省略,默認(rèn)步長(zhǎng)為1;
            • dtype:設(shè)置元素的數(shù)據(jù)類型,默認(rèn)使用輸入數(shù)據(jù)的類型。
          • linspace(start, end, count):創(chuàng)建等差數(shù)列
            • stop: 結(jié)束值;生成的元素不包括結(jié)束值
            • num:要生成的等間隔樣例數(shù)量
          • logspace(start, end, count):創(chuàng)建等比數(shù)列
            • start, stop代表的是10的冪,默認(rèn)基數(shù)base為10,第三個(gè)參數(shù)元素個(gè)數(shù)。
          • diag:創(chuàng)建對(duì)角矩陣,即對(duì)角線元素為0或指定值,其他元素為0
            • 格式: np.diag(v, k=0) :np.diag([1,2,3,4])
          • eye:創(chuàng)建一個(gè)對(duì)角線位置為1,其他位置全為0的矩陣
          • sort: axis=1 ,沿橫軸排序, axis=0 ,沿著縱軸排序.
          • argsort,lexsort:索引數(shù)組,索引值表示數(shù)據(jù)在新的序列中的位置.
          • tile(A, reps):實(shí)現(xiàn)數(shù)據(jù)重復(fù)
          • repeat(a, reps, axis=None)

          ndarray 對(duì)象屬性和數(shù)據(jù)轉(zhuǎn)換

          ndarray對(duì)象屬性及其說明:

          • ndim:返回?cái)?shù)組的軸的個(gè)數(shù)(秩)
          • shape:返回?cái)?shù)組的維度
          • size:返回?cái)?shù)組元素個(gè)數(shù)
          • dtype:返回?cái)?shù)據(jù)類型
          • itemsize:返回?cái)?shù)組中每個(gè)元素的字節(jié)大小

          生成隨機(jī)數(shù)

          在NumPy.random模塊中,提供了多種隨機(jī)數(shù)的生成函數(shù)。如randint函數(shù)生成指定范圍的隨機(jī)整數(shù)來構(gòu)成指定形狀的數(shù)組。

          np.random.randint(low, high=None, size=None)

          random模塊的常用隨機(jī)數(shù)生成函數(shù):

          數(shù)組變換

          數(shù)組重塑

          np.reshape(a, newshape, order='C')

          • a:需要處理的數(shù)據(jù)
          • newshape:新維度—整數(shù)或整數(shù)元組
          • reshape的參數(shù)中的其中一個(gè)可以設(shè)置為-1,表示數(shù)組的維度可以通過數(shù)據(jù)本身來推斷

          數(shù)據(jù)散開(ravel)

          數(shù)據(jù)扁平化(flatten)

          數(shù)據(jù)重塑不會(huì)改變?cè)瓉淼臄?shù)組.

          數(shù)組合并

          • hstack:左右并在一起
          • vstack:上下并在一起
          • concatenate: axis=1 :按行橫向合并, axis=0 :按列縱向合并.
          • hsplit:橫向分割(縱著切),橫相對(duì)于數(shù)組本身而言
          • vsplit:縱向分割(橫著切)
          • split: axis=1 :按行橫向分割, axis=0 :按列縱向分割.

          數(shù)組轉(zhuǎn)置和軸對(duì)換

          • 數(shù)組轉(zhuǎn)置是數(shù)組重塑 的一種特殊形式,可以通過 transpose 方法進(jìn)行轉(zhuǎn)置。

          數(shù)組的切片返回的是原始數(shù)組的視圖,不會(huì)產(chǎn)生新的數(shù)據(jù),如果需要的并非視圖而是要復(fù)制數(shù)據(jù),則可以通過 copy 方法實(shí)現(xiàn)。

          ufunc函數(shù)的廣播機(jī)制

          • ufunc函數(shù):通用函數(shù),是一種能夠?qū)?shù)組中所有的元素進(jìn)行操作的函數(shù),比math庫更快
            • np.any函數(shù)表示邏輯“or”
            • np.all函數(shù)表示邏輯“and”, 運(yùn)算結(jié)果返回布爾值

          廣播(broadcasting)是指不同形狀的數(shù)組之間執(zhí)行算術(shù)運(yùn)算的方式。

          需要遵循4個(gè)原則:

          1. 讓所有輸入數(shù)組都向其中shape最長(zhǎng)的數(shù)組看齊,shape中不足的部分都通過在左邊加1補(bǔ)齊。
          2. 如果兩個(gè)數(shù)組的形狀在任何一個(gè)維度上都不匹配,那么數(shù)組的形狀會(huì)沿著維度為1的維度進(jìn)行擴(kuò)展,以匹配另一個(gè)數(shù)組的形狀。
          3. 輸出數(shù)組的shape是輸入數(shù)組shape的各個(gè)軸上的最大值。
          4. 如果兩個(gè)數(shù)組的形狀在任何一個(gè)維度上都不匹配,并且沒有任何一個(gè)維度等于1,則引發(fā)異常。

          條件邏輯運(yùn)算

          • where的用法:np.where(condition, x, y)滿足條件(condition),輸出x,不滿足則輸出y。
          w=np.array([2,5,6,3,10])
          np.where(w>4)
          (array([1, 2, 4], dtype=int64),)

          where中 若只有條件 (condition),沒有x和y,則輸出滿足條件元素的 坐標(biāo) 。這里的坐標(biāo)以tuple的形式給出,通常原數(shù)組有多少維,輸出的tuple中就包含幾個(gè)數(shù)組,分別對(duì)應(yīng)符合條件元素的各維坐標(biāo)。

          讀寫二進(jìn)制文件

          • NumPy提供了多種文件操作函數(shù)存取數(shù)組內(nèi)容。
          • 文件存取的格式分為兩類:二進(jìn)制和文本。而二進(jìn)制格式的文件又分為NumPy專用的格式化二進(jìn)制類型和無格式類型。
          • NumPy中讀寫二進(jìn)制文件的方法有:np.load(“文件名.npy")是從二進(jìn)制文件中讀取數(shù)據(jù);np.save(“文件名[.npy]", arr) 是以二進(jìn)制格式保存數(shù)據(jù)。
          • 讀寫文本文件np.loadtxt("…/tmp/arr.txt",delimiter=“,”)把文件加載到一個(gè)二維數(shù)組中;np.savetxt("…/tmp/arr.txt", arr, fmt=“%d”, delimiter=“,”)是將數(shù)組寫到某種分隔符隔開的文本文件中;np.genfromtxt("…/tmp/arr.txt", delimiter=“,”)是結(jié)構(gòu)化數(shù)組和缺失數(shù)據(jù)。
          • 讀取CSV文件np.loadtxt(fname, dtype=, comments=’#’, delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding=‘bytes’)

          排序

          Sort函數(shù)對(duì)數(shù)據(jù)直接進(jìn)行排序, 調(diào)用改變?cè)紨?shù)組 ,無返回值。

          • 格式: numpy.sort(a, axis, kind, order)order:排序的字段名,可指定字段排序,默認(rèn)為Noneaxis:axis=1為沿橫軸排序;axis=0為沿縱軸排序;axis=None,將數(shù)組平坦化之后進(jìn)行排序
          • np.argsort函數(shù)和np.lexsort函數(shù)根據(jù)一個(gè)或多個(gè)鍵值對(duì)數(shù)據(jù)集進(jìn)行排序。np.argsort(): 返回的是數(shù)組值從小到大的索引值;np.lexsort(): 返回值是按照最后一個(gè)傳入數(shù)據(jù)排序的結(jié)果。
          arr=np.array([7,9,5,2,9,4,3,1,4,3])
          print('原數(shù)組:',arr)
          print('排序后:',arr.argsort())
          #返回值為數(shù)組排序后的下標(biāo)排列
          print('顯示較大的5個(gè)數(shù):',arr[arr.argsort()][-5:])
          
          原數(shù)組: [7 9 5 2 9 4 3 1 4 3]
          排序后: [7 3 6 9 5 8 2 0 1 4]
          顯示較大的5個(gè)數(shù): [4 5 7 9 9]
          a=[1,5,1,4,3,4,4]
          b=[9,4,0,4,0,2,1]
          # 先按照a排序,如果a有相同的數(shù)按照b排序
          ind=np.lexsort((b,a)) #sort by a,then by b
          print('ind:',ind)
          tmp=[(a[i],b[i])for i in ind]
          print('tmp:',tmp)
          ind: [2 0 4 6 5 3 1]
          tmp: [(1, 0), (1, 9), (3, 0), (4, 1), (4, 2), (4, 4), (5, 4)]

          重復(fù)數(shù)據(jù)與去重

          • 在NumPy中,對(duì)于一維數(shù)組或者列表,unique函數(shù)去除其中重復(fù)的元素,并按元素由大到小返回一個(gè)新的元組或者列表。
          • 統(tǒng)計(jì)分析中有時(shí)也需要把一個(gè)數(shù)據(jù)重復(fù)若干次,使用tile和repeat函數(shù)即可實(shí)現(xiàn)此功能。
            • tile函數(shù)的格式:np.tile(A, reps)
              其中,參數(shù)A表示要重復(fù)的數(shù)組,reps表示重復(fù)次數(shù)。
            • repeat函數(shù)的格式:np.repeat(A, reps, axis=None)
              “a”: 是需要重復(fù)的數(shù)組元素,
              “repeats”: 是重復(fù)次數(shù),
              “axis”: 指定沿著哪個(gè)軸進(jìn)行重復(fù),axis=0表示按行進(jìn)行元素重復(fù);axis=1表示按列進(jìn)行元素重復(fù)。

          常用統(tǒng)計(jì)函數(shù)

          NumPy中提供了很多用于統(tǒng)計(jì)分析的函數(shù),常見的有 sum、mean、std、var、min和max 等。

          • 幾乎所有的統(tǒng)計(jì)函數(shù)在針對(duì)二維數(shù)組的時(shí)候需要注意軸的概念。
          • axis=0時(shí)表示沿著縱軸進(jìn)行計(jì)算,axis=1時(shí)沿橫軸進(jìn)行計(jì)算。
          Numpy中數(shù)組的方法sort、argsort和lexsort分別是指  ___、 將___和___ 
          直接排序x中的元素從小到大排列,提取其對(duì)應(yīng)的index(索引)對(duì)數(shù)組或列表按照某一行或列進(jìn)行排序

          4. Pandas統(tǒng)計(jì)分析

          Pandas(Python Data Analysis Library)是基于NumPy的數(shù)據(jù)分析模塊,它提供了大量標(biāo)準(zhǔn)數(shù)據(jù)模型和高效操作大型數(shù)據(jù)集所需的工具, 可以說Pandas是使得Python能夠成為高效且強(qiáng)大的數(shù)據(jù)分析環(huán)境的重要因素之一 。

          Pandas有三種數(shù)據(jù)結(jié)構(gòu):Series、DataFrame和Panel。

          • Series類似于一維數(shù)組;
          • DataFrame是類似表格的二維數(shù)組;
          • Panel可以視為Excel的多表單Sheet
          • DataFrame是一個(gè)表格型的數(shù)據(jù)結(jié)構(gòu) ,它含有一組有序的列,每列可以是不同的值類型(數(shù)值、字符串、布爾值等)。
          • DataFrame 是一個(gè)表格型的數(shù)據(jù)結(jié)構(gòu),它含有一組有序的列,每列可以是不同的值類型(數(shù)值、字符串、布爾值等)。
          • Series索引的修改: obj.index=['Bob', 'Steve', 'Jeff', 'Ryan']
          • 索引對(duì)象負(fù)責(zé)管理軸標(biāo)簽和其他元數(shù)據(jù),不能進(jìn)行修改,保證數(shù)據(jù)結(jié)構(gòu)之間的安全共享。
          • 重建索引是指對(duì)索引重新排序而不是重新命名 ,如果某個(gè)索引值不存在的話,會(huì)引入缺失值。
          • reindex:默認(rèn)對(duì)行進(jìn)行重建索引.
            • index:用于索引的新序列
            • method:插值(填充)方式
            • fill_value:缺失值替換值
            • limit:最大填充量
            • level copy:在Multiindex的指定級(jí)別上匹配簡(jiǎn)單索引,否則選取其子集,默認(rèn)為True,無論如何都復(fù)制;如果為False,則新舊相等時(shí)就不復(fù)制
          • rename:修改列名
          • 如果不希望使用默認(rèn)的行索引,則可以在創(chuàng)建的時(shí)候通過Index參數(shù)來設(shè)置。
          • 在DataFrame數(shù)據(jù)中,如果希望將列數(shù)據(jù)作為索引,則可以通過 set_index 方法來實(shí)現(xiàn)。

          DataFrame的屬性

          data.rename(columns=({
           'total_bill':'消費(fèi)總額','tip':'小費(fèi)','sex':'性別','smoker':'是否抽煙',
                                 'day':'星期','time':'聚餐時(shí)間段','size':'人數(shù)'}),inplace=True)
          fdata['是否抽煙']===fdata.是否抽煙
          • 查詢抽煙男性中人均消費(fèi)大于15的數(shù)據(jù):
          data.query( '是否抽煙=="Yes" & 性別=="Male" & 人均消費(fèi)>15')
          • 刪除性別或者聚餐時(shí)間為空的行:
          data.dropna(subset=['性別','聚餐時(shí)間段'],inplace=True)
          data.isnull().sum()
          • 增加一行直接通過append方法傳入字典結(jié)構(gòu)數(shù)據(jù)即可。 df.append(data, ignore_index=True)
          • 增加列時(shí),只需為要增加的列賦值即可創(chuàng)建一個(gè)新的列。若要指定新增列的位置,可以用insert函數(shù)。
          • unique():是以數(shù)組形式(numpy.ndarray)返回列的所有唯一值(特征的所有唯一值)
          • nunique():返回dataframe中列的唯一值的個(gè)數(shù),也可用于series
          • DataFrame.replace(to_replace=None,value=None,inplace=False,limit=None,regex=False,method='pad')

          函數(shù)應(yīng)用和映射

          df.apply(np.mean)
          data.dpplymap(lambda x:'%.3f'%x)
          

          對(duì)于DataFrame數(shù)據(jù)排序,通過指定軸方向,使用 sort_index 函數(shù)對(duì)行或列索引進(jìn)行排序。如果要進(jìn)行列排序,則通過 sort_values 函數(shù)把列名傳給by參數(shù)即可。

          df.sum() # 按列進(jìn)行求和
          df.sum(axis=1)  # 按行進(jìn)行求和

          匯總與統(tǒng)計(jì)

          利用 describe 方法會(huì)對(duì)每個(gè)數(shù)值型的列數(shù)據(jù)進(jìn)行統(tǒng)計(jì)

          Pandas中常用的描述性統(tǒng)計(jì)量:

          對(duì)于類別型特征的描述性統(tǒng)計(jì),可以使用頻數(shù)統(tǒng)計(jì)表。Pandas庫中通過unique方法獲取不重復(fù)的數(shù)組,利用value_counts方法實(shí)現(xiàn)頻數(shù)統(tǒng)計(jì)。

          數(shù)據(jù)分組

          groupby方法的參數(shù)及其說明:

          1. 按Series對(duì)象(具體數(shù)據(jù))分組
          2. 按列名分組DataFrame數(shù)據(jù)的列索引名可以作為分組鍵,但需要注意的是用于分組的對(duì)象必須是DataFrame數(shù)據(jù)本身,否則搜索不到索引名稱會(huì)報(bào)錯(cuò)。
          3. 按列表或元組分組分組鍵還可以是長(zhǎng)度和DataFrame行數(shù)相同的列表或元組,相當(dāng)于將列表或元組看做DataFrame的一列,然后將其分組。
          4. 按字典分組如果原始的DataFrame中的分組信息很難確定或不存在,可以通過字典結(jié)構(gòu),定義分組信息。
          5. 按函數(shù)分組函數(shù)作為分組鍵的原理類似于字典,通過映射關(guān)系進(jìn)行分組,但是函數(shù)更加靈活。
          data.groupby(data.map(judge)),sum()

          數(shù)據(jù)聚合

          使用agg方法聚合數(shù)據(jù)

          • agg、aggregate方法都支持對(duì)每個(gè)分組應(yīng)用某個(gè)函數(shù),包括Python內(nèi)置函數(shù)或自定義函數(shù)。同時(shí),這兩個(gè)方法也能夠直接對(duì)DataFrame進(jìn)行函數(shù)應(yīng)用操作。
          • 在正常使用過程中,agg和aggregate函數(shù)對(duì)DataFrame對(duì)象操作的功能基本相同,因此只需掌握一個(gè)即可。

          分組運(yùn)算

          1. transform方法通過transform方法可以將運(yùn)算分布到每一行。
          2. 使用apply方法聚合數(shù)據(jù)apply方法類似于agg方法,能夠?qū)⒑瘮?shù)應(yīng)用于每一列。

          數(shù)據(jù)透視表(Pivot Table)是數(shù)據(jù)分析中常見的工具之一,根據(jù)一個(gè)或多個(gè)鍵值對(duì)數(shù)據(jù)進(jìn)行聚合,根據(jù)列或行的分組鍵將數(shù)據(jù)劃分到各個(gè)區(qū)域。

          pivot_table 函數(shù)格式:

          pivot_table(data, values=None, index=None, columns=None, 
          		aggfunc='mean', fill_value=None, margins=False, 
          		dropna=True, margins_name='All')

          交叉表是一種特殊的透視表,主要用于計(jì)算分組頻率。

          crosstab的格式:

          crosstab(index, columns, values=None, 
          		rownames=None, colnames=None, 
          		aggfunc=None, 
          		margins=False, dropna=True, normalize=False)

          直方圖和密度圖

          • 直方圖用于頻率分布,y軸為數(shù)值或比率。繪制直方圖,可以觀察數(shù)據(jù)值的大致分布規(guī)律。pandas中的直方圖可以通過hist方法繪制。
          • 核密度估計(jì)是對(duì)真實(shí)密度的估計(jì),其過程是將數(shù)據(jù)的分布近似為一組核(如正態(tài)分布)。通過plot函數(shù)的kind=‘kde’可以進(jìn)行繪制。

          散點(diǎn)圖主要用來表現(xiàn)數(shù)據(jù)之間的規(guī)律。

          • 通過plot函數(shù)的kind='scatter’可以進(jìn)行繪制。

          Pandas的數(shù)據(jù)對(duì)象在進(jìn)行算術(shù)運(yùn)算時(shí)如果存在不同索引會(huì)進(jìn)行數(shù)據(jù)對(duì)齊,但會(huì)引入NAN值

          5. Pandas數(shù)據(jù)載入與預(yù)處理

          對(duì)于數(shù)據(jù)分析而言,數(shù)據(jù)大部分來源于外部數(shù)據(jù),如常用的CSV文件、Excel文件和數(shù)據(jù)庫文件等。Pandas庫將外部數(shù)據(jù)轉(zhuǎn)換為DataFrame數(shù)據(jù)格式,處理完成后再存儲(chǔ)到相應(yīng)的外部文件中。

          1.文本文件讀取

          文本文件是一種由若干行字符構(gòu)成的計(jì)算機(jī)文件,它是一種典型的順序文件。

          • txt文件:是Windows操作系統(tǒng)上附帶的一種文本格式,文件以.txt為后綴。
          • CSV文件:是Comma-Separated Values的縮寫,用半角逗號(hào)(’,’)作為字段值的分隔符。

          Pandas中使用read_table來讀取文本文件:

          pandas.read_table(filepath_or_buffer, sep=’\t’, 
          	header=’infer’, names=None, index_col=None, 
          	dtype=None, engine=None, nrows=None)

          Pandas中使用read_csv函數(shù)來讀取CSV文件:

          pandas.read_csv(filepath_or_buffer, sep=’,’, 
          	header=’infer’, names=None, index_col=None, 
          	dtype=None, engine=None, nrows=None)

          2. 文本文件的存儲(chǔ)

          DataFrame.to_csv(path_or_buf=None, sep=’,’, na_rep, 
          	columns=None, header=True, index=True, index_label=None, 
          	mode=’w’, encoding=None)

          1. Excel文件的讀取

          pandas.read_excel(io, sheetname, header=0, 
          	index_col=None, names=None, dtype)

          JSON數(shù)據(jù)的讀取與存儲(chǔ)

          JSON(JavaScript Object Notation) 數(shù)據(jù)是一種輕量級(jí)的數(shù)據(jù)交換格式,因其簡(jiǎn)潔和清晰的層次結(jié)構(gòu)使其成為了理想的數(shù)據(jù)交換語言。JSON數(shù)據(jù)使用大括號(hào)來區(qū)分表示并存儲(chǔ)。

          1. Pandas讀取JSON數(shù)據(jù)

          Pandas通過read_json函數(shù)讀取JSON數(shù)據(jù)。讀取代碼如下:

          import pandas as pd
          df=pd.read_json(‘FileName’)
          df=df.sort_index

          2. JSON數(shù)據(jù)的存儲(chǔ)

          Pandas使用 pd.to_json 實(shí)現(xiàn)將DataFrame數(shù)據(jù)存儲(chǔ)為JSON文件。

          讀取數(shù)據(jù)庫文件

          1. Pandas讀取Mysql數(shù)據(jù)要讀取Mysql中的數(shù)據(jù),首先要安裝Mysqldb包。
          import pandas as pd
          import MySQLdb
          conn=MySQLdb.connect(host=host,port=port,user=username,passwd=password,db=db_name) 
          df=pd.read_sql('select * from table_name',con=conn)  conn.close()
          1. Pandas讀取SQL sever中的數(shù)據(jù),首先要安裝pymssql包。
          import pandas as pd
          import pymssql
          conn=pymssql.connect(host=host, port=port ,user=username, password=password, database=database) 
          df=pd.read_sql("select * from table_name",con=conn)  conn.close()

          數(shù)據(jù)合并

          merge函數(shù)是通過一個(gè)或多個(gè)鍵將兩個(gè)DataFrame按行合并起來,與SQL中的 join 用法類似,Pandas中的數(shù)據(jù)合并merge( )函數(shù)格式如下:

          merge合并時(shí)默認(rèn)是 內(nèi)連接 (inner),即返回交集。通過how參數(shù)可以選擇連接方法:左連接(left),右連接(right)和外連接(outer)。

          在合并時(shí)會(huì)出現(xiàn)重復(fù)列名,雖然可以人為進(jìn)行重復(fù)列名的修改,但 merge 函數(shù)提供了 suffixes 用于處理該問題:

          concat數(shù)據(jù)連接:

          如果要合并的 DataFrame 之間沒有連接鍵,就無法使用merge方法。pandas中的concat方法可以實(shí)現(xiàn),默認(rèn)情況下會(huì)按行的方向堆疊數(shù)據(jù)。如果在列向上連接設(shè)置axies=1即可。

          combine_first合并數(shù)據(jù)

          如果需要合并的兩個(gè)DataFrame存在重復(fù)索引,則使用merge和concat都無法正確合并,此時(shí)需要使用combine_first方法。

          檢測(cè)與處理缺失值

          1. 缺失值統(tǒng)計(jì)data.info()
          2. 刪除缺失值df.dropna()

          填充缺失值

          缺失值所在的特征為數(shù)值型時(shí),通常利用其均值、中位數(shù)和眾數(shù)等描述其集中趨勢(shì)的統(tǒng)計(jì)量來填充;缺失值所在特征為類別型數(shù)據(jù)時(shí),則選擇眾數(shù)來填充。

          在DataFrame中利用duplicates方法判斷各行是否有重復(fù)數(shù)據(jù)。 duplicates 方法返回一個(gè)布爾值的series,反映每一行是否與之前的行重復(fù)。

          Pandas通過drop_duplicates刪除重復(fù)的行,格式為:

          drop_duplicates(self, subset=None, keep=’first’, inplace=False)

          檢測(cè)異常值

          簡(jiǎn)單的數(shù)據(jù)統(tǒng)計(jì)方法中常用散點(diǎn)圖、箱線圖和3σ法則檢測(cè)異常值。

          • 散點(diǎn)圖方法: 通過數(shù)據(jù)分布的散點(diǎn)圖發(fā)現(xiàn)異常數(shù)據(jù)。
          • 箱線圖分析: 利用數(shù)據(jù)中的五個(gè)統(tǒng)計(jì)量(最小值、下四分位數(shù)、中位數(shù)、上四分位數(shù)和最大值)來描述數(shù)據(jù)。
          • 3σ法則: 在3σ原則下,異常值被定義為一組測(cè)定值中與平均值的偏差超過3倍標(biāo)準(zhǔn)差的值。

          散點(diǎn)圖方法: 通過數(shù)據(jù)分布的散點(diǎn)圖發(fā)現(xiàn)異常數(shù)據(jù)。

          箱線圖利用數(shù)據(jù)中的五個(gè)統(tǒng)計(jì)量(最小值、下四分位數(shù)、中位數(shù)、上四分位數(shù)和最大值)來描述數(shù)據(jù),它也可以粗略地看出數(shù)據(jù)是否具有對(duì)稱性、分布的分散程度等信息。

          若數(shù)據(jù)服從正態(tài)分布,在3σ原則下,異常值被定義為一組測(cè)定值中與平均值的偏差超過3倍標(biāo)準(zhǔn)差的值,因?yàn)樵谡龖B(tài)分布的假設(shè)下,距離平均值3σ之外的值出現(xiàn)的概率小于0.003。因此根據(jù)小概率事件,可以認(rèn)為超出3σ之外的值為異常數(shù)據(jù)。

          離差標(biāo)準(zhǔn)化數(shù)據(jù)

          離差標(biāo)準(zhǔn)化是對(duì)原始數(shù)據(jù)所做的一種線性變換,將原始數(shù)據(jù)的數(shù)值映射到[0,1]區(qū)間。轉(zhuǎn)換公式如下所示。

          標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化數(shù)據(jù)

          標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化又稱零均值標(biāo)準(zhǔn)化或z分?jǐn)?shù)標(biāo)準(zhǔn)化,是當(dāng)前使用最廣泛的數(shù)據(jù)標(biāo)準(zhǔn)化方法。

          啞變量( Dummy Variables)是用以反映質(zhì)的屬性的一個(gè)人工變量,是量化了的自變量,通常取值為0或1。

          • 利用pandas庫中的get_dummies函數(shù)對(duì)類別型特征進(jìn)行啞變量處理。

          連續(xù)型變量的離散化

          1. 等寬法Pandas提供了cut函數(shù),可以進(jìn)行連續(xù)型數(shù)據(jù)的等寬離散化。

          1. 等頻法cut函數(shù)雖然不能夠直接實(shí)現(xiàn)等頻離散化,但可以通過定義將相同數(shù)量的記錄放進(jìn)每個(gè)區(qū)間。
          2. 聚類分析法一維聚類的方法包括兩步,首先將連續(xù)型數(shù)據(jù)用聚類算法進(jìn)行聚類,然后處理聚類得到的簇,為合并到一個(gè)簇的連續(xù)型數(shù)據(jù)做同一標(biāo)記。

          簡(jiǎn)述Python中利用數(shù)據(jù)統(tǒng)計(jì)方法檢測(cè)異常值的常用方法及其原理。

          散點(diǎn)圖 箱線圖分析 3σ法則,

          6. Matplotlib可視化

          • Matplotlib 是一個(gè)在 python 下實(shí)現(xiàn)的類 matlab 的純 python 的第三方庫,旨在用 python實(shí)現(xiàn) matlab 的功能,是python下最出色的繪圖庫。其風(fēng)格跟 matlab 相似,同時(shí)也繼承了 python 的簡(jiǎn)單明了。
          • 要使用matplotlib得先安裝 numpy 庫 (一個(gè)python下數(shù)組處理的第三方庫,可以很方便的處理矩陣,數(shù)組) 。
          • matplotlib 對(duì)于圖像美化方面比較完善,可以自定義線條的顏色和樣式,可以在一張繪圖紙上繪制多張小圖,也可以在一張圖上繪制多條線, 可以很方便地將數(shù)據(jù)可視化并對(duì)比分析。

          在Jupyter notebook中進(jìn)行交互式繪圖,需要執(zhí)行一下語句 % matplotlib notebook

          相關(guān)函數(shù)簡(jiǎn)介

          figure():創(chuàng)建一個(gè)新的繪圖窗口。
          figtext():為figure添加文字 
          axes():為當(dāng)前figure添加一個(gè)坐標(biāo)軸
          plot():繪圖函數(shù)
          polar():繪制極坐標(biāo)圖
          axis():獲取或設(shè)置軸屬性的邊界方法(坐標(biāo)的取值范圍)
          clf   : 清除當(dāng)前figure窗口          cla  : 清除當(dāng)前axes窗口
          close      : 關(guān)閉當(dāng)前figure窗口
          subplot    : 一個(gè)圖中包含多個(gè)axes
          text(): 在軸上添加文字
          title(): 設(shè)置當(dāng)前axes標(biāo)題
          xlabel/ylabel:設(shè)置當(dāng)前X軸或Y軸的標(biāo)簽
          hist():繪制直方圖
          hist2d():繪制二維在直方圖
          hold      :設(shè)置當(dāng)前圖窗狀態(tài);off或者on
          imread():讀取一個(gè)圖像,從圖形文件中提取數(shù)組
          legend():為當(dāng)前axes放置標(biāo)簽
          pie():繪制餅狀圖
          scatter():做一個(gè)X和Y的散點(diǎn)圖,其中X和Y是相同長(zhǎng)度的序列對(duì)象
          stackplot():繪制一個(gè)堆疊面積圖
          acorr():繪制X的自相關(guān)函數(shù)
          annotate():用箭頭在指定的數(shù)據(jù)點(diǎn)創(chuàng)建一個(gè)注釋或一段文本
          bar():繪制垂直條形圖		 barh():繪制橫向條形圖
          barbs():繪制一個(gè)倒鉤的二維場(chǎng)

          創(chuàng)建子圖

          創(chuàng)建子圖

          import matplotlib.pyplot as plt
          fig=plt.figure()
          #不能使用空白的figure繪圖,需要?jiǎng)?chuàng)建子圖
          ax1=fig.add_subplot(2,2,1)
          ax2=fig.add_subplot(2,2,2)
          ax3=fig.add_subplot(2,2,3)

          可以用語句 Fig , axes=plt.subplots(2,3) 創(chuàng)建一個(gè)新的圖片,然后返回包含了已生成子圖對(duì)象的NumPy數(shù)組。數(shù)組axes可以像二維數(shù)組那樣方便地進(jìn)行索引,如 axes[0,1] 。也可以通過sharex和sharey表明子圖分別擁有相同的x軸和y軸。

          fig, axes=plt.subplots(2,3)

          調(diào)整子圖周圍的間距: plt.subplots_adjust(wspace=0,hspace=0)

          • plt.savafig :保存繪制的圖片,可以指定圖片的分辨率、邊緣的顏色等參數(shù)。

          設(shè)置pyplot的動(dòng)態(tài)rc參數(shù)

          • pyplot使用rc配置文件來自定義圖形的各種默認(rèn)屬性,被稱為rc配置或rc參數(shù)。
          • 在pyplot中幾乎所有的默認(rèn)屬性都是可以控制的,例如視圖窗口大小以及每英寸點(diǎn)數(shù)、線條寬度、顏色和樣式、坐標(biāo)軸、坐標(biāo)和網(wǎng)格屬性、文本、字體等。

          查看matplotlib的rc參數(shù):

          import matplotlib as plt 
          print(plt.rc_params())
          常用參數(shù):
          Axes:設(shè)置坐標(biāo)軸邊界、顏色、坐標(biāo)
          刻度值大小和網(wǎng)格的顯示;
          Figure:設(shè)置邊界顏色、圖形大小和子區(qū);
          Font:設(shè)置字號(hào)、字體和樣式;
          Grid:設(shè)置網(wǎng)格顏色和線型;
          Legend:設(shè)置圖例和其中的文本顯示;
          Lines:設(shè)置線條顏色、寬度、線型等;
          Savefig:對(duì)保存圖像進(jìn)行單獨(dú)設(shè)置;
          Xtick和ytick:X、Y軸的主刻度和次刻度設(shè)置顏色、大小、方向和標(biāo)簽大小。

          import numpy as np
          import matplotlib.pyplot as plt
          fig,ax=plt.subplots()
          plt.rcParams['font.family']=['SimHei']#用來顯示中文標(biāo)簽
          plt.rcParams['axes.unicode_minus']=False  #用來正常顯示負(fù)號(hào)

          繪圖的填充

          調(diào)用函數(shù)fill_between() 實(shí)現(xiàn)曲線下面部分的填充:

          plt.fill_between(x, 0, y, facecolor='green', alpha=0.3)
          x:第一個(gè)參數(shù)表示覆蓋的區(qū)域, x,表示整個(gè)x都覆蓋
          0:表示覆蓋的下限
          y:表示覆蓋的上限是y這個(gè)曲線
          facecolor:覆蓋區(qū)域的顏色
          alpha:覆蓋區(qū)域的透明度[0,1],其值越大,表示越不透明

          繪圖注釋

          繪圖時(shí)有時(shí)需要在圖表中加文本注解

          這時(shí)可以通過text函數(shù)在指定的位置(x,y)加入文本注解;

          通過 annotate() 在指定位置實(shí)現(xiàn)指向型注釋。

          1. 指向型注釋annotate()
          2. 無指向型注釋text()

          boxplot函數(shù)

          箱線圖利用數(shù)據(jù)中的五個(gè)統(tǒng)計(jì)量(最小值、下四分位數(shù)、中位數(shù)、上四分位數(shù)和最大值)來描述數(shù)據(jù),它也可以粗略地看出數(shù)據(jù)是否具有對(duì)稱性、分布的分散程度等信息,特別可以用于對(duì)幾個(gè)樣本的比較。

          雷達(dá)圖也稱為網(wǎng)絡(luò)圖,星圖,蜘蛛網(wǎng)圖,不規(guī)則多邊形,極坐標(biāo)圖等。雷達(dá)圖是以從同一點(diǎn)開始的軸上表示的三個(gè)或更多個(gè)定量變量的二維圖表的形式顯示多變量數(shù)據(jù)的圖形方法。軸的相對(duì)位置和角度通常是無信息的。雷達(dá)圖相當(dāng)于平行坐標(biāo)圖,軸徑向排列。

          繪制詞云

          (1)WordCloud 
          (2)jieba
          conda install -c conda-forge jieba

          一般生成詞云的過程為:

          (1)首先使用pandas讀取數(shù)據(jù)并將需要分析的數(shù)據(jù)轉(zhuǎn)化為列表;

          (2)對(duì)獲得的列表數(shù)據(jù)利用分詞工具jieba進(jìn)行遍歷分詞;

          (3)使用WordCloud設(shè)置詞云圖片的屬性、掩碼和停用詞,并生成詞云圖像。

          簡(jiǎn)述Matplotlib全局參數(shù)定制的方法。

          查找到當(dāng)前用戶的配置文件目錄,然后用編輯器打開,修改matplotlibrc文件,即可修改配置參數(shù)。

          annotate()
          text()
          

          7. Seaborn

          • Matplotlib 的API比較底層。雖然可以實(shí)現(xiàn)復(fù)雜的統(tǒng)計(jì)數(shù)據(jù)可視化,但是通常都需要寫大量的樣板代碼;
          • Matplotlib 不支持Pandas的DataFrame數(shù)據(jù)的可視化,必須先提取每個(gè)Series。

          Matplotlib繪圖基本模仿MATLAB繪圖庫,其繪圖風(fēng)格和MATLAB類似。由于MATLAB繪圖風(fēng)格偏古典,因此, Python開源社區(qū)開發(fā)了Seaborn繪圖模塊,對(duì)Matplotlib進(jìn)行封裝,繪圖效果更符合現(xiàn)代人的審美 。

          Seaborn屬于Matplotlib的一個(gè)高級(jí)接口,使得作圖更加容易。在多數(shù)情況下使用Seaborn能做出很具吸引力的圖,而使用Matplotlib可以制作具有更多特色的圖。 應(yīng)該把Seaborn視為Matplotlib的補(bǔ)充,而不是替代物

          Seaborn通過set函數(shù)實(shí)現(xiàn)風(fēng)格設(shè)置繪圖的背景色、風(fēng)格、字型、字體:

          seaborn.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=True, rc=None)
          • set_style():設(shè)置主題的,darkgrid, whitegrid,dark,white,和 ticks(四周都有刻度線的白背景),默認(rèn)為darkgrid。

          主題設(shè)置

          Seaborn將matplotlib的參數(shù)劃分為兩個(gè)獨(dú)立的組合。第一組是 設(shè)置繪圖的外觀風(fēng)格 的,第二組主要 將繪圖的各種元素按比例縮放的 ,以至可以嵌入到不同的背景環(huán)境中。控制這些參數(shù)的接口主要有兩對(duì)方法:

          • 控制風(fēng)格: axes_style(), set_style()
          • 縮放繪圖: plotting_context(), set_context()
          • despine() :移除繪圖中頂部和右側(cè)的軸線offset 參數(shù)講軸線進(jìn)行偏置,另外,當(dāng)刻度沒有完全覆蓋整個(gè)坐標(biāo)軸的的范圍時(shí),利用trim參數(shù)限制已有坐標(biāo)軸的范圍。
          despine()控制哪個(gè)脊柱將被移除。
          sinplot()
          sns.despine(left=True)

          除了選用預(yù)設(shè)的風(fēng)格外,可以利用with 語句使用 axes_style() 方法設(shè)置臨時(shí)繪圖參數(shù)。

          with sns.axes_style("darkgrid"):
              plt.subplot(2,1,1)
              sinplot( )
          plt.subplot(2,1, 2)
          sinplot(-1)

          seaborn中通過 set_context() 設(shè)置縮放參數(shù),預(yù)設(shè)的參數(shù)有 paper, notebook, talk, poster 。默認(rèn)為 notebook。“paper”、“talk”和“poster”

          使用 distplot 方法繪制的直方圖與matplotlib是類似的。在 distplot 的參數(shù)中,可以選擇不繪制密度圖。其中的 rug 參數(shù)繪制 毛毯圖 ,可以為每個(gè)觀測(cè)值繪制小細(xì)線(邊際毛毯),也可以單獨(dú)用 rugplot 進(jìn)行繪制。

          如果設(shè)置 histFalse ,則可以直接繪制密度圖而沒有直方圖。

          sns.distplot(df_iris['Petal.Width'],hist=False,rug=True)

          • kdeplot():繪制密度圖
          • rugplot():繪制毛毯圖
          • stripplot():繪制散點(diǎn)圖,jitter=True,抖動(dòng)(重復(fù)點(diǎn)不會(huì)被覆蓋)
          • swarmplot():看清每個(gè)數(shù)據(jù)點(diǎn)
          • boxplot():繪制箱線圖
          • pairplot():變量?jī)蓛芍g的關(guān)系(線性或非線性,有無較為明顯的相關(guān)關(guān)系)

          小提琴圖

          小提琴圖其實(shí)是箱線圖與核密度圖的結(jié)合,箱線圖展示了 分位數(shù) 的位置,小提琴圖則展示了 任意位置的密度 ,通過小提琴圖可以知道哪些位置的密度較高。

          在圖中, 白點(diǎn) 是中位數(shù),黑色盒型的范圍是下四分位點(diǎn)到上四分位點(diǎn),細(xì)黑線表示須。 外部形狀即為核密度估計(jì) (在概率論中用來估計(jì)未知的密度函數(shù),屬于非參數(shù)檢驗(yàn)方法之一)。

          sns.set_style("whitegrid")
          df_iris=pd.read_csv('D:\dataset\iris.csv')
          ax=sns.violinplot(x=df_iris['Petal.Length'])

          • countplot():繪制類別的計(jì)數(shù)柱狀圖
          • jointplot():多變量圖,不僅可以顯示兩個(gè)變量的關(guān)系,還可以顯示每個(gè)單變量的分布情況。
          • 在jointplot函數(shù)中,改變 kind 參數(shù)為 kde ,但變量的分布就用 密度圖 來代替,而 散點(diǎn)圖則會(huì)被等高線圖代替
          sns.jointplot(x='Petal.Length',y='Petal.Width' ,data=df_iris,kind='kde')

          • regplot() :繪制回歸圖可以揭示兩個(gè)變量間的線性關(guān)系

          • 了解四個(gè)課堂后量化表現(xiàn)之間的 相關(guān)性
          sns.regplot(x='舉手次數(shù)',y='討論次數(shù)',order=4,data=df)

          熱力圖是數(shù)據(jù)可視化項(xiàng)目中比較常用的數(shù)據(jù)顯示方式。 熱力圖通過顏色變化程度直觀反應(yīng)出熱點(diǎn)分布,區(qū)域聚集等數(shù)據(jù)信息 。熱力圖實(shí)現(xiàn)過程就是通過簡(jiǎn)單的數(shù)學(xué)變化,將離散的點(diǎn)信息映射為圖像。

          簡(jiǎn)述Seaborn繪圖風(fēng)格設(shè)置的內(nèi)容和方法

          Seaborn通過set函數(shù)實(shí)現(xiàn)風(fēng)格設(shè)置。

          seaborn.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=True, rc=None)

          8. pyecharts可視化

          pyecharts是基于Echart圖表的一個(gè)類庫,而Echart是百度開源的一個(gè)可視化 JavaScript 庫。

          pyecharts主要基于web瀏覽器進(jìn)行顯示,繪制的圖形比較多,包括 折線圖、柱狀圖、餅圖、漏斗圖、地圖、極坐標(biāo)圖 等,代碼量很少,而且很靈活,繪制出來的圖形很美觀。

          圖形繪制過程,基本上所有的圖表類型都是這樣繪制的:

          chart_name=Type()      #初始化具體類型圖表
          chart_name.add()         #添加數(shù)據(jù)及配置項(xiàng)
          chart_name.render() 
          #生成本地文件(html/svg/jpeg/png/pdf/gif)
          chart_name .render_notebook  #在jupyter notebook中顯示

          柱狀圖

          全局配置項(xiàng)(Global Option)

          pyecharts 中通過 Funnel 繪制漏斗圖,

          儀表盤

          平行坐標(biāo)圖

          平行坐標(biāo)圖(Parallel Coordinates Plot)是對(duì)于具有多個(gè)屬性問題的一種可視化方法。在平行坐標(biāo)圖中,數(shù)據(jù)集的一行數(shù)據(jù)在平行坐標(biāo)圖中用一條折線表示,縱向是 屬性值 ,橫向是 屬性類別 (用索引表示)

          桑基圖(Sankey diagram)即 桑基能量分流圖 ,也叫桑基能量平衡圖。它是一種特定類型的流程圖,圖中延伸的分支的寬度對(duì)應(yīng)數(shù)據(jù)流量的大小,通常應(yīng)用于能源、材料成分、金融等數(shù)據(jù)的可視化分析。 Pyecharts 中利用 Sankey 繪制桑基圖。

          簡(jiǎn)述pyecharts中圖表繪制的步驟。

          chart_name=Type()      #初始化具體類型圖表
          chart_name .add()         #添加數(shù)據(jù)及配置項(xiàng)
          chart_name .render() 
          #生成本地文件(保存路徑)
          chart_name .render_notebook  #在jupyter notebook中顯示

          9. 時(shí)間序列數(shù)據(jù)分析

          Python標(biāo)準(zhǔn)庫中包含了用于日期(date)、時(shí)間(time)、日歷(calendar)等功能的數(shù)據(jù)類型,主要會(huì)用到datetime、time、calendar模塊,我們主要介紹一下datetime模塊。

          time類型數(shù)據(jù)的用法

          time=datetime.time(10,20,15)
          print(time)
          print(time.hour,time.minute,time.second)

          Datetime類數(shù)據(jù)是date類和time類數(shù)據(jù)的組合,通過now函數(shù)可以查看當(dāng)前的時(shí)間。

          • datetime -> str:將datetime類數(shù)據(jù)轉(zhuǎn)換為字符串?dāng)?shù)據(jù)。datetime.strftime()
          • str -> datetime: 將字符串?dāng)?shù)據(jù)轉(zhuǎn)換為datetime類數(shù)據(jù)。
            • datetime.strptime() :根據(jù)string, format 2個(gè)參數(shù),返回一個(gè)對(duì)應(yīng)的datetime對(duì)象

          重采樣是時(shí)間序列頻率轉(zhuǎn)換的過程,Pandas中的resample函數(shù)用于各種頻率的轉(zhuǎn)換工作。

          在做 時(shí)間序列分析 時(shí),經(jīng)常要對(duì)時(shí)間序列進(jìn)行平穩(wěn)性檢驗(yàn)。用Python來進(jìn)行 平穩(wěn)性檢驗(yàn) 主要有 時(shí)序圖檢驗(yàn)、自相關(guān)圖檢驗(yàn)以及構(gòu)造統(tǒng)計(jì)量進(jìn)行檢驗(yàn) 3種方法

          1 時(shí)序圖檢驗(yàn)

          時(shí)序圖就是普通的時(shí)間序列圖,即以時(shí)間為橫軸,觀察值為縱軸進(jìn)行檢驗(yàn)。利用時(shí)序圖可以粗略觀察序列的平穩(wěn)性。

          2 自相關(guān)圖檢驗(yàn)

          平穩(wěn)序列通常具有短期相關(guān)性,即隨著延遲期數(shù)k的增加,平穩(wěn)序列的自相關(guān)系數(shù)會(huì)很快地衰減向零,而非平穩(wěn)序列的自相關(guān)系數(shù)的衰減速度會(huì)比較慢。畫自相關(guān)圖用到的是 statsmodels 中的 plot_acf 方法。自相關(guān)圖中橫軸表示延遲期數(shù),縱軸表示自相關(guān)系數(shù)。

          3. 利用繪圖判斷序列的平穩(wěn)性比較直觀,但不夠精確,ADF(Augmented Dickey-Fuller)法直接通過 假設(shè)檢驗(yàn) 的方式來驗(yàn)證平穩(wěn)性。ADF的原假設(shè)(H0)和備擇假設(shè)(H1)如下:

          • H0:具有單位根,屬于非平穩(wěn)序列;
          • H1:沒有單位根,屬于平穩(wěn)序列。

          Python中可以使用 statsmodels 中的 adfuller 方法進(jìn)行ADF檢驗(yàn),直接輸入數(shù)據(jù),即可返回7個(gè)數(shù)值。

          其中的第一個(gè)返回值adf就是ADF方法的檢驗(yàn)結(jié)果,這個(gè)值理論上越負(fù)越能拒絕原假設(shè);

          第二個(gè)返回值pvalue以常用的判斷標(biāo)準(zhǔn)值0.05作為參考,若其值大于0.05,說明支持原假設(shè),反之拒絕原假設(shè),表明該序列是一個(gè)平穩(wěn)序列。

          若其值大于0.05,說明支持原假設(shè),反之拒絕原假設(shè),表明該序列是一個(gè)平穩(wěn)序列。

          用Python來進(jìn)行平穩(wěn)性檢驗(yàn)主要有時(shí)序圖檢驗(yàn)、自相關(guān)圖檢驗(yàn)以及構(gòu)造統(tǒng)計(jì)量進(jìn)行檢驗(yàn)3種方法。

          10. SciPy科學(xué)計(jì)算基礎(chǔ)

          Scipy是一款用于數(shù)學(xué)、科學(xué)和工程領(lǐng)域的Python工具包,可以處理插值、積分、優(yōu)化、圖像處理、常微分方程數(shù)值解的求解、信號(hào)處理等問題。

          SciPy的constants模塊

          SciPy的constants模塊包含了大量用于科學(xué)計(jì)算的常數(shù)。

          from scipy import constants as C
          
          print(C.pi)   #圓周率
          print(C.golden)   #黃金比例
          print(C.c)   #真空中的光速
          print(C.h)    #普朗克常數(shù)
          print(C.mile)   #一英里等于多少米
          print(C.inch)   #一英寸等于多少米
          print(C.degree)   #一度等于多少弧度
          print(C.minute)  #一分鐘等于多少秒
          print(C.g)   #標(biāo)準(zhǔn)重力加速度

          SciPy的special模塊

          SciPy的special模塊包含了大量函數(shù)庫,包括基本數(shù)學(xué)函數(shù)、特殊函數(shù)以及NumPy中的所有函數(shù)。

          from scipy import special as S
          
          print(S.cbrt(8)) #立方根
          print(S.exp10(3)) #10**3
          print(S.sindg(90)) #正弦函數(shù),參數(shù)為角度
          print(S.round(3.1)) #四舍五入函數(shù)
          print(S.round(3.5))
          print(S.round(3.499))
          print(S.comb(5,3))
          #從5個(gè)中任選3個(gè)的組合數(shù)
          print(S.perm(5,3)) #排列數(shù)
          print(S.gamma(4)) #gamma函數(shù)
          print(S.beta(10,200)) #beta函數(shù)
          print(S.sinc(0)) #sinc函數(shù)

          SciPy.linalg

          SciPy.linalg 是SciPy中實(shí)現(xiàn)線性代數(shù)計(jì)算的模塊,常用的導(dǎo)入方式為: from scipy import linalg

          在NumPy中,矩陣有矩陣類型和二維數(shù)組兩種表示方法。

          (1)數(shù)組類型下的基本操作

          矩陣類型數(shù)據(jù)可以用 np.mat()mat.matrix() 創(chuàng)建。

          from scipy import linalg 
          import numpy as np 
          
          A=np.mat('[1,2;3,4]')
          print('A矩陣為:\n',A)
          print('A的轉(zhuǎn)置矩陣為:\n',A.T)
          print('A的逆矩陣為:\n',A.I)

          矩陣類型下的基本操作

          矩陣也可以用二維數(shù)組對(duì)象表示,數(shù)組對(duì)象的矩陣操作與矩陣對(duì)象有一定的區(qū)別。

          M=np.array([[1,2],[3,4]])
          print('M矩陣為:\n',M)
          print('M的轉(zhuǎn)置矩陣為:\n',M.T)
          print('M的逆矩陣為:\n',linalg.inv(M))

          線性方程組求解

          除了通過矩陣的逆求解外可以直接使用 linalg.solve() 函數(shù)求解而且效率更高。

          from scipy import linalg 
          import numpy as np 
          a=np.array([[1, 3, 5], [2, 5, -1], [2, 4, 7]])
          b=np.array([10, 6, 4]) 
          x=linalg.solve(a, b) 
          print(x)
          [-14.31578947   7.05263158   0.63157895]

          行列式的計(jì)算

          行列式是一個(gè)將方陣映射到標(biāo)量的函數(shù)。linalg.det()可以計(jì)算矩陣的行列式。

          M=np.array([[1,2],[3,4]])
          linalg.det(M) 
          -2.0

          范數(shù)

          范數(shù)是數(shù)學(xué)上一個(gè)類似“長(zhǎng)度”的概念。 linalg.norm() 函數(shù)可以計(jì)算向量或矩陣的范數(shù)(或者模)。常見范數(shù)及其含義見下表。

          M=np.array([[1,2],[3,4]])
          print('M矩陣為:\n',M)
          print('M矩陣的L范數(shù)為:\n',linalg.norm(M,1))  # 6.0
          print('M矩陣的2范數(shù)為:\n',linalg.norm(M,2))

          特征值求解

          函數(shù) linalg.eig() 可以用來求解特征值和特征向量。

          A=np.array([[1,2],[3,4]])
          l,v=linalg.eig(A)
          print(l)
          print(v)
          [-0.37228132+0.j  5.37228132+0.j]
          [[-0.82456484 -0.41597356]
           [ 0.56576746 -0.90937671]]

          奇異值分解

          奇異值分解是一個(gè)能適用于任意的矩陣的一種分解的方法。

          scikit-learn的PCA算法的背后真正的實(shí)現(xiàn)就是用的SVD。

          from numpy import *
          data=mat([[1,2,3],[4,5,6]])
          U,sigma,VT=np.linalg.svd(data)
          print('U: ',U)
          print('SIGMA:',sigma)
          print('VT:',VT)

          SciPy中的優(yōu)化

          SciPy.optimize 包提供了幾種常用的優(yōu)化算法,包括用來求有/無約束的多元標(biāo)量函數(shù)最小值算法,最小二乘法,求有/無約束的單變量函數(shù)最小值算法,還有解各種復(fù)雜方程的算法。

          方程求解及求極值

          使用 SciPy.optimize 模塊的root和fsolve函數(shù)進(jìn)行數(shù)值求解線性及非線性方程求方程的根。

          from scipy.optimize import root
          def func(x):
             return x*2 + 2 * np.cos(x)
          sol=root(func, 0.3)   
          # 0.3 估計(jì)初始值
          print (sol)

          使用 fmin,fminbound 可以求函數(shù)的極值:

          import numpy as np
          from matplotlib import pyplot as plt
          from SciPy.optimize import fmin,fminbound  
          def f(x):    
               return x**2+10*np.sin(x)+1
          x=np.linspace(-10,10,num=500)
          min1=fmin(f,3)  #求3附近的極小值
          min2=fmin(f,0)  #求0附近的極小值
          min_global=fminbound(f,-10,10) 
          #這個(gè)區(qū)域的最小值
          print(min1)
          print(min2)
          print(min_global)
          plt.plot(x,f(x))
          plt.show()

          數(shù)據(jù)擬合

          (1)多項(xiàng)式擬合

          import matplotlib.pyplot as plt
          
          x=np.linspace(-5,5,20)
          y=3.5*x+2.1
          y_noise=y+np.random.randn(20)*2
          coeff=np.polyfit(x,y_noise,1)
          plt.plot(x,y_noise,'x',x,coeff[0]*x+coeff[1])
          plt.show()

          最小二乘擬合

          最小二乘擬合(Least Squares)是一種常用的數(shù)學(xué)優(yōu)化技術(shù),通過最小化誤差的平方和在尋找一個(gè)與數(shù)據(jù)匹配的最佳函數(shù)。

          要使用最小二乘優(yōu)化,需要先定義誤差函數(shù):

          def errf(p,x,y):
          	return y-func(x,*p)

          其中,p表示要估計(jì)的真實(shí)參數(shù),x是函數(shù)的輸入,y表示輸入對(duì)應(yīng)的數(shù)據(jù)值。最小二乘估計(jì)對(duì)應(yīng)的函數(shù)為 optimize.leastsq() ,可以利用該函數(shù)和定義的誤差函數(shù),對(duì)真實(shí)參數(shù)進(jìn)行最小二乘估計(jì)。

          from scipy import optimize
          def myfunc(x,a,b,w,t):
              return a*np.exp(-b*np.sin(w*x+t))
              
          x=np.linspace(0,2*np.pi)
          par=[3,2,1.25,np.pi/4]
          y=myfunc(x,*par)
          y_noise=y+0.8*np.random.randn(len(y))
          def errf(p,x,y):
              return y-myfunc(x,*p)
          c,rv=optimize.leastsq(errf,[1,1,1,1],args=(x,y_noise))
          #c返回找到的最小二乘估計(jì)
          plt.plot(x,y_noise,'x',x,y,x,myfunc(x,*c),':')
          plt.legend(['data','actual','leastsq'])
          plt.show()

          曲線擬合

          可以不定義誤差函數(shù),用函數(shù) optimize.curve_fit() 直接對(duì)函數(shù)myfunc的參數(shù)直接進(jìn)行擬合。

          p,e=optimize.curve_fit(myfunc,x,y_noise)
          print('p是對(duì)參數(shù)的估計(jì)值:\n',p)
          print('e是4個(gè)估計(jì)參數(shù)的協(xié)方差矩陣:\n',e)
          p是對(duì)參數(shù)的估計(jì)值:
           [3.28292536 1.90102739 1.2478838  0.78989363]
          e是4個(gè)估計(jì)參數(shù)的協(xié)方差矩陣:
           [[ 0.17453746 -0.05248031  0.01959142 -0.06158022]
           [-0.05248031  0.01606779 -0.00572988  0.01801028]
           [ 0.01959142 -0.00572988  0.00271714 -0.00854062]
           [-0.06158022  0.01801028 -0.00854062  0.02707182]]

          稀疏矩陣的存儲(chǔ)

          稀疏矩陣(Sparse Matrix)是 只有少部分元素值是非零的矩陣 。如果按照正常方式存儲(chǔ)所有元素,則這些矩陣將占用巨大空間,因此,稀疏矩陣只保存非零值及對(duì)應(yīng)的位置。

          SciPy.sparse 是SciPy中負(fù)責(zé)稀疏矩陣的模塊。在SciPy中,根據(jù)存儲(chǔ)方式的不同,可以將稀疏矩陣分為以下幾類:

          • bsr_matrix(Block Sparse Row matrix):分塊存儲(chǔ),基于行
          • coo_matrix(A sparse matrix in COOrdinate format):坐標(biāo)形式存儲(chǔ)(COO)
          • csc_matrix(Compressed Sparse Column matrix):基于列的壓縮存儲(chǔ)(CSC)
          • csr_matrix(Compressed Sparse Row matrix):基于行的壓縮存儲(chǔ)(CSR)
          • dia_matrix(Sparse matrix with DIAgonal storage):對(duì)角線存儲(chǔ)
          • dok_matrix(Ditictionary Of Keys based sparse matrix):基于鍵值對(duì)的存儲(chǔ)
          • lil_matrix(Row-based linked list sparse matrix):基于行的鏈表存儲(chǔ)

          稀疏矩陣的運(yùn)算

          由于稀疏矩陣數(shù)據(jù)量大,一般不使用普通矩陣作為參數(shù)來構(gòu)建,而是采用非零數(shù)據(jù)點(diǎn)及坐標(biāo)的形式構(gòu)建。

          import numpy as np
          from scipy import sparse
          sparse.coo_matrix((2,3))  #創(chuàng)建空的稀疏矩陣
          A=sparse.coo_matrix([[1,2,0],[0,1,0],[2,0,0]]) 
          #將普通矩陣轉(zhuǎn)為稀疏矩陣
          print(A)
          print(type(A))    #查看A的類型
          print(type(A.tocsc())) #不同類型的稀疏矩陣可以相互轉(zhuǎn)換
          v=np.array([1,3,-3])
          print(A*v)
          data=[1,2,3,4]
          rows=[0,0,1,2]
          cols=[0,1,2,2]
          W=sparse.coo_matrix(data,(rows,cols))
          print('稀疏矩陣W:\n',W)
          r,c,d=sparse.find(W)
          #find()函數(shù)返回非零元素的行、列和具體數(shù)值
          print('稀疏矩陣W非零值:\n',r,c,d)
          稀疏矩陣W:
             (0, 0)	1
            (0, 1)	2
            (0, 2)	3
            (0, 3)	4
          稀疏矩陣W非零值:
           [0 0 0 0] [0 1 2 3] [1 2 3 4]

          SciPy中的圖像處理

          簡(jiǎn)單的介紹一下SciPy在圖像處理方面的應(yīng)用,如果專業(yè)做圖像處理當(dāng)然還是建議使用OpenCV。

          1 圖像平滑

          圖像平滑是指用于突出圖像的寬大區(qū)域、低頻成分、主干部分或抑制圖像噪聲和干擾高頻成分,使圖像亮度平緩漸變,減小突變梯度,改善圖像質(zhì)量的圖像處理方法。

          圖像平滑的方法包括:插值方法,線性平滑方法,卷積法等。

          ndimage.median_filter 實(shí)現(xiàn)中值濾波。

          import numpy as np
          from scipy import ndimage
          from scipy import misc
          import matplotlib.pyplot as plt
          %matplotlib inline
          image=misc.ascent()
          aa=plt.subplot(1,3,1)
          plt.title("title")
          plt.imshow(image)
          plt.axis('off')
          plt.subplot(1,3,2)
          plt.title("medi_filter")
          filter=ndimage.median_filter(image,size=10)
          #使用SciPy的中值濾波處理圖片
          plt.imshow(filter)
          plt.axis('off')
          plt.subplot(1,3,3)
          plt.title("gausfilter")
          blurred_face=ndimage.gaussian_filter(image, sigma=7)
          #高斯濾波
          plt.imshow(blurred_face)
          plt.axis('off')

          圖像旋轉(zhuǎn)和銳化

          圖像銳化就是補(bǔ)償圖像的輪廓,增強(qiáng)圖像的邊緣及灰度跳變的部分,使圖像變得清晰。圖像銳化處理的目的是 為了使圖像的邊緣、輪廓線以及圖像的細(xì)節(jié)變的清晰 。經(jīng)過平滑的圖像變得模糊的根本原因是因?yàn)閳D像受到了平均或積分運(yùn)算,因此可以對(duì)其進(jìn)行逆運(yùn)算(如微分運(yùn)算)就可以使圖像變的清晰。從頻域來考慮,圖像模糊的實(shí)質(zhì)是因?yàn)槠涓哳l分量被衰減,因此可以用 高通濾波器來使圖像清晰

          image=misc.ascent() 
          #顯示全部圖片
          plt.subplot(131)
          plt.title("title")
          plt.imshow(image)
          plt.axis('off')
          plt.subplot(132)
          rotate=ndimage.rotate(image,60)
          plt.title("rotate")
          plt.imshow(rotate)
          plt.axis('off') #邊緣檢測(cè)
          plt.subplot(133)
          prewitt=ndimage.prewitt(image)
          plt.title("prewitt")
          plt.imshow(prewitt)
          plt.axis('off')

          SciPy中的信號(hào)處理

          信號(hào)處理(signal processing)是指對(duì)信號(hào)進(jìn)行提取、變換、分析、綜合等處理,以便抽取出有用信息的過程。信號(hào)處理基本的內(nèi)容有變換、濾波、調(diào)制、解調(diào)、檢測(cè)以及譜分析和估計(jì)等。

          Python中的 scipy.signal 模塊專門用于信號(hào)處理。

          1 數(shù)據(jù)重采樣

          重采樣指將數(shù)據(jù)序列從一個(gè)頻率轉(zhuǎn)化為另一個(gè)頻率進(jìn)行處理的過程。將高頻率數(shù)據(jù)轉(zhuǎn)化為低頻率數(shù)據(jù)為降采樣,低頻率轉(zhuǎn)化為高頻率為升采樣。SciPy中的 signal.resample() 函數(shù)可以將信號(hào)重采樣成n個(gè)點(diǎn)。

          2 信號(hào)的卷積

          卷積是兩個(gè)變量在某范圍內(nèi)相乘后求和的結(jié)果。一維卷積常用于序列模型,如自然語言處理領(lǐng)域。二維卷積常用于計(jì)算機(jī)視覺、圖像處理領(lǐng)域。

          2 信號(hào)的卷積

          卷積是兩個(gè)變量在某范圍內(nèi)相乘后求和的結(jié)果。一維卷積常用于序列模型,如自然語言處理領(lǐng)域。二維卷積常用于計(jì)算機(jī)視覺、圖像處理領(lǐng)域。

          3 信號(hào)的時(shí)頻分析

          信號(hào)的表示是信息分析與處理的核心問題之一。在信號(hào)分析中,最基本的變量是時(shí)間和頻率。

          信號(hào)一般用時(shí)間作為自變量表示,通過時(shí)頻變換,信號(hào)也可以使用頻率作為自變量表示。常用的變換方法有傅里葉變換、小波變換等。

          SciPy中利用 fft 方法將信號(hào)從時(shí)域變換到頻率,用 ifft 方法 將頻域信號(hào)逆變換回時(shí)域

          11. Note

          Scipy是一款用于數(shù)學(xué)、科學(xué)和工程領(lǐng)域的Python工具包,可以處理插值、積分、優(yōu)化、圖像處理、常微分方程數(shù)值解的求解、信號(hào)處理等問題。

          數(shù)據(jù)擬合的方法: 多項(xiàng)式擬合,最小二乘擬合,曲線擬合

          歐式距離distance的代碼:

          np.sqrt(np.sum((a-b)**2))

          水平堆疊

          np.hstack((a,b))

          每一行中的最大值的代碼。

          np.max(array,axis=0)

          第二大值的代碼(默認(rèn)升序排序)

          np.unique(array)[-2]
          ndmin  shape
          numpy	維數(shù)	   維度
          pandas	維度	   形狀
          Pandas的plot繪制直方圖時(shí),kind取值為hist
          	            密度          kde
          	            散點(diǎn)          scatter

          Pandas通過 DataFrame.rename() 函數(shù),傳入需要修改列名的字典形式來修改列名。replace進(jìn)行數(shù)據(jù)的替換

          Pandas要讀取Mysql中的數(shù)據(jù),首先要安裝 MySQLdb

          Pandas讀取SQL sever中的數(shù)據(jù),首先要安裝 pymssql

          Matplotlib配置了配色方案和默認(rèn)設(shè)置。有兩種方式可以設(shè)置參數(shù),即 全局參數(shù)定制rc參數(shù)設(shè)置方法

          Matplotlib中繪圖時(shí)的參數(shù)alpha用于設(shè)置點(diǎn)的透明度。

          Seaborn中可以通過 despine 方法移除繪圖上方和右方坐標(biāo)上不需要的邊框。

          在Seaborn中利用 pairplot() 實(shí)現(xiàn)數(shù)據(jù)特征的兩兩對(duì)比。

          pyecharts中通過 Funnel 繪制漏斗圖。

          pyecharts利用 Kline 繪制K線圖

          pyecharts利用 Gauge 繪制儀表盤。

          pyecharts中利用 Sankey 繪制桑基圖。

          Scipy中的 constants 模塊包含大量用于科學(xué)計(jì)算的常數(shù)。

          var函數(shù)用作方差統(tǒng)計(jì)

          使用 rcdefault() 函數(shù)可以將配置文件重置。

          處理數(shù)據(jù)缺陷的常用方法 dropna fillna isnull或 notnull

          • 單從數(shù)據(jù)可視化的奧妙來說:想要學(xué)好還是需要下更多功夫去鉆研實(shí)戰(zhàn)的。
          • 單從考試角度來說:想考個(gè)及格/80+還是不難的,畢竟考試比較水,大家都懂。
          • 考試既然水,分?jǐn)?shù)就無所謂高低,重要的是我們學(xué)了多少東西。
          • 如果看到這里,首先恭喜你與我同在,提前祝你考一個(gè)好的成績(jī)。
          • 再次感謝大家的支持與陪伴,感謝其他學(xué)霸/大佬對(duì)此文的貢獻(xiàn),我僅僅是一個(gè)文字搬運(yùn)工,分享快樂。

          加油!

          感謝!

          努力!

          avaScript 語言中有兩種比較方式,轉(zhuǎn)換類型比較運(yùn)算符==和嚴(yán)格比較運(yùn)算符===。其中嚴(yán)格比較運(yùn)算符僅當(dāng)兩個(gè)操作數(shù)的類型相同且值相等時(shí)才為true。而轉(zhuǎn)換類型比較運(yùn)算符==會(huì)在進(jìn)行比較之前,將兩個(gè)操作數(shù)轉(zhuǎn)換成相同的類型,再來比較。

          比較運(yùn)算符常用語邏輯語句中,它主要是用語判定變量或者值是否相等。

          相等運(yùn)算符

          相等運(yùn)算符==會(huì)為兩個(gè)不同類型的操作數(shù)轉(zhuǎn)換類型,然后進(jìn)行嚴(yán)格比較。

          示例:

          console.log(1==1);    // true
          console.log(1==2);    // false
          console.log(1==true); // true
          console.log(1=='1');  // true
          

          從上述代碼中的1=='1',輸出結(jié)果為 true,就可以看出==相等運(yùn)算符,在對(duì)兩個(gè)操作數(shù)進(jìn)行比較之前,會(huì)將兩個(gè)操作數(shù)轉(zhuǎn)換成相同的類型。

          當(dāng)使用比較運(yùn)算符時(shí),如果其中有布爾類型的操作數(shù),值為 true時(shí)會(huì)轉(zhuǎn)換為1,值為false時(shí)會(huì)轉(zhuǎn)換為0。

          當(dāng)兩個(gè)操作數(shù)都是對(duì)象時(shí),JavaScript會(huì)比較其內(nèi)部引用,當(dāng)且僅當(dāng)他們的引用指向內(nèi)存中的相同對(duì)象時(shí)才相等,即他們?cè)跅?nèi)存中的引用地址相同。

          嚴(yán)格相等運(yùn)算符

          嚴(yán)格相等運(yùn)算符===不會(huì)對(duì)操作數(shù)進(jìn)行類型轉(zhuǎn)換,只有當(dāng)值相等并且類型也是相等時(shí)才會(huì)返回 true。

          示例:

          console.log(1===1);     // true
          console.log(1===2);     // false
          console.log(1===true);  // false
          console.log(1===false); // false
          console.log(1==='1');   // false
          

          從a===c d的比較結(jié)果可以看出,不同類型的值進(jìn)行比較時(shí),會(huì)返回 false。

          不等運(yùn)算符

          不等運(yùn)算符 !=只有當(dāng)操作數(shù)不相等時(shí)才返回true,如果兩操作數(shù)不是同一類型,會(huì)將操作數(shù)轉(zhuǎn)為同意類型再進(jìn)行比較。

          示例:

          var a=1;
          var b=2;
          var c='1';
          
          console.log(a !=1);  // false
          console.log(a !=b);  // true
          console.log(a !=c);  // false
          

          如果兩操作數(shù)為對(duì)象類型,JavaScript會(huì)比較其內(nèi)部引用地址,僅當(dāng)他們?cè)趦?nèi)存中引用不同對(duì)象時(shí)不相等。

          嚴(yán)格不等運(yùn)算符

          嚴(yán)格不等運(yùn)算符 !==當(dāng)操作數(shù)不相等或不同類型時(shí)返回 true。

          示例:

          var a=1;
          var b=2;
          var c='1';
          
          console.log(a !==1);  // false
          console.log(a !==b);  // true
          console.log(a !==c);  // true
          

          大于運(yùn)算符

          大于運(yùn)算符 > ,只有當(dāng)左操作數(shù)大于右操作數(shù)時(shí)才返回 true。

          示例:

          console.log(5 > 1);   // true
          console.log(5 > 10);  // false
          console.log(5 > '5'); // false
          

          大于等于運(yùn)算符

          大于等于運(yùn)算符 >=,只有當(dāng)左操作數(shù)大于或者等于右操作數(shù)時(shí)才返回 true。

          示例:

          console.log(5 >=1);   // true
          console.log(5 >=5);   // true
          console.log(5 >=10);  // false
          console.log(5 >='5'); // true
          

          小于運(yùn)算符

          小于運(yùn)算符 < ,只有當(dāng)左操作數(shù)小于右操作數(shù)時(shí)才返回 true。

          示例:

          console.log(5 < 1);   // false
          console.log(5 < 5);   // false
          console.log(5 < 10);  // true
          console.log(5 < '5'); // false
          

          小于等于運(yùn)算符

          小于運(yùn)算符 < ,只有當(dāng)左操作數(shù)小于或者等于右操作數(shù)時(shí)才返回 true。

          示例:

          console.log(5 <=1);   // false
          console.log(5 <=5);   // true
          console.log(5 <=10);  // true
          console.log(5 <='5'); // true
          

          使用比較運(yùn)算時(shí)的類型轉(zhuǎn)換

          當(dāng)比較運(yùn)算涉及類型轉(zhuǎn)換時(shí),JavaScript 會(huì)按以下規(guī)則對(duì)字符串、數(shù)字、布爾、對(duì)象等類型的操作數(shù)進(jìn)行操作:

          • 當(dāng)操作數(shù)有數(shù)字類型和字符串類型時(shí),會(huì)將字符串轉(zhuǎn)為數(shù)字值。
          • 當(dāng)其中一個(gè)操作數(shù)為布爾型,布爾值為true則轉(zhuǎn)換為1,為false則轉(zhuǎn)換為0。
          • 如果一個(gè)對(duì)象與數(shù)字或字符串相比較,JavaScript 會(huì)嘗試返回對(duì)象的默認(rèn)值。操作符會(huì)嘗試通過valueOf 和 toString 方法將對(duì)象轉(zhuǎn)換為其原始值。如果嘗試轉(zhuǎn)換失敗,會(huì)產(chǎn)生一個(gè)運(yùn)行時(shí)錯(cuò)誤。

          動(dòng)手小練習(xí)

          1. 請(qǐng)分別用比較運(yùn)算符和嚴(yán)格比較運(yùn)算符,來比較10 和 '10'的值是否相等。
          2. 請(qǐng)說出下列代碼的輸出結(jié)果:

          s中常用的數(shù)據(jù)類型有:

          值類型(基本類型):字符串(String)、數(shù)字(Number)、布爾(Boolean)、對(duì)空(Null)、未定義(Undefined)、Symbol。

          引用數(shù)據(jù)類型:對(duì)象(Object)、數(shù)組(Array)、函數(shù)(Function)。

          就以上數(shù)據(jù)類型先舉幾個(gè)例子:

          // 字符串(String)
          let a='word';
          // 數(shù)字(Number)
          let b=123;
          // 布爾(Boolean)
          let c=true;
          // 對(duì)空(Null)
          let d=null;
          // 未定義(Undefined)
          let e;
          // Symbol
          let f=Symbol('123');
          // 對(duì)象(Object)
          let g={name:'xiangming'};
          // 數(shù)組(Array)
          let h=[1,2,3,4,5];
          // 函數(shù)(Function)
          let i=function () {
            return 'done';
          };

          1、最常見的判斷方法:typeof

          console.log('a:'+typeof a);  	
          // a:string
          console.log('b:'+typeof b); 
          // b:number
          console.log('c:'+typeof c); 	
          // c:boolean
          console.log('d:'+typeof d);  
          // d:object
          console.log('e:'+typeof e);  
          // e:undefined
          console.log('f:'+typeof f);  		
          // f:symbol
          console.log('g:'+typeof g);  
          // g:object
          console.log('h:'+typeof h);  
          // h:object
          console.log('i:'+typeof i);  		
          // i:function

          所以,typeof 在判斷除Object類型的對(duì)象時(shí)比較方便。

          2、判斷已知對(duì)象類型的方法:instanceof

          console.log('a is string:'+a instanceof String);
          // a is string:true
          console.log('b is number:'+b instanceof Number);
          // b is number:true
          console.log('b is number:'+b instanceof number);
          // Uncaught ReferenceError: number is not defined

          注意:instanceof 后面一定要是對(duì)象類型,并且大小寫不能錯(cuò),該方法適合一些條件選擇或分支。

          3、通用但很繁瑣的方法:prototype(推薦)

          // 定義方法獲取變量類型
          function var_type(data) {
            return Object.prototype.toString.call(data).replace(/^\[object\s(.+)\]$/, '$1').toLowerCase();
          }
          console.log('a:'+var_type(a));
          // a:string
          console.log('b:'+var_type(b));
          // b:number
          console.log('c:'+var_type(c));
          // c:boolean
          console.log('d:'+var_type(d));
          // d:null
          console.log('e:'+var_type(e));
          // e:undefined
          console.log('f:'+var_type(f));
          // f:symbol
          console.log('g:'+var_type(g));
          // g:object
          console.log('h:'+var_type(h));
          // h:array
          console.log('i:'+var_type(i));
          // i:function

          此方法雖稍顯繁瑣,但只需簡(jiǎn)單封裝一個(gè)方法即可。

          文章最后給大家推薦一個(gè)小編自己寫的通用后臺(tái)框架云靜Admin通用后臺(tái),小編也是第一次嘗試開源代碼,還望大家不吝賜教。

          云靜Admin通用后臺(tái):

          http://uadmin.yunj.net.cn/admin

          開發(fā)文檔:

          https://www.kancloud.cn/worklz/yunj_admin_universal/2009454


          主站蜘蛛池模板: 无码国产精品一区二区免费式芒果| 国产精品xxxx国产喷水亚洲国产精品无码久久一区| 一区二区三区日韩| 亚洲综合国产一区二区三区| 91久久精品午夜一区二区| 精品无人乱码一区二区三区| 久久精品无码一区二区三区日韩 | 国产精品亚洲产品一区二区三区| 亚欧免费视频一区二区三区| 秋霞午夜一区二区| 一区二区三区免费视频播放器 | 色窝窝免费一区二区三区| 国产suv精品一区二区33| 精品国产一区二区三区久| 久久久久人妻一区精品色| 久久久久人妻精品一区蜜桃| 蜜桃视频一区二区| 精品无码国产AV一区二区三区 | 日产一区日产2区| 成人在线视频一区| 国产精品综合一区二区三区| 国产精品亚洲一区二区在线观看 | 正在播放国产一区| 久久精品无码一区二区三区免费| 亚洲一区在线视频| 久久无码人妻一区二区三区午夜 | 中文字幕亚洲一区二区va在线| 日韩AV在线不卡一区二区三区| 日韩在线视频一区二区三区 | 无码视频一区二区三区| 色综合视频一区二区三区44| 欧美日韩国产免费一区二区三区| 精品亚洲AV无码一区二区| 国产一区二区三区影院| 97一区二区三区四区久久| 国产精品无码一区二区三区毛片| 精品久久综合一区二区| 八戒久久精品一区二区三区 | 国精无码欧精品亚洲一区| 精品国产日产一区二区三区| 亚洲一区二区影视|