整合營銷服務商

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

          免費咨詢熱線:

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

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

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

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

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

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

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

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

          常用工具

          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編程基礎

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

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

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

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

          conda install <包名稱列表>   #安裝包
          conda remove <包名稱列表>  #卸載包
          conda search<搜索項>       #搜索包
          conda list                  #查看所有包
          conda update<包名稱>       #升級包

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

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

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

          esc 鍵切換為命令模式,按 enter 鍵進入編輯模式

          3. NumPy數(shù)值計算基礎

          NumPy簡介

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

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

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

          NumPy常用函數(shù)

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

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

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

          ndarray對象屬性及其說明:

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

          生成隨機數(shù)

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

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

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

          數(shù)組變換

          數(shù)組重塑

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

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

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

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

          數(shù)據(jù)重塑不會改變原來的數(shù)組.

          數(shù)組合并

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

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

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

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

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

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

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

          需要遵循4個原則:

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

          條件邏輯運算

          • 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,則輸出滿足條件元素的 坐標 。這里的坐標以tuple的形式給出,通常原數(shù)組有多少維,輸出的tuple中就包含幾個數(shù)組,分別對應符合條件元素的各維坐標。

          讀寫二進制文件

          • NumPy提供了多種文件操作函數(shù)存取數(shù)組內(nèi)容。
          • 文件存取的格式分為兩類:二進制和文本。而二進制格式的文件又分為NumPy專用的格式化二進制類型和無格式類型。
          • NumPy中讀寫二進制文件的方法有:np.load(“文件名.npy")是從二進制文件中讀取數(shù)據(jù);np.save(“文件名[.npy]", arr) 是以二進制格式保存數(shù)據(jù)。
          • 讀寫文本文件np.loadtxt("…/tmp/arr.txt",delimiter=“,”)把文件加載到一個二維數(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ù)對數(shù)據(jù)直接進行排序, 調(diào)用改變原始數(shù)組 ,無返回值。

          • 格式: numpy.sort(a, axis, kind, order)order:排序的字段名,可指定字段排序,默認為Noneaxis:axis=1為沿橫軸排序;axis=0為沿縱軸排序;axis=None,將數(shù)組平坦化之后進行排序
          • np.argsort函數(shù)和np.lexsort函數(shù)根據(jù)一個或多個鍵值對數(shù)據(jù)集進行排序。np.argsort(): 返回的是數(shù)組值從小到大的索引值;np.lexsort(): 返回值是按照最后一個傳入數(shù)據(jù)排序的結(jié)果。
          arr=np.array([7,9,5,2,9,4,3,1,4,3])
          print('原數(shù)組:',arr)
          print('排序后:',arr.argsort())
          #返回值為數(shù)組排序后的下標排列
          print('顯示較大的5個數(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個數(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)]

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

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

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

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

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

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

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

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

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

          DataFrame的屬性

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

          函數(shù)應用和映射

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

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

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

          匯總與統(tǒng)計

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

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

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

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

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

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

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

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

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

          分組運算

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

          數(shù)據(jù)透視表(Pivot Table)是數(shù)據(jù)分析中常見的工具之一,根據(jù)一個或多個鍵值對數(shù)據(jù)進行聚合,根據(jù)列或行的分組鍵將數(shù)據(jù)劃分到各個區(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')

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

          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方法繪制。
          • 核密度估計是對真實密度的估計,其過程是將數(shù)據(jù)的分布近似為一組核(如正態(tài)分布)。通過plot函數(shù)的kind=‘kde’可以進行繪制。

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

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

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

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

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

          1.文本文件讀取

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

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

          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. 文本文件的存儲

          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ù)的讀取與存儲

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

          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ù)的存儲

          Pandas使用 pd.to_json 實現(xiàn)將DataFrame數(shù)據(jù)存儲為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ù)是通過一個或多個鍵將兩個DataFrame按行合并起來,與SQL中的 join 用法類似,Pandas中的數(shù)據(jù)合并merge( )函數(shù)格式如下:

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

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

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

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

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

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

          檢測與處理缺失值

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

          填充缺失值

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

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

          Pandas通過drop_duplicates刪除重復的行,格式為:

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

          檢測異常值

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

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

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

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

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

          離差標準化數(shù)據(jù)

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

          標準差標準化數(shù)據(jù)

          標準差標準化又稱零均值標準化或z分數(shù)標準化,是當前使用最廣泛的數(shù)據(jù)標準化方法。

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

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

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

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

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

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

          散點圖 箱線圖分析 3σ法則,

          6. Matplotlib可視化

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

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

          相關函數(shù)簡介

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

          創(chuàng)建子圖

          創(chuàng)建子圖

          import matplotlib.pyplot as plt
          fig=plt.figure()
          #不能使用空白的figure繪圖,需要創(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)建一個新的圖片,然后返回包含了已生成子圖對象的NumPy數(shù)組。數(shù)組axes可以像二維數(shù)組那樣方便地進行索引,如 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ù)。

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

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

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

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

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

          繪圖的填充

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

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

          繪圖注釋

          繪圖時有時需要在圖表中加文本注解

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

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

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

          boxplot函數(shù)

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

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

          繪制詞云

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

          一般生成詞云的過程為:

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

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

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

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

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

          annotate()
          text()
          

          7. Seaborn

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

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

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

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

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

          主題設置

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

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

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

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

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

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

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

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

          • kdeplot():繪制密度圖
          • rugplot():繪制毛毯圖
          • stripplot():繪制散點圖,jitter=True,抖動(重復點不會被覆蓋)
          • swarmplot():看清每個數(shù)據(jù)點
          • boxplot():繪制箱線圖
          • pairplot():變量兩兩之間的關系(線性或非線性,有無較為明顯的相關關系)

          小提琴圖

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

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

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

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

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

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

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

          簡述Seaborn繪圖風格設置的內(nèi)容和方法

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

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

          8. pyecharts可視化

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

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

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

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

          柱狀圖

          全局配置項(Global Option)

          pyecharts 中通過 Funnel 繪制漏斗圖,

          儀表盤

          平行坐標圖

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

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

          簡述pyecharts中圖表繪制的步驟。

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

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

          Python標準庫中包含了用于日期(date)、時間(time)、日歷(calendar)等功能的數(shù)據(jù)類型,主要會用到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ù)可以查看當前的時間。

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

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

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

          1 時序圖檢驗

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

          2 自相關圖檢驗

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

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

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

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

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

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

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

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

          10. SciPy科學計算基礎

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

          SciPy的constants模塊

          SciPy的constants模塊包含了大量用于科學計算的常數(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)   #標準重力加速度

          SciPy的special模塊

          SciPy的special模塊包含了大量函數(shù)庫,包括基本數(shù)學函數(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個中任選3個的組合數(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中實現(xiàn)線性代數(shù)計算的模塊,常用的導入方式為: 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ù)組對象表示,數(shù)組對象的矩陣操作與矩陣對象有一定的區(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]

          行列式的計算

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

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

          范數(shù)

          范數(shù)是數(shù)學上一個類似“長度”的概念。 linalg.norm() 函數(shù)可以計算向量或矩陣的范數(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]]

          奇異值分解

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

          scikit-learn的PCA算法的背后真正的實現(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)化算法,包括用來求有/無約束的多元標量函數(shù)最小值算法,最小二乘法,求有/無約束的單變量函數(shù)最小值算法,還有解各種復雜方程的算法。

          方程求解及求極值

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

          from scipy.optimize import root
          def func(x):
             return x*2 + 2 * np.cos(x)
          sol=root(func, 0.3)   
          # 0.3 估計初始值
          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) 
          #這個區(qū)域的最小值
          print(min1)
          print(min2)
          print(min_global)
          plt.plot(x,f(x))
          plt.show()

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

          (1)多項式擬合

          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ù)學優(yōu)化技術(shù),通過最小化誤差的平方和在尋找一個與數(shù)據(jù)匹配的最佳函數(shù)。

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

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

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

          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返回找到的最小二乘估計
          plt.plot(x,y_noise,'x',x,y,x,myfunc(x,*c),':')
          plt.legend(['data','actual','leastsq'])
          plt.show()

          曲線擬合

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

          p,e=optimize.curve_fit(myfunc,x,y_noise)
          print('p是對參數(shù)的估計值:\n',p)
          print('e是4個估計參數(shù)的協(xié)方差矩陣:\n',e)
          p是對參數(shù)的估計值:
           [3.28292536 1.90102739 1.2478838  0.78989363]
          e是4個估計參數(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]]

          稀疏矩陣的存儲

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

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

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

          稀疏矩陣的運算

          由于稀疏矩陣數(shù)據(jù)量大,一般不使用普通矩陣作為參數(shù)來構(gòu)建,而是采用非零數(shù)據(jù)點及坐標的形式構(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中的圖像處理

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

          1 圖像平滑

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

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

          ndimage.median_filter 實現(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)和銳化

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

          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') #邊緣檢測
          plt.subplot(133)
          prewitt=ndimage.prewitt(image)
          plt.title("prewitt")
          plt.imshow(prewitt)
          plt.axis('off')

          SciPy中的信號處理

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

          Python中的 scipy.signal 模塊專門用于信號處理。

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

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

          2 信號的卷積

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

          2 信號的卷積

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

          3 信號的時頻分析

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

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

          SciPy中利用 fft 方法將信號從時域變換到頻率,用 ifft 方法 將頻域信號逆變換回時域

          11. Note

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

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

          歐式距離distance的代碼:

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

          水平堆疊

          np.hstack((a,b))

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

          np.max(array,axis=0)

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

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

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

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

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

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

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

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

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

          pyecharts中通過 Funnel 繪制漏斗圖。

          pyecharts利用 Kline 繪制K線圖

          pyecharts利用 Gauge 繪制儀表盤。

          pyecharts中利用 Sankey 繪制桑基圖。

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

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

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

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

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

          加油!

          感謝!

          努力!

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

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

          相等運算符

          相等運算符==會為兩個不同類型的操作數(shù)轉(zhuǎ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,就可以看出==相等運算符,在對兩個操作數(shù)進行比較之前,會將兩個操作數(shù)轉(zhuǎn)換成相同的類型。

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

          當兩個操作數(shù)都是對象時,JavaScript會比較其內(nèi)部引用,當且僅當他們的引用指向內(nèi)存中的相同對象時才相等,即他們在棧內(nèi)存中的引用地址相同。

          嚴格相等運算符

          嚴格相等運算符===不會對操作數(shù)進行類型轉(zhuǎn)換,只有當值相等并且類型也是相等時才會返回 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é)果可以看出,不同類型的值進行比較時,會返回 false。

          不等運算符

          不等運算符 !=只有當操作數(shù)不相等時才返回true,如果兩操作數(shù)不是同一類型,會將操作數(shù)轉(zhuǎ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ù)為對象類型,JavaScript會比較其內(nèi)部引用地址,僅當他們在內(nèi)存中引用不同對象時不相等。

          嚴格不等運算符

          嚴格不等運算符 !==當操作數(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
          

          大于運算符

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

          示例:

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

          大于等于運算符

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

          示例:

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

          小于運算符

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

          示例:

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

          小于等于運算符

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

          示例:

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

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

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

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

          動手小練習

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

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

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

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

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

          // 字符串(String)
          let a='word';
          // 數(shù)字(Number)
          let b=123;
          // 布爾(Boolean)
          let c=true;
          // 對空(Null)
          let d=null;
          // 未定義(Undefined)
          let e;
          // Symbol
          let f=Symbol('123');
          // 對象(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類型的對象時比較方便。

          2、判斷已知對象類型的方法: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 后面一定要是對象類型,并且大小寫不能錯,該方法適合一些條件選擇或分支。

          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

          此方法雖稍顯繁瑣,但只需簡單封裝一個方法即可。

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

          云靜Admin通用后臺:

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

          開發(fā)文檔:

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


          主站蜘蛛池模板: 免费一区二区无码东京热| 国产精品久久久久久麻豆一区| 国产一区麻豆剧传媒果冻精品| 久久久久久免费一区二区三区| 国产欧美色一区二区三区| 亚洲AV乱码一区二区三区林ゆな| 国产av一区二区精品久久凹凸| 日韩亚洲一区二区三区| 日韩精品免费一区二区三区| 亚洲制服丝袜一区二区三区| 日韩精品乱码AV一区二区| 午夜天堂一区人妻| 色系一区二区三区四区五区| 国产精品一区二区久久| 久久人妻内射无码一区三区| 国产成人无码一区二区三区| 人妻AV中文字幕一区二区三区| 无码人妻精品一区二区| 国产剧情一区二区| 亚洲丰满熟女一区二区v| 精品国产亚洲一区二区三区| 久久婷婷色一区二区三区| 爆乳无码AV一区二区三区| 一区二区三区在线观看免费| 国产精品揄拍一区二区| 一区二区三区免费高清视频| 日韩一区二区三区四区不卡| 日韩精品人妻一区二区中文八零| 曰韩精品无码一区二区三区| 亚洲乱码国产一区网址| 国产综合精品一区二区| 国产精品区一区二区三| 精品视频一区二区观看| 一区二区三区四区电影视频在线观看| 无码视频一区二区三区| 国产a久久精品一区二区三区| 精品乱码一区二区三区在线| 亚洲国产一区二区视频网站| 久久se精品一区精品二区国产| 丝袜无码一区二区三区| 一区二区三区在线|欧|