python中數據基本分析過程
數據分析的基本過程
numpy中一維數組array
import numpy as np
a = np.array([2,3,4,5])
查詢數據a的第一個元素:a[0];
第一至三個數:a[0:2];
循環訪問:for i in a: actions
查詢a的數據類型:a.dtype
numpy中的一維數據與python中列表的區別:
- numpy中的一維數組 可以進行向量相加,比如a = np.array([1,2,3]), b = np.array([2,3,4]), 則和為一個新的一維數組[3,5,7]; 而python中為列表合併a=[1,2,3], b=[2,3,4], 則a+b=[1,2,3,2,3,4]
- numpy中的一維數組 可以進行標量相乘,比如a*4得到一維數組[4,8,12]; 而python列表中a*4=[1,2,3, 1,2,3, 1,2,3, 1,2,3,]
- numpy中的一維數組可以使用mean(),std()等統計平均值和標準差;python中列表無此功能。
- numpy中的一維數據中的每個數據均為同一種數據類型,python列表中數據可以為不同類型。
pandas中的一維數組
import pandas as pd
# index為索引,對應到數組裡的每一個值
stockPrice=pd.Series([54.6,100.500.6,1456.4], index=[『tecent』, 『alibaba』,』apple』,』google』])
#desribe()獲取數組的描述統計信息
stockPrice.describe()
#根據位置值獲取數值信息:iloc
stockPrice.iloc[0]
#根據索引獲取數值信息:loc
stockPrice.loc[『tecent』]
pandas中一維數組運算
向量相加: 相同的索引名稱相加,不同的為缺失值,相加為NaN
s1=pd.Series([1,2,3,4], index=[『a』,b』,c』,d』])
s2=pd.Series([2,3,4,5], index=[『a』,b』,e』,f』])
s3=s1+s2
因為s1中有a,b,c,d四個值,s2中有a,b,e,f四個值,c d和ef在對方數組中沒有值。因此相加的結果是a 3,b 5,c NaN, d NaN, e NaN, f NaN。
可以選擇去掉缺失值
s3.dropna(), 得到的新的數組為[3,5]
可以選擇缺失值填充
s3=s1.add(s2, fill_value=0),得到的S3為[3,5,3,4,4,5]
Numpy中二維數組
Numpy中二維數組也使用array,和一維數組一樣
#定義numpy的二維數組
a=np.array([
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
])
#獲取二維數組a的第一行
a[0,:]
#獲取二維數組a的第一列
a[:,0]
# 如果不指定,計算平均值是計算二維數組所有的值。但如果需要分行或者分列計算平均值,用axis=0表示按列計算;用axis=1表示按行計算
a.mean(axis=1) #按行計算
a.mean(axis=0)#按列計算
Pandas中二維數組
Numpy的二維數組中所有的數據都為同一類型,因此在很多時候不適用。而Pandas的二維數組dataframe中每一列可以是不同數據類型,而且pandas二維數組有index索引值,因此很容易表示我們日常的數據表。
#pandas二維數組中每一列的第一個值為index
import pandas as pd
#定義一個詞典,映射列名和對應的值
salesDict={
purchase time: [2018-01-01 Friday, 2018-01-02 Saturday, 2018-01-06 Wendesday],
Social card No: [012006005309,012006005310,012006005311],
Item code:[236701, 236702, 236703],
Item name: [Tofu,Rice,Fish],
Purchase amount: [2,1,3],
Amount due: [4.2, 12, 8.6],
Amount paid: [4.2, 12, 8.6]
}
from collections import OrderedDict
#定義為ordered dict
salesOrderedDict=OrderedDict(salesDict)
#定義數據框,把詞典數據傳入到數據框
salesDf=pd.DataFrame(salesOrderedDict)
salesDf
#mean()按照每列求平均值
salesDf.mean()
#查詢元素,iloc查詢位置值,loc查詢「名義值」
salesDf.iloc[0,1]
salesDf.loc[0,Item code]
#查詢第一行,iloc查詢位置值,loc查詢「名義值」
salesDf.iloc[0,:]或者
salesDf.loc[0,:] #應為這一行沒有命名,這裡的0為行號
#查詢第一列
salesDf.iloc[:,0]
salesDf.loc[:,Item name]
pandas的dataframe複雜查詢
#查詢某幾列
salesDf[[Item name, Purchase amount]]
#切片功能: 查詢指定範圍的幾列
salesDf.loc[:, 『Item name』:『Purchase amount』]
#通過條件判斷篩選
1)構建查詢條件
querySer=salesDf.loc[:,』銷售數據』]>1
#querySer數據類型, 為pandas.core.series.Series,即為pandas一維數組類型
type(querySer)
#輸出querySer值
querySer
2)應用查詢條件
# querySer為true的組顯示所有列
salesDf.loc[querySer,:]
導入Excel數據集到dataframe進行描述統計信息分析
#用pandas.ExcelFile.parse導入excel 文件到dataframe並解析,此外也可以用read_excel讀取excel到dataframe
fileNameStr=C:/Users/Lin Li/Dropbox/Computer enhancement plan/跟猴子學習人工智慧核心技術/數據分析入門(Python)/第4關數據分析的基本過程/朝陽醫院2018年銷售數據.xlsx
xls=pd.ExcelFile(fileNameStr)
salesDf=xls.parse(Sheet1)
#列印前五行
salesDf.head()
#查詢某一列的數據類型
salesDf.loc[:, 『應收金額』].dtype
#查詢excel文件有多少行多少列,應用shape
salesDf.shape
#查詢每一列的統計信息
salesDf.describe()
@@上面的比如有時用shape不用(),而用describe是使用()。如何理解何時需要()而何時不需要()呢?
數據分析的基本過程
- 提出問題:比如微信公眾號里閱讀量前十的文章是什麼?
分析數據的月均消費次數;月均消費金額;客單價;消費趨勢
- 理解數據:採集數據,了解數據集的信息(多少行多少列,各行的數據類型)
用FileExcel打開excel,查看前五行,看看每一列內容
- 清洗數據:數據預處理,使得數據格式符合我們的預期
*選擇子集-有很多列,選取需要的列的信息,可以使用切片功能
#選擇前四行及商品名稱至實收金額之間的columns
subsalesDf=salesDf.loc[0:4, 『商品名稱』:』實收金額』]
*列名重命名-處理不方便的話需要重命名
#字典:舊列名和新列名對應
colNameDict={購葯時間:銷售時間}
inplace=False為default值,數據框本身不會改變,而會建立一個改動後的新的數據框,inplace=True,數據框本身會發生改變,可以理解為新的數據框覆蓋老的數據框
salesDf.rename(columns = colNameDict, inplace=True)
salesDf.head()
*缺失數據處理-有些數值缺失,可能需要刪除或者補0
#任何列中如果有空值,刪除所在的行
#how=』any』表示在給定的任何一列中,如果有缺失值,則刪除對應的行
salesDf=salesDf.dropna(subset=[『銷售時間』,』社保卡號』], how=』any』)
*數據類型轉換-如果數字是文本型,為了方便計算,需要轉換成數值型
#如果數字是文本,用astype將其轉換為『float』浮點數值
salesDf[『銷售數量』]=salesDf[『銷售數量』].astype(『float』)
#字元串分割split
testList=『2018-01-01 星期五』.split(』『)
testList[0]=』2018-01-01』
*數據排序-
*異常值處理-
- 構建模型:機器訓練,構建模型
- 數據可視化:用圖示展示你想知道的信息
通過split獲得標準的date值
#定義函數,輸出標準日期值
def splitSaleTime(timeColSer):
timeList=[]
for value in timeColSer:
timeSer=value.split(『』)[0]
timeList.append(timeSer)
timeSer=pd.Series(timeList)
return timeSer
#獲取「銷售時間」這一列值
timeSer=salesDf.loc[:,』銷售時間』]
#對字元串進行分割並返回標準日期值
dateSer=splitSaleTime(timeSer)
Note:在jupyter notebook中,在這一步始終提醒「AttributeError: float object has no attribute split」。反覆查看幾遍,原來是省去了上面的刪除缺失值dropna這一步。補上這一步,就okay了。
#修改銷售日期這一列的值
salesDf.loc[:,』銷售日期』]=dateSer
# 字元串轉換日期
salesDf.loc[:,銷售時間]=pd.to_datetime(salesDf.loc[:,銷售時間], format = %Y-%m-%d, errors = coerce)
salesDf.dtypes
#排序
by表示按照那幾列排序
ascending=True 表示降序排列
ascending=False表示升序排列
#按銷售日期進行升序排列
salesDf=salesDf.sort_values(by=』銷售時間』, ascending=True)
#重命名行名(index),這一步將排序後的dataframe重新命名了index
salesDf=salesDf.reset_index(drop=True)
salesDf.head()
#每一列的描述統計值,在前面已經將銷售數量,應收金額,實收金額設置成了float數據類型,因此這裡統計只顯示這幾列的描述統計數據。
salesDf.describe()
#刪除異常值-通過條件判斷篩選出數據
querySer=salesDf.loc[:,銷售數量]>0
#應用查詢條件
print(刪除異常值之前:,salesDf.shape)
salesDf=salesDf.loc[querySer,:]
print(刪除異常值之後:,salesDf.shape)
#業務指標1-月均消費次數=總消費次數/總月份數
#刪除重複數據-同一天內,同一個人算作一次消費
kpi1_Df=salesDf.drop_duplicates(subset=[銷售時間,社保卡號])
#後面發現『銷售時間』里還有缺失值,因此增加這一步。前面已經用了dropna為什麼沒有清除乾淨??
kpi1_Df=kpi1_Df.dropna(subset=[銷售時間],how=any)
#總消費次數
print(總消費次數=,kpi1_Df.shape[0])
#計算總月份數
#按銷售時間升序排列
kpi1_Df=kpi1_Df.sort_values(by=』銷售時間』,ascending=True)
#重命名index行名
kpi1_Df=kpi1_Df.reset_index(drop=True)
#按銷售時間升序排列
kpi1_Df=kpi1_Df.sort_values(by=銷售時間,ascending=True)
#重命名index行名
kpi1_Df=kpi1_Df.reset_index(drop=True)
#獲取時間範圍
startTime=kpi1_Df.loc[0,銷售時間]
endTime=kpi1_Df.loc[total-1,銷售時間]
#先計算天數
days=(endTime-startTime).days
#再計算月份數, //運算符只取結果的整數部分
months=days//30
print(月份數:,months)
#月均消費次數
kpi1=total//months
print(業務指標1:月均消費次數=,kpi1)
#總消費金額
totalMoney=salesDf.loc[:,實收金額].sum()
#月均消費金額
monthMoney=totalMoney/months
print(業務指標2:月均消費金額=,monthMoney)
#客單價
aveMoneySpent=totalMoney/total
print(客單價=,aveMoneySpent)
推薦閱讀:
※數據挖掘的知識大綱
※機器學習之Kaggle實戰:泰坦尼克號生存預測
※《Python數據科學實戰》 特徵工程
※數據缺失值的4種處理方法
※對於面試演算法工程師的想法