查询数据去除后面无用的0_Python数据分析与实战
1.Pandas一維數據類型分析
#使用前首先導入需要使用的模塊 import pandas as pd import numpy as np1.1 創建Series對象
stocks = pd.Series([54.74,190.9,173.14,1050.3,181.86,1139.49],index=['騰訊','阿里巴巴','蘋果','谷歌','Facebook','亞馬遜']) stocks#獲取描述統計信息 stocks.describe()stocks.iloc[0] #iloc屬性用于根據位置獲取值
stocks.loc['阿里巴巴'] #loc屬性用于根據索引獲取值
1.2 Series的基本操作
#向量化運算:向量相加 s1 = pd.Series([1,2,3,4],index=['a','b','c','d']) s2 = pd.Series([10,20,30,40],index=['a','c','e','f']) s3 = s1+s2 s3相同索引值的進行相加,s3中缺失值顯示為NaN (Not a number)
#方法1:刪除缺失值 s3.dropna()#方法2:將缺失值進行填充 s3 = s1.add(s2,fill_value=0) s3Series1.add(Series2,fill_value=0),即求Series1+Series2的和,若其中含有缺失值則按0處理。
2. Pandas二維數據分析
2.1 Numpy二維數組結構
#定義二維數組 a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) a1)查詢元素: a[0,2]
2)獲取第一行:a[0,:]
3)獲取第一列:a[:,0]
4)平均值
a.mean()
a.mean(axis=0) #按列計算平均值
a.mean(axis=1) #按行計算平均值
2.2 Pandas數據框(Dataframe)
#第1步,定義一個字典,映射列名與對應的值 salesDict = {'購藥時間':['2018-01-01 星期五','2018-01-02 星期六','2018-01-06 星期三'],'社保卡號':['001616528','001616528','002602828'],'商品編碼':[236701,236701,236701],'商品名稱':['強力VC銀翅片','清熱解毒口服液','感康'],'銷售數量':[6,1,2],'應收金額':[82.8,28,16.8],'實收金額':[69,24.64,15], } #第2步,定義數據框,參數傳入字典 salesDf = pd.DataFrame(salesDict) salesDf1)查詢元素:
salesDf.iloc[0,1] salesDf.loc[0,'社保卡號'] #兩者等價2)獲取第一行:
salesDf.iloc[0,:] salesDf.loc[0,:] #兩者等價3)獲取第一列:
salesDf.iloc[:,0] salesDf.loc[:,'購藥時間'] #兩者等價4)獲取某幾列
salesDf[['商品名稱','銷售數量']] salesDf.loc[:,['商品名稱','銷售數量']] #兩者等價5) 條件查詢獲取
querySer = salesDf.loc[:,'銷售數量']>1 querySersalesDf.loc[salesDf.loc[:,'銷售數量']>1] #將前面的條件帶入進行查詢3.案例:藥店銷售數據分析
3.1 數據導入及查看
#excel文件路徑,路徑中的./表示在當前notebook所在的文件夾路徑 fileNameStr='./朝陽醫院2018年銷售數據.xlsx' ''' 使用pandas的read_excel函數讀取Ecxcel數據 參數sheet_name:數據在Excel里的哪個sheet下面,這塊就寫該sheet在excel里的名稱 參數dtype=str 統一先按照字符串讀入,之后再轉換 ''' salesDf = pd.read_excel(fileNameStr,sheet_name='Sheet1',dtype=str) salesDf.head() #打印前5行#有多少行,多少列 salesDf.shape#查看每一列的數據類型 salesDf.dtypes#查看數據信息 salesDf.info()#描述統計信息 salesDf.describe()3.2 數據清洗
數據清洗步驟:
- 選擇子集
- 列名重命名
- 去除重復值
- 缺失值數據處理
- 數據類型轉換
- 數據排序
- 異常值處理
3.2.1 選擇子集(本案例不需要選擇子集)
#注釋掉 #subSalesDf=salesDf.loc[0:4,'購藥時間':'銷售數量']3.2.2 列名重命名
#字典:舊列名和新列名對應關系 colNameDict = {'購藥時間':'銷售時間'} ''' inplace=False,數據框本身不會變,而會創建一個改動后新的數據框, 默認的inplace是False inplace=True,數據框本身會改動 ''' salesDf.rename(columns = colNameDict,inplace=True) salesDf.head() #可以看到如下,購藥時間變成了銷售時間3.2.3 去除重復值
salesDf.drop_duplicates(inplace=True) # 去除完全重復的行數據 salesDf.index=range(salesDf.shape[0]) # 重置索引 salesDf.shape3.2.4 缺失數據處理
python缺失值有3種:
1)Python內置的None值
2)在pandas中,將缺失值表示為NA,表示不可用not available。
3)對于數值數據,pandas使用浮點值NaN(Not a Number)表示缺失數據。
后面出來數據,如果遇到錯誤:說什么float錯誤,那就是有缺失值,需要處理掉
None是Python的一種數據類型,NaN是浮點類型 兩個都用作空值
#None和NaN的區別 print('None的數據類型',type(None)) from numpy import NaN print('NaN的數據類型',type(NaN))所以,缺失值有3種:None,NA,NaN
# 查看缺失值情況 salesDf.isnull().mean()#方法一:直接刪除缺失值
#刪除列(銷售時間,社保卡號)中為空的行 #how='any' 在給定的任何一列中有缺失值就刪除 salesDf=salesDf.dropna(subset=['銷售時間','社保卡號'],how='any')#方法二:用中位數填充缺失值
salesDf['銷售數量'].fillna(salesDf['銷售數量'].median(),inplace=True) # 查看缺失值情況 salesDf.isnull().mean()其中銷售數量這列字段缺失值已用中位數填充完畢。由于其它字段缺失值用中位數來填充不合適,故沒有展開。在這里只是表明有中位數填充這種方法僅供參考。
若其它數據集中遇到缺失值比較多的情況又不愿刪除,也可以建立隨機森林模型進行填補。
3.2.5 數據類型轉換
#字符串轉換為數值(浮點型) salesDf['銷售數量'] = salesDf['銷售數量'].astype('float') salesDf['應收金額'] = salesDf['應收金額'].astype('float') salesDf['實收金額'] = salesDf['實收金額'].astype('float') print('轉換后的數據類型:n',salesDf.dtypes)''' 定義函數:分割銷售日期,獲取銷售日期 輸入:timeColSer 銷售時間這一列的值 輸出:分割后的時間 ''' def splitSaletime(timeColSer):dateStr=timeColSer.split(' ')[0]return dateStrsalesDf['銷售時間']=salesDf['銷售時間'].apply(lambda x:splitSaletime(x)) salesDf'''
數據類型轉換:字符串轉換為日期 ''' #errors='coerce' 如果原始數據不符合日期的格式,轉換后的值為空值NaT #format 是你原始數據中日期的格式 salesDf.loc[:,'銷售時間']=pd.to_datetime(salesDf.loc[:,'銷售時間'],format='%Y-%m-%d', errors='coerce') salesDf.dtypes''' 轉換日期過程中不符合日期格式的數值會被轉換為空值, 這里刪除列(銷售時間,社保卡號)中為空的行 ''' salesDf=salesDf.dropna(subset=['銷售時間','社保卡號'],how='any')3.2.6 數據排序
ascending=True 表示升序排列,
ascending=False表示降序排列
na_position=True表示排序的時候,把空值放到前列,這樣可以比較清晰的看到哪些地方有空值
官網文檔:
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_values.html
#按銷售日期進行升序排列 salesDf=salesDf.sort_values(by='銷售時間',ascending=True,na_position='first') salesDf.head(5)#重命名行名(index):排序后的列索引值是之前的行號,需要修改成從0到N按順序的索引值 salesDf=salesDf.reset_index(drop=True) salesDf.head()3.2.7 異常值處理
#描述指標:查看出“銷售數量”值不能小于0 salesDf.describe()#刪除異常值:通過條件判斷篩選出數據 #查詢條件 querySer=salesDf.loc[:,'銷售數量']>0 #應用查詢條件 print('刪除異常值前:',salesDf.shape) salesDf=salesDf.loc[querySer,:] print('刪除異常值后:',salesDf.shape)4. 構建模型
業務指標1:月均消費次數=總消費次數 / 月份數
''' 總消費次數:同一天內,同一個人發生的所有消費算作一次消費 #根據列名(銷售時間,社區卡號),如果這兩個列值同時相同,只保留1條,將重復的數據刪除 ''' kpi1_Df=salesDf.drop_duplicates(subset=['銷售時間', '社保卡號'])#總消費次數:有多少行 totalI=kpi1_Df.shape[0] print('總消費次數=',totalI)此次去重功能有別于對數據重復冗余的處理,可以理解為同一天內同一個人多次消費記錄的合并。
''' 計算月份數:時間范圍 ''' #第1步:按銷售時間升序排序 kpi1_Df=kpi1_Df.sort_values(by='銷售時間',ascending=True)經升序排列后,將index也進行重置
#重命名行名(index) kpi1_Df=kpi1_Df.reset_index(drop=True) kpi1_Df.head()#第2步:獲取時間范圍 #最小時間值 startTime=kpi1_Df.loc[0,'銷售時間'] #最大時間值 endTime=kpi1_Df.loc[totalI-1,'銷售時間']#第3步:計算月份數 #天數 daysI=(endTime-startTime).days #月份數: 運算符“//”表示取整除 #返回商的整數部分,例如9//2 輸出結果是4 monthsI=daysI//30 print('月份數:',monthsI)#業務指標1:月均消費次數=總消費次數 / 月份數 kpi1_I=totalI // monthsI print('業務指標1:月均消費次數=',kpi1_I)指標2:月均消費金額 = 總消費金額 / 月份數
#總消費金額 totalMoneyF=salesDf.loc[:,'實收金額'].sum() #月均消費金額 monthMoneyF=totalMoneyF / monthsI print('業務指標2:月均消費金額=',monthMoneyF)指標3:客單價=總消費金額 / 總消費次數
客單價(per customer transaction)是指商場(超市)每一個顧客平均購買商品的金額,客單價也即是平均交易金額。
計算每月的銷售額
#在進行操作之前,先把數據復制到另一個數據框中,防止對之前清洗后的數據框造成影響 groupDf=salesDf #第1步:重命名行名(index)為銷售時間所在列的值 groupDf.index=groupDf['銷售時間'] groupDf.head()#第2步:分組 gb=groupDf.groupby(groupDf.index.month)#第3步:應用函數,計算每個月的消費總額 mounthDf=gb.sum() mounthDf目前先寫到這里
總結
以上是生活随笔為你收集整理的查询数据去除后面无用的0_Python数据分析与实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python字符串截取_Python-变
- 下一篇: websocket python爬虫_p