Python中的數(shù)據(jù)分析詳解
數(shù)據(jù)分析概述
python在數(shù)據(jù)分析方面有哪些優(yōu)勢
- Python不受數(shù)據(jù)規(guī)模的約束,能夠處理大規(guī)模數(shù)據(jù)。
- Python的sklearn庫提供了豐富的數(shù)據(jù)挖掘和人工智能方法,為使用者分析各種場景提供方法支持。
- Python的自動數(shù)據(jù)分析能夠顯著提升工作效率。
- Python能夠繪制各種前沿的數(shù)據(jù)圖表。
- Python在海量數(shù)據(jù)采集方面也有獨特的優(yōu)勢。
數(shù)據(jù)分析的流程是什么?
- 數(shù)據(jù)采集
- 數(shù)據(jù)整理和存儲
- 數(shù)據(jù)分析和可視化
- 數(shù)據(jù)報表和總結(jié)
數(shù)據(jù)的導(dǎo)入和導(dǎo)出
導(dǎo)入數(shù)據(jù)
Excel格式
#excel有xls,xlsx兩種格式,都可以使用read_excel #read_excel方法返回的結(jié)果是DataFrame,DataFrame的一列對應(yīng)著Excel的一列。 import pandas as pd data = pd.read_excel(path) """ 參數(shù)含義: (1)sheet_name參數(shù):該參數(shù)用于指定導(dǎo)入Excel文件中的哪一個sheet,如果不填寫這個參數(shù),則默認(rèn)導(dǎo)入第一個sheet。 (2) index_col參數(shù):該參數(shù)用于指定表格的哪一列作為DataFrame的行索引,從0開始計數(shù)。 (3)nrows參數(shù):該參數(shù)可以控制導(dǎo)入的行數(shù),該參數(shù)在導(dǎo)入文件體積較大時比較有用。 (4)skipfooter參數(shù):該參數(shù)可以在導(dǎo)入數(shù)據(jù)時,跳過表格底部的若干行。 (5)header參數(shù):當(dāng)使用Pandas的read_excel方法導(dǎo)入Excel文件時,默認(rèn)表格的第一行為字段名。如果表格的第一段不是字段名,則需要使用該參數(shù)設(shè)置字段名。 (6)usecols參數(shù):該參數(shù)可以控制導(dǎo)入Excel表格中的哪些列。 (7)names參數(shù):該參數(shù)可以對導(dǎo)入數(shù)據(jù)的列名進(jìn)行重命名。 """
csv格式
#CSV是一種用分隔符分割的文件格式。由于Excel文件在存放巨量數(shù)據(jù)時會占用極大空間,且導(dǎo)入時也存在占用極大內(nèi)存的缺點,因此,巨量數(shù)據(jù)常采用CSV格式。 import pandas as pd data = pd.read_csv(path,encoding="utf-8") #sep參數(shù)表示要導(dǎo)入的csv文件的分隔符,默認(rèn)值是半角逗號 data = pd.read_csv(path,sep=',',encoding="utf-8")
json格式
#用Pandas模塊的read_json方法導(dǎo)入JSON數(shù)據(jù),其中的參數(shù)為JSON文件的路徑。 import pandas as pd data = pd.read_json(path)
txt格式
#需要導(dǎo)入存在于txt文件中的數(shù)據(jù)時,可以使用pandas模塊中的read_table方法。它的參數(shù)和用法與read_csv方法類似。 import pandas as pd data = pd.read_table(path)
導(dǎo)出數(shù)據(jù)
CSV格式數(shù)據(jù)輸出
import pandas as pd data = pd.read_csv(path,sep=",",encoding="utf-8",nrows=10) data.to_csv("test.csv",nrows=10) """ 1、CSV格式數(shù)據(jù)輸出 對于pandas庫的to_csv方法,有下列參數(shù)說明: path_or_buf:要保存的路徑及文件名。 sep:分割符,默認(rèn)為“,”。 columns:指定要輸出的列,用列名,列表表示,默認(rèn)值為None。 header:是否輸出列名,默認(rèn)值為True。 index:是否輸出索引,默認(rèn)值為True。 encoding:編碼方式,默認(rèn)值為“utf-8”。 """
xlsx格式數(shù)據(jù)輸出
import pandas as pd data = pd.read_excel(path) data.to_excel(path,encoding='gbk') """ sheet_name:字符串,默認(rèn)值為“Sheet1”,指包含DataFrame數(shù)據(jù)的表的名稱。 np_rep:字符串,默認(rèn)值為 ‘ '。指缺失數(shù)據(jù)的表示方式 columes:序列,可選參數(shù),要編輯的列 header:布爾型或字符串列表,默認(rèn)值為True。如果給定字符串列表,則表示它是列名稱的別名。 index:布爾型,默認(rèn)值為True,行名(索引) index_label:字符串或序列,默認(rèn)值為None。如果文件數(shù)據(jù)使用多索引,則需使用序列。 encoding:指定Excel文件的編碼方式,默認(rèn)值為None。 """ data2 = pd.read_excel(path) work = pd.ExcelWriter('path') data.to_excel(work,sheet_name='data') data2.to_excel(work,sheet_name="data2")
數(shù)據(jù)預(yù)處理
熟悉數(shù)據(jù)
import pandas as pd data = pd.read_csv(path) #使用info()方法查看數(shù)據(jù)基本類型 data.info() #查看數(shù)據(jù)表的大小 d = data.shape[0] w = data.shape[1] #數(shù)據(jù)格式的查看 type(data) #series的查看 data.dtype #dataframe的查看 data.dtypes #查看具體的數(shù)據(jù)分布在進(jìn)行數(shù)據(jù)分析時,常常需要對對數(shù)據(jù)的分布進(jìn)行初步分析,包括統(tǒng)計數(shù)據(jù)中各元素的個數(shù),均值、方差、最小值、最大值和分位數(shù) data.describe()
缺失值處理
import pandas as pd data = pd.read_csv(path) #缺失值檢查 #isnull()方法。isnull()函數(shù)返回值為布爾值,如果數(shù)據(jù)存在缺失值,返回True;否則,返回False。 data.isnull() #缺失值刪除 #dropna()方法用于刪除含有缺失值的行。 data.dropna() #當(dāng)某行或某列值都為NaN時,才刪除整行或整列。這種情況該如何處理? data.dropna(how='all',axis=0)#當(dāng)整行都是None時,刪除整行 #當(dāng)某行有一個數(shù)據(jù)為NaN時,就刪除整行和當(dāng)某列有一個數(shù)據(jù)為NaN時, data.dropna(how='any',axis=0) data.dropna(how='any',axis=1) #缺失值替換/填充 #在data數(shù)據(jù)中,利用各列值的均值填補缺失數(shù)據(jù),該如何用Python實現(xiàn)? data.fillna(data.mean()) #使用近鄰填補法,即利用缺失值最近鄰居的值來填補數(shù)據(jù),對df數(shù)據(jù)中的缺失值進(jìn)行填補,這種情況該如何實現(xiàn)? data.fillna(method='bfill')#在本案例中,可以將fillna()方法的method參數(shù)設(shè)置為bfill,來使用缺失值后面的數(shù)據(jù)進(jìn)行填充。 #若使用缺失值前面的值進(jìn)行填充來填補數(shù)據(jù),這種情況又該如何實現(xiàn)? data.fillna(method='ffill') #請利用二次多項式插值法對df數(shù)據(jù)中A列的缺失值進(jìn)行填充。 data['A'].fillna(method='polynomial',order=2) #請使用Python完成對df數(shù)據(jù)中A列的三次樣條插值填充。 data['A'].fillna(method='spline',order=3)
重復(fù)值處理
""" 利用duplicated()方法檢測冗余的行或列,默認(rèn)是判斷全部列中的值是否全部重復(fù),并返回布爾類型的結(jié)果。對于完全沒有重復(fù)的行,返回值為False。對于有重復(fù)值的行,第一次出現(xiàn)重復(fù)的那一行返回False,其余的返回True。 """ import pandas as pd data = pd.read_csv(path) data.duplicated() #drop_duplicates()方法。,利用duplicates()方法去除冗余數(shù)據(jù),即刪除冗余的所有行,默認(rèn)是判斷全部列 data.drop_duplicates()
檢測異常值
#query方法和boxplot方法。首先使用pandas庫中的query方法查詢數(shù)據(jù)中是否有異常值。然后通過boxplot方法檢測異常值。 import pandas as pd import matplotlib.pyplot as plt data = pd.read_csv(path) #假設(shè)B列大于1000 data.query('B<1000') #畫圖 plt.boxplot(df['B']) """ 處理異常值的方法 (1)最常用的方式是刪除。 (2)將異常值當(dāng)缺失值處理,以某個值填充。 (3)將異常值當(dāng)特殊情況進(jìn)行分析,研究異常值出現(xiàn)的原因。 """
數(shù)據(jù)類型檢查
#利用numpy庫的arange函數(shù)創(chuàng)建一維整數(shù)數(shù)組,并查看數(shù)據(jù)類型。 import numpy as np arr = np.arange(0,10) arr.dtype #利用numpy庫的arange函數(shù)創(chuàng)建一維浮點數(shù)數(shù)組arr1,然后將arr1數(shù)組的數(shù)據(jù)類型轉(zhuǎn)換為整型。 arr1 = np.arange(1,5,0.5) arr1.astype(np.int)
索引設(shè)置
""" pandas中索引的作用 (1)更方便地查詢數(shù)據(jù)。 (2)使用索引可以提升查詢性能。 """ #1、添加索引 import pandas as pd import numpy as np data = pd.Series([i for i in range(1,6)],['a','b','c','d','e']) #某公司銷售數(shù)據(jù)集“work.csv”內(nèi)容如下,請設(shè)定日期為索引,并用Python實現(xiàn)。 #set_index()函數(shù),可以指定某一字段為索引 data = pd.read_csv("work.csv") data1 = data.set_index('date') #更改索引在該案例中,除了可以用set_index方法重置索引外,還可以在導(dǎo)入csv文件的過程中,設(shè)置index_col參數(shù)重置索引,代碼及結(jié)果如下: data2 = pd.read_csv("work.csv",sep=",",encoding="gbk",index_col="日期") #重建索引 data3 = data.reindex([....]) #重建行和列 data4 = data.reindex(index=new_index,columns=new_columns)
其他
#大小寫轉(zhuǎn)換 lower()#大變小 upper()#小變大 #按列增加數(shù)據(jù) import pandas as pd import numpy as np data = pd.read_csv(path) data.insert(num,'name',value)#num是第幾列,name是列名,value是值 data.loc[:,'name'] = value #按行增加數(shù)據(jù) data.append(new_data) data.loc['index'] = value data.iloc[num,:] = value#num是第幾行 #數(shù)據(jù)刪除 """ 關(guān)鍵技術(shù):該案例中,使用DataFrame的drop()方法,刪除數(shù)據(jù)中某一列。drop()方法的參數(shù)說明如下: labels:表示行標(biāo)簽或列標(biāo)簽。 axis:axis=0,表示按行刪除,axis=1,表示按列刪除。默認(rèn)值為0。 index:刪除行,默認(rèn)為None。 columns:刪除列,默認(rèn)為None。 inplace:可選參數(shù),對原數(shù)組作出修改并返回一個新數(shù)組。默認(rèn)是False,如果為True,那么原數(shù)組直接被替換。 """
數(shù)據(jù)的選擇和運算
數(shù)據(jù)的索引和切片
a[m:n:p],m開始,n結(jié)束,p步長 a[:,0]#第一列 #布爾索引 import numpy as np arr = np.arange(3) bool1 = np.array(True,False,True) arr[bool1]#arr([0,1]) #花式索引 arr[arr>value] arr[arr<=value]=0 #series可以用索引數(shù)值來選取 #切片 #[下界 :上界 :步長] #loc中橫向索引是確定的 #loc中可以加條件條件使用法語法為df.loc[進(jìn)行篩選的條件],如果條件為真,則選出符合條件的結(jié)果。復(fù)合條件包括: &(且 = 與), |(或), ~(取反 = 非),通過篩選函數(shù)進(jìn)行篩選,常見的函數(shù)式有 isin(), where() 等。 #iloc 的使用與 loc 完全類似,只不過是針對“位置( = 第幾個 )”進(jìn)行篩選。函數(shù)語法為:.iloc[整數(shù)、整數(shù)列表、整數(shù)切片、布爾列表以及函數(shù)] #①函數(shù) = 自定義函數(shù) (函數(shù)的返回值需要是合法對象 (= 整數(shù)、整數(shù)列表、整數(shù)切片、布爾列表)) #②匿名函數(shù) lambda :使用方法 #語法:lambda 自變量: slice(start = 下界, stop = 上界, step = 步長)。
多表合并
import pandas as pd import numpy as np pd.merage(data1,data2,on=index)#index可以是一個鍵,也可以是一個列表 #參數(shù)how,left用data1的鍵,right用data2的,outer使用并集,inner使用交集 #使用join()方法合并數(shù)據(jù)集 #DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False) #使用concat()方法合并數(shù)據(jù)集 pd.concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False) #可以利用count()方法進(jìn)行計算非空個數(shù),并利用參數(shù)axis來控制行列的計算 #quantile() data.quantile(0.35)#淘汰35%的人 data.sort_values()#sort_values()方法可以根據(jù)指定行/列進(jìn)行排序。 #參數(shù) #by:要排序的名稱列表 #axis:軸,0代表行,1代表列,默認(rèn)是0 #按照數(shù)據(jù)進(jìn)行排序,首先按照C列進(jìn)行降序排序,在C列相同的情況下,按照B列進(jìn)行升序排序。 data.sort_values(by=['c','b'],ascending=[False,True])
數(shù)據(jù)分類匯總和統(tǒng)計
Groupby分類統(tǒng)計
Hadley Wickham創(chuàng)造了一個用于表示分組運算的術(shù)語“split-apply-combine”(拆分-應(yīng)用-合并)。第一個階段,pandas對象中的數(shù)據(jù)會根據(jù)你所提供的一個或多個鍵被拆分(split)為多組。拆分操作是在對象的特定軸上執(zhí)行的。例如,DataFrame可以在其行(axis=0)或列(axis=1)上進(jìn)行分組。然后,將一個函數(shù)應(yīng)用(apply)到各個分組并產(chǎn)生一個新值。最后,所有這些函數(shù)的執(zhí)行結(jié)果會被合并(combine)到最終的結(jié)果對象中。結(jié)果對象的形式一般取決于數(shù)據(jù)上所執(zhí)行的操作。下圖大致說明了一個簡單的分組聚合過程。
按列分組
按列分組分為以下三種模式:
第一種:df.groupby(col),返回一個按列進(jìn)行分組的groupby對象;
第二種:df.groupby([col1,col2]),返回一個按多列進(jìn)行分組的groupby對象;
第三種:df.groupby(col1)[col2] 或者 df[col2].groupby(col1),兩者含義相同,返回按列col1進(jìn)行分組后,col2的值;
時間序列
Datetime 模塊
Python標(biāo)準(zhǔn)庫中包含了datetime模塊,該模塊提供了非常強大的功能來處理日期和時間。
datatime模塊是在time模塊的基礎(chǔ)上做了封裝,提供了更多更好用的類,常用的類有date、time、datetime、timedelta、tzinfo。
""" 請利用Python獲取當(dāng)前日期。 關(guān)鍵技術(shù):可以利用datetime模塊date類的today()方法將當(dāng)前日期保存在變量中。 通過使用date.today(),可以創(chuàng)建一個date類對象,其中包含了日期元素,如年、月、日,但不包含時間元素,比如時、分、秒。最后,可以使用year、month和day來捕獲具體的日期元素 """ import datetime date = datetime.date.today() print(date) print(date.year) print(date.month) print(date.day) """ 利用Python獲取當(dāng)前日期和時間。 關(guān)鍵技術(shù):可以利用datetime模塊datetime類的today()方法將當(dāng)前日期和時間保存在變量中。 """ import datetime date = datetime.datetime.today() print(date) print(date.year) print(date.month) print(date.day) """ 請利用Python獲取當(dāng)前時間。 關(guān)鍵技術(shù):可以利用datetime模塊datetime類的now()方法將當(dāng)前日期和時間保存在變量中 date = datetime.datetime.now() date """ """ 時間戳與time模塊 時間戳是以格林威治時間1970年01月01日00時00分00秒為基準(zhǔn)計算所經(jīng)過時間的秒數(shù),是一個浮點數(shù)。Python的內(nèi)置模塊time和datetime都可以對時間格式數(shù)據(jù)進(jìn)行轉(zhuǎn)換,如時間戳和時間字符串的相互轉(zhuǎn)換。 """ import time time.mktime(time.localtime()) """ 請利用Python將時間戳數(shù)據(jù)轉(zhuǎn)換成系統(tǒng)時間。 關(guān)鍵技術(shù):可以利用time模塊的strftime()函數(shù)可以將時間戳轉(zhuǎn)換成系統(tǒng)時間。 """ import pandas as pd import time time = time.strftime(("%Y-%m-%d %H:%M:%S"),time.localtime(time.mktime(time.localtime()))) """ 請利用Python將字符串'2022-01-15'轉(zhuǎn)換成時間類型的數(shù)據(jù)格式。 關(guān)鍵技術(shù):在可以用strptime函數(shù)將日期字符串轉(zhuǎn)換為datetime數(shù)據(jù)類型,可以用Pandas的to_datetime()函數(shù)將日期字符串轉(zhuǎn)換為datetime數(shù)據(jù)類型。to_datetime()函數(shù)轉(zhuǎn)化后的時間是精準(zhǔn)到時分秒精度的。 """ import datetime datestr = "2022-01-15" datetime.datetime.strptime(datestr,"%Y-%m-%d") #字符串和時間轉(zhuǎn)換 import pnadas as pd datestrs = "2022/01/15" pd.to_datetime(datestrs) """ 給定兩個時間類型的數(shù)據(jù),計算兩個時間的不同之處。 關(guān)鍵技術(shù):利用datetime將時間類型數(shù)據(jù)進(jìn)行轉(zhuǎn)換,然后利用減法運算計算時間的不同之處,默認(rèn)輸出結(jié)果轉(zhuǎn)換為用(“天”,“秒”)表達(dá)。 """ import datetime delta = datetime.datetime(2022,1,16) - datetime.datetime(2022,1,11,1,12) """ 如果要將輸出結(jié)果轉(zhuǎn)換以“天”為單位,此時應(yīng)該如何處理? 關(guān)鍵技術(shù):針對上例中的delta變量,利用delta.days可以將輸出結(jié)果轉(zhuǎn)換以“天”為單位。 """ delta.days """ 【例】如果要將輸出結(jié)果轉(zhuǎn)換以“秒”為單位,此時應(yīng)該如何處理? 關(guān)鍵技術(shù):針對上例中的delta變量,利用delta.seconds可以將輸出結(jié)果轉(zhuǎn)換以“秒”為單位 """ delta.seconds
數(shù)據(jù)可視化
例1 繪制帶有中文標(biāo)題、標(biāo)簽和圖例的正弦和余弦圖像。
import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.font_manager as fm t = np.arange(0.0,2.0*np.pi,0.01) s = np.sin(t) c = np.cos(t) plt.plot(t,s,label='正弦',color='red') plt.plot(t,c,label='余弦',color='blue') plt.xlabel("x-變量") plt.ylabel("y") plt.xlabel('x-變量', #標(biāo)簽文本 fontproperties='STKAITI', #字體 fontsize=18) #字號 plt.ylabel('y-正弦余弦函數(shù)值', fontproperties='simhei', fontsize=18) plt.title('sin-cos函數(shù)圖像', #標(biāo)題文本 fontproperties='STLITI', #字體 fontsize=24) #字號
例2 繪制余弦曲線散點圖。
import numpy as np from matplotlib import * t = np.arange(0.0,np.pi*2,0.01) c = np.cos(t) plt.scatter(t,c)
到此這篇關(guān)于Python中的數(shù)據(jù)分析詳解的文章就介紹到這了,更多相關(guān)Python數(shù)據(jù)分析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 基于 tkinter 做個學(xué)生版的計算器
這篇文章主要介紹了基于Python編寫一個計算器程序,實現(xiàn)簡單的加減乘除和取余二元運算,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-09-09Python+fuzzywuzzy計算兩個字符串之間的相似度
fuzzywuzzy?可以計算兩個字符串之間的相似度,它依據(jù)?Levenshtein?Distance?算法來進(jìn)行計算,該算法又叫?Edit?Distance?算法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-09-09基于telepath庫實現(xiàn)Python和JavaScript之間交換數(shù)據(jù)
telepath是一個Django庫,用于在Python和JavaScript之間交換數(shù)據(jù),使您可以構(gòu)建具有豐富客戶端接口的應(yīng)用程序,同時將業(yè)務(wù)邏輯保留在服務(wù)器端代碼中。2021-05-05pycharm實現(xiàn)設(shè)置自動的參數(shù)注釋標(biāo)識
這篇文章主要介紹了pycharm實現(xiàn)設(shè)置自動的參數(shù)注釋標(biāo)識,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02python項目127.0.0.1:5000訪問失敗問題解決
Windows環(huán)境下啟動python項目,接口訪問失敗,本文給大家分享python項目127.0.0.1:5000訪問失敗問題解決方法,感興趣的朋友跟隨小編一起看看吧2023-09-09Python?任務(wù)自動化工具nox?的配置與?API詳情
這篇文章主要介紹了Python?任務(wù)自動化工具nox?的配置與?API詳情,Nox?會話是通過被@nox.session裝飾的標(biāo)準(zhǔn)?Python?函數(shù)來配置的,具體詳情下文相關(guān)介紹需要的小伙伴可以參考一下2022-07-07pandas刪除部分?jǐn)?shù)據(jù)后重新生成索引的實現(xiàn)
這篇文章主要介紹了pandas刪除部分?jǐn)?shù)據(jù)后重新生成索引的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07