python中數據基本分析過程

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種處理方法
對於面試演算法工程師的想法

TAG:數據分析 | 數據挖掘 | Python |