<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一文帶你斬殺Python之Numpy Pandas全部操作

          共 8846字,需瀏覽 18分鐘

           ·

          2022-03-04 13:37


          Numpy簡介

          Numpy專門針對ndarray的操作和運算進行了設(shè)計,所以數(shù)組的存儲效率和輸入輸出性能遠優(yōu)于Python中的嵌套列表,數(shù)組越大,Numpy的優(yōu)勢就越明顯。Numpy系統(tǒng)是Python的一種開源的數(shù)值計算擴展。這種工具可用來存儲和處理大型矩陣,比Python自身的嵌套列表(nested list structure)結(jié)構(gòu)要高效的多(該結(jié)構(gòu)也可以用來表示矩陣(matrix))。據(jù)說NumPy將Python相當于變成一種免費的更強大的MATLAB系統(tǒng)。

          ndarray中的所有元素的類型都是相同的,而Python列表中的元素類型是任意的,所以ndarray在存儲元素時內(nèi)存可以連續(xù),而python原生lis就t只能通過尋址方式找到下一個元素,這雖然也導致了在通用性能方面Numpy的ndarray不及Python原生list,但在科學計算中,Numpy的ndarray就可以省掉很多循環(huán)語句,代碼使用方面比Python原生list簡單的多。

          總的來說,在科學計算和大數(shù)據(jù)的處理上面,numpy的優(yōu)勢遠遠超過了原生態(tài)的Python內(nèi)置方法,正所謂“工欲善其事必先利其器”,任何一門工程學科的發(fā)現(xiàn)和精進,都離不開各種軟件的升級和迭代。

          Numpy操作集合

          1、不同維度數(shù)據(jù)的表示

          1.1 一維數(shù)據(jù)的表示

          #?列表
          [1,2,'a',4]

          在Python中,最為常見的數(shù)據(jù)類型就是列表,列表是一維的數(shù)據(jù),同時也是我們處理數(shù)據(jù)的常見集裝箱。

          在anaconda里面的jupyter notebook里面,我們直接使用pip安裝這一個庫,一般的anaconda會自帶numpy這一個第三方庫。

          在使用numpy的時候,首先要引入這一個第三方庫,使用:import numpy as np即可,便于為我們后面的方法屬性調(diào)用。

          在構(gòu)造最為基本的numpy數(shù)據(jù)時,我們使用numpy的array()方法,里面就是一個列表形式的,可以是多維數(shù)組,最終構(gòu)造成:ndarray類型

          #?集合
          set([1,'a',3,4])?#集合的元素唯一且無序
          #?元組
          tuple([1,'a',3,4])#元組的元素不可變

          對于Python里面的常見的幾種數(shù)據(jù)類型:字符串、元組、列表、字典、集合,重點需要注意的是字符串和元組是不可修改的,但是可以通過索引來組合和切斷這些元素,例如:

          **?我們發(fā)現(xiàn),元組是不可以修改的,但是我們的列表卻可以**

          那么就會有小伙伴疑問了,那么不可修改,怎么辦!我們可以通過下面的方法:

          直接在同一個元組上更新是不可行的,但是可以通過拷貝現(xiàn)有的元組片段構(gòu)造一個新的元組的方式解決。

          通過分片的方法讓元組拆分成兩部分,然后再使用連接操作符(+)合并成一個新元組,最后將原來的變量名(temp)指向連接好的新元組。在這里就要注意了,逗號是必須的,小括號也是必須的!

          temp?=?('小雞','小狗','小豬')
          temp?=?temp[:2]?+?('小猴子',)?+?temp[2:]
          print(temp)
          ?????
          ('小雞',?'小狗',?'小猴子',?'小豬')

          刪除元組中的元素:對于元組是不可變的原則來說,單獨刪除一個元素是不可能的,當然你可以利用切片的方式更新元組,間接的刪除一個元素。

          ????temp?=?('小雞','小狗','小豬')
          ????temp?=?temp[:1]?+?temp[2:]
          ????print(temp)
          ?????
          ????('小雞',?'小豬')

          在日常中很少用del去刪除整個元組,因為Python的回收機制會在這個元組不再被使用的時候自動刪除。如果整個刪除那么就會報錯?。?!

          1.2 二維數(shù)據(jù)的表示

          最簡單的方法就是使用列表進行二維數(shù)組的創(chuàng)建,那么如果我們不使用這種方法,我們應(yīng)該如何去做呢?

          答案是:numpy的array()

          我們也可以將一個numpy裝換為dataframe類型,也就是我們的二維數(shù)據(jù)表

          我們使用Python里面的最強大的pandas庫,進行處理,構(gòu)造一個二維數(shù)組,使用pandas里面的column方法,對數(shù)組的標簽進行自定義。

          1.3 三維數(shù)據(jù)的表示

          如何去理解這個維度呢?首先我們知道任何一個數(shù)組都是需要一個[]進行包裹的,其實最為簡單的判斷方法就是看[]的個數(shù),從左到右,數(shù)一下,三個,那么就是三維數(shù)組,簡單粗暴但是言簡意賅。

          其實從數(shù)據(jù)表里面我們可以看出,如果需要組成這樣二維單獨的數(shù)據(jù)表,那么就是二維數(shù)據(jù),在單元的數(shù)據(jù)表中,仍然存在數(shù)組的嵌套,那么就是維度的+1

          2、 為什么要使用Numpy

          2.1、Numpy的ndarray具有廣播功能

          查看版本

          **?np.array?**

          可以查看官方的解釋,同時我們也可以使用np.info(np.array)對方法進行查看和學習

          有時候我們需要產(chǎn)生一個特定范圍的的數(shù)組,而且我們希望數(shù)據(jù)是平均的分配,這個時候我們我們就可以使用numpy的linspace()方法了,它的功能就是產(chǎn)生一個特定平均份數(shù)的一維數(shù)組。

          np.linspace(start,end,count):注意它會將開始元素和末尾的元素都取到,然后按照count份數(shù)進行分割

          np.empty(行,列):也就是產(chǎn)生特定的維度,多少行和列的數(shù)組

          q?=?np.array([1,2,3,4],dtype=np.complex128)???
          print("數(shù)據(jù)類型",type(q))???????????#打印數(shù)組數(shù)據(jù)類型??
          print("數(shù)組元素數(shù)據(jù)類型:",q.dtype)?#打印數(shù)組元素數(shù)據(jù)類型??
          print("數(shù)組元素總數(shù):",q.size)??????#打印數(shù)組尺寸,即數(shù)組元素總數(shù)??
          print("數(shù)組形狀:",q.shape)?????????#打印數(shù)組形狀??
          print("數(shù)組的維度數(shù)目",q.ndim)??????#打印數(shù)組的維度數(shù)目????

          初學者總是把這些屬性記成了方法,注意我們的屬性是沒有()的

          2.2 Numpy數(shù)組的性能比Python原生數(shù)據(jù)類型高

          通過這個例子,我們可以看到numpy的效率遠遠高于我們的list列表原生態(tài)的執(zhí)行速度和效率

          3 ndarray的屬性和基本操作

          3.1 ndarray的基本屬性

          ?3.2 ndarray元素類型

          那么有時候我們再想,如果數(shù)組的長度不一致,那么會不會有影響呢?

          通過例子,我們發(fā)現(xiàn),如果構(gòu)造的數(shù)據(jù)長度不一致,不會報錯,但是會發(fā)出警告,也就是說這種方法,在Python里面還是支持的,但是我們發(fā)現(xiàn)它被單獨的構(gòu)造為一個list類型了,元素大小也就發(fā)生了改變,將一個列表嵌套在一個列表當中。

          我們可以看看長度一致的情況:

          **?顯然是符合我們的要求的**

          3.3 創(chuàng)建ndarray的方式

          創(chuàng)建的時候可以指定我們的數(shù)據(jù)類型

          np.arange(),返回的是序列數(shù)組,最后一個取不到,一維的

          np.ones(3,4),返回的是3行4列的全1數(shù)組,如果里面有三個數(shù)字,那么第一數(shù)字代表里面,有多少個單獨獨立的數(shù)組

          np.zeros(數(shù)組,行,列)生成一個多少個獨立數(shù)組,每個獨立數(shù)組里面有多少行,多少列,最后類型是全0數(shù)組,如下:

          np.full((n,m),value),生成一個特定維度的數(shù)組,且元素由自己定義

          np.eye(n),生成一個nxn的單位矩陣

          np.ones_like(array),生成一個和目標數(shù)組一樣的全1數(shù)組

          使用np.linspace(),形成新的一維序列數(shù)組

          使用np.concatenate((array1,array2),axis=0):按照行進行拼接

          **??????? np.concatenate((array1,array2),axis=1):按照列進行拼接**

          如果這里使用橫向連接,那么就會報錯,為了防止報錯,我們可以使用裝置功能

          拼接也要注意,是否可以?。?!

          3.4 ndarray對象的變換

          我們可以根據(jù)自己需要變換我們的一維數(shù)組,為多維數(shù)組,使用reshape(行,列)

          這個方法也可以修改,但是要注意的是:resize(方法)修改的是原數(shù)組,而reshape(方法)并沒有修改原數(shù)組,需要賦值給新的變量,該修改才能生效。

          使用swapaxes(1,0)進行維度調(diào)換,原來的行數(shù)變成現(xiàn)在的列數(shù),**不改變原數(shù)組**

          **?flatten()降維處理,一維,不改變原數(shù)組**

          **?astype(np.int16),或者其他的numpy數(shù)據(jù)類型,直接拷貝數(shù)據(jù)類型格式**

          轉(zhuǎn)換為list類型

          3.5 ndarray對象的操作

          索引和我們Python里面的較為相似,如果里面存在多個獨立數(shù)組,那么第一個索引只取出大的數(shù)組框,然后后面對應(yīng)的就是行和列

          對于步長而言,我們要明確的是,索引從0開始,最后一個索引永遠取不到,其次,不寫出的索引為默認取到,對于步長取索引,我們按照空格方法記憶最好!

          4 、Numpy的函數(shù)與數(shù)組運算

          4.1 數(shù)組與標量之間的運算

          4.2 對數(shù)組的元素進行運算

          4.3 數(shù)組之間的運算

          4.4 統(tǒng)計函數(shù)

          np.sum(array,axis=(0,1))對行和列進行求和,那么就是所有元素相加,如果是1,那么就是行,0就是列

          有小伙伴對axis=1,0的具體含義有很多的疑問:這里給出解釋:

          注意看,官方對于0和1的解釋是軸,也就是坐標軸。而坐標軸是有方向的,所以千萬不要用行和列的思維去想axis,因為行和列是沒有方向的,這樣想會在遇到不同的例子時感到困惑。

          根據(jù)官方的說法,1表示橫軸,方向從左到右;0表示縱軸,方向從上到下。當axis=1時,數(shù)組的變化是橫向的,而體現(xiàn)出來的是列的增加或者減少。

          其實axis的重點在于方向,而不是行和列。具體到各種用法而言也是如此。當axis=1時,如果是求平均,那么是從左到右橫向求平均;如果是拼接,那么也是左右橫向拼接;如果是drop,那么也是橫向發(fā)生變化,體現(xiàn)為列的減少。

          當考慮了方向,即axis=1為橫向,axis=0為縱向,而不是行和列,那么所有的例子就都統(tǒng)一了。

          對于這些方法,熟悉和掌握是兩回事,熟能生巧.......

          4.5 隨機函數(shù)

          仔細觀察這兩個方法:

          np.random.rand()是產(chǎn)生0,1的分布隨機數(shù)

          np.random.randn()產(chǎn)生的是標準正態(tài)分布隨機數(shù)

          有n的是正態(tài)分布隨機數(shù),沒有的是0,1的隨機數(shù)

          **?隨機種子**

          數(shù)組打亂

          5 、Numpy數(shù)據(jù)的存取

          5.1 csv數(shù)據(jù)文件的存取

          ?

          一般在numpy里面對于數(shù)據(jù)保存和載入,沒有經(jīng)常性的要求,因為在pandas里面提供了大量的方法,為我們載入和保存。

          Pandas簡介

          Python Data Analysis Library 或 pandas 是基于NumPy 的一種工具,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的。Pandas 納入了大量庫和一些標準的數(shù)據(jù)模型,提供了高效地操作大型數(shù)據(jù)集所需的工具。pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。你很快就會發(fā)現(xiàn),它是使Python成為強大而高效的數(shù)據(jù)分析環(huán)境的重要因素之一。

          Series:一維數(shù)組,與Numpy中的一維array類似。二者與Python基本的數(shù)據(jù)結(jié)構(gòu)List也很相近,其區(qū)別是:List中的元素可以是不同的數(shù)據(jù)類型,而Array和Series中則只允許存儲相同的數(shù)據(jù)類型,這樣可以更有效的使用內(nèi)存,提高運算效率。

          Time- Series:以時間為索引的Series。

          DataFrame:二維的表格型數(shù)據(jù)結(jié)構(gòu)。很多功能與R中的data.frame類似??梢詫ataFrame理解為Series的容器。以下的內(nèi)容主要以DataFrame為主。

          Panel :三維的數(shù)組,可以理解為DataFrame的容器。

          Pandas 有兩種自己獨有的基本數(shù)據(jù)結(jié)構(gòu)。讀者應(yīng)該注意的是,它固然有著兩種數(shù)據(jù)結(jié)構(gòu),因為它依然是 Python 的一個庫,所以,Python 中有的數(shù)據(jù)類型在這里依然適用,也同樣還可以使用類自己定義數(shù)據(jù)類型。只不過,Pandas 里面又定義了兩種數(shù)據(jù)類型:Series 和 DataFrame,它們讓數(shù)據(jù)操作更簡單了。

          Pandas操作集合

          1 、pandas數(shù)據(jù)結(jié)構(gòu)之Series

          1.1 創(chuàng)建Series

          #?導入pandas和numpy
          !pip?install??numpy
          !pip?install??pandas
          import?pandas?as?pd
          import?numpy?as?np

          1.1.1 從ndarray創(chuàng)建Series

          pd.Series():創(chuàng)建一個數(shù)據(jù)表,里面的index提供了索引的方法,給出的是一個列表的類型。

          同時也可以使用index取出標簽索引

          1.1.2 從字典或列表創(chuàng)建Series

          Series提供了字典的類型,進行組合,就算是我們有缺失的鍵值對,但是我們可以自己定義標簽index

          列表也可以完成,這在我們進行爬蟲的時候,我們可以用列表容器進行,存儲

          1.1.3 從標量創(chuàng)建

          創(chuàng)建的是一樣的值,我們可以根據(jù)自己的需要進行

          1.2 對Series的操作

          1.2.1 Series和ndarray相似的操作

          按照索引進行取值和修改

          **?get()方法,如果存在這樣的鍵值對,那么就可以取出來,但是如果不存在,就會使用后面的那個默認值**

          索引切片和我們之前介紹的Python內(nèi)置方法也是一樣,和numpy里面的思想也差不多,這里就不多多贅述了。

          1.2.2 向量化運算

          1.2.3 類似字典的操作

          我們發(fā)現(xiàn)列表解析原來如此的強大,為我們減輕很多的麻煩,其實如果你熟練掌握Python的基礎(chǔ)語法,這一點你也是可以理解的

          1.2.4 時間序列操作

          pd.date_range():

          pd.date_range(
          ????start=None,#開始時間
          ????end=None,#截止時間
          ????periods=None,#總長度
          ????freq=None,#時間間隔
          ????tz=None,#時區(qū)
          ????normalize=False,#是否標準化到midnight
          ????name=None,#date名稱
          ????closed=None,#首尾是否在內(nèi)
          ????**kwargs,
          )??

          asfreq("時間頻率"):改變時間頻率

          索引思想依然一致

          按照步長進行索引的搜尋

          2、pandas數(shù)據(jù)結(jié)構(gòu)之DataFrame

          2.1 DataFrame的創(chuàng)建

          2.1.1 從Series or dicts創(chuàng)建

          通過字典進行構(gòu)造,這也滿足了,我們?nèi)绾伟炎值漕愋娃D(zhuǎn)換為dataframe類型,最后保存在我們需要的數(shù)據(jù)表類型里面

          說實話,在我們的日常數(shù)據(jù)處理里面,我們一般是把字典嵌套在列表里面,那么我們就可以把列表放入這個里面,最后轉(zhuǎn)換為dataframe類型存儲

          2.1.2 從ndarrays或lists的字典創(chuàng)建

          不加index,默認數(shù)字序列

          **?行標簽,column如果和字典的鍵不對應(yīng),那么就會為空,這個是需要注意的**

          2.1.3 從結(jié)構(gòu)化或成對的array/list創(chuàng)建

          三維數(shù)組進行,數(shù)據(jù)表展示,就是這樣的

          2.1.3 從字典的列表創(chuàng)建

          2.2 變量選擇、添加和刪除

          這里交代了數(shù)據(jù)表里面一般拼接,增加和賦值操作

          df['字段']=pd.Series([填充字段],index=[列標簽]),可以達到對數(shù)據(jù)表的增加,在特定的列索引上面添加數(shù)據(jù)

          刪除并顯示值,該列數(shù)據(jù)

          對某一列刪除操作

          **會根據(jù)索引來進行匹配,沒有匹配到索引的,將會填充為NaN?**

          3、 數(shù)據(jù)導出

          為了演示數(shù)據(jù)的導出。這里我們引入一個新的第三方庫tushare,通過這個庫,我們可以輕松的獲取金融相關(guān)數(shù)據(jù),如股票數(shù)據(jù)。

          以下為tushare庫的介紹。其官方文檔地址為:TuShare是一個免費、開源的python財經(jīng)數(shù)據(jù)接口包。主要實現(xiàn)對股票等金融數(shù)據(jù)從數(shù)據(jù)采集、清洗加工 到 數(shù)據(jù)存儲的過程,能夠為金融分析人員提供快速、整潔、和多樣的便于分析的數(shù)據(jù),為他們在數(shù)據(jù)獲取方面極大地減輕工作量,使他們更加專注于策略和模型的研究與實現(xiàn)上。

          考慮到Python pandas包在金融量化分析中體現(xiàn)出的優(yōu)勢,TuShare返回的絕大部數(shù)據(jù)格式都是pandas DataFrame類型,非常便于用pandas/NumPy/Matplotlib進行數(shù)據(jù)分析和可視化。

          當然,如果您習慣了用Excel或者關(guān)系型數(shù)據(jù)庫做分析,您也可以通過TuShare的數(shù)據(jù)存儲功能,將數(shù)據(jù)全部保存到本地后進行分析。

          我們先獲取2017年,第二季度全部股票的業(yè)績報告,盈利能力,營運能力數(shù)據(jù),然后分別用不同方式保存它們。

          !pip?install?wheel
          !pip?install?lxml
          !pip?install?tushare
          !pip?install?beautifulsoup4
          !pip?install?requests
          !pip?install?pandas
          import?tushare?as?ts
          #?業(yè)績報告
          report?=?ts.get_report_data(2017,2)
          #?盈利能力
          profit?=?ts.get_profit_data(2017,2)
          #?營運能力
          operation?=?ts.get_operation_data(2017,2)


          3.1 導出到本地文件

          3.1.1 導出為文本文件

          report.to_csv('./report.csv',index?=?False,encoding?=?'utf-8')
          profit.to_csv('./profit.csv',index?=?False,encoding?=?'utf-8')
          operation.to_csv('./operation.csv',index?=?False,encoding?=?'utf-8')

          3.1.2 導出為Excel文件

          #?可以分別導出到不同的Excel工作簿;
          !pip??install?openpyxl
          report.to_excel('./report.xlsx',index?=False)
          profit.to_excel('./profit.xlsx',index?=?False)
          operation.to_excel('./operation.xlsx',index?=False)

          在pandas里面提供了大量的數(shù)據(jù)載入和數(shù)據(jù)導出的方法

          #先打開一個Excel工作簿,然后分別寫入三個表格,然后關(guān)掉Excel工作簿
          writer?=?pd.ExcelWriter('./finance.xlsx')
          report.to_excel(writer,sheet_name='report',index?=?False)
          profit.to_excel(writer,sheet_name='profit',index?=?False)
          operation.to_excel(writer,sheet_name='operation',index?=?False)
          #?文件寫入完畢后關(guān)掉Excel工作簿
          writer.close()

          3.1.3 導出為Json文件

          #?導出為json文件
          report.to_json('./report.json')

          3.1.4 導出為hdf文件

          #?導出為hdf文件
          !pip?install?tables
          from?warnings?import?filterwarnings
          filterwarnings('ignore')

          report.to_hdf('./report.hdf','report')
          #?ImportError:?HDFStore?requires?PyTables,?"No?module?named?'tables'"?problem?importing

          3.2 將數(shù)據(jù)存儲到數(shù)據(jù)庫

          import?sqlite3
          #?創(chuàng)建連接
          sqlite_con?=?sqlite3.connect('./pandas.db')
          #?寫入數(shù)據(jù)
          report.to_sql('report',sqlite_con,if_exists?='replace',index?=False)
          profit.to_sql('profit',sqlite_con,if_exists?='replace',index?=False)
          operation.to_sql('operation',sqlite_con,if_exists?='replace',index?=False)

          3.3 數(shù)據(jù)導入

          3.3.1 從本地文件

          #?從文本文件
          #?推薦使用相對路徑
          pd.read_csv('./report.csv').head(3)


          #從Excel文件
          #?如果不是被迫選擇Excel文件格式,一般不推薦使用Excel文件格式,速度很慢
          !pip?install?xlrd
          pd.read_excel('./report.xlsx').head()

          4 、分組計算與匯總

          如果說,數(shù)據(jù)的導入和導出是數(shù)據(jù)的前提,那么數(shù)據(jù)的處理分析那么就是數(shù)據(jù)的精華

          按照不同的字段進行分組聚合統(tǒng)計,count()計數(shù),sum()求和

          按照不同的字段分別分組聚合,然后進行統(tǒng)計分析,輸出需要顯示的指標變量的值

          注意這里的describe()用于描述性分析,直接可以使用該方法

          5、數(shù)據(jù)融合

          構(gòu)造兩個臨時數(shù)據(jù)表,用于我們后面的操作

          直接進行連接

          Pandas高級操作補充

          對于pandas的高級操作,無非是進行數(shù)據(jù)增刪改查,也就是分組聚合,排序處理等,在處理數(shù)也可以使用其他的工具,例如:MySQL數(shù)據(jù)庫的分析,也還是不錯的!?。?/strong>


          瀏覽 79
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  狠狠操五月天 | 蜜芽亚洲av无码精品色午夜 | 韩一区二区三区 | 免费A∨在线观看 | 大香蕉伊人免费在线观看 |