疫情这么严重,还不待家里学Numpy和Pandas?

时间:2022-07-28
本文章向大家介绍疫情这么严重,还不待家里学Numpy和Pandas?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

鸭哥这次教大家Python数据分析的两个基础包Numpy和Pandas。

首先导入这两个包。

import numpy as np
import pandas as pd
#定义一维数组array,参数传入是一个列表[2,3,4,5]
a=np.array([2,3,4,5])

#查询
a[0]

#切片访问,访问一个范围的元素
a[1:3]

#查询数据类型
a.dtype

#统计计算平均值
a.mean()

#标准差
a.std()

#向量化运行乘以标量
b=np.array[(1,2,3)]
c=b*4

一维数据分析:Pandas

#定义:Pandas一维数据结构:Series
#存放6家公司每一天的股价
stockS=pd.Series([54.74,190.9,173.14,1050.3,181.86,1139.49],
                index=['腾讯',
                       '阿里巴巴',
                       '苹果',
                       '谷歌',
                       'Facebook',
                       '亚马逊'])

#获取描述统计信息
stockS.describe()

#iloc属性用于根据序号获取值
stcok.iloc[0]

#loc属性用于根据名字获取值
stockS.loc['腾讯']

#向量化运算:向量相加
s1=pd.Series([1,2,3,4],index=['a','b','c','d'])
s2=pd.Series([10,20,30,40],index=['a','b','e','f'])
s3=s1+s2

#方法1:删除缺失值
s3.dropna()

#方法2:相加的时候把缺失值进行填充
s3=s1.add(s2,fill_value=0)

二维数组分析:

import numpy as np
import pandas as pd

a=np.array([
    [1,2,3,4],
    [5,6,7,8],
    [9,10,11,12]
])

#获取行号是0,列号是2的元素a[0,2]
a[0,2]

#获取第一行,0前面要加逗号,不然打印类型出来
a[:,0]

#获取第一列,0后面加逗号
a[0,:]

#按轴计算:axis=1 计算每一行的平均值
a.mean(axis=1)

pandas二维数组:数据框(DataFrame)

#第1步:定义一个字典,映射列名与对应列的值
salesDict={
    '购药时间':['2018-01-01 星期五','2018-01-02 星期六','2018-01-06 星期三'],
    '社保卡号':['001616528','001616528','0012602828'],
    '商品编码':[236701,236701,236701],
    '商品名称':['强力VC银翘片','清热解毒口服液','感康'],
    '销售数量':[6,1,2],
    '应收金额':[82.8,28,16.8],
    '实收金额':[69,24.64,15]
}
#导入有序字典
from collections import OrdereDict
#定义一个有序字典
salesOrderDict=OrderedDict(salesDict)
#定义数据框,传入字典,列名
salesDf=pd.DataFrame(salesOrderDict)

#按照每列求平均值
saleDf.mean()

#查询第一行第二列的元素
salesDf.iloc[0.1]

#获取第一行,代表所有列
salesDf.iloc[0,:]

#获取第一列,代表所有行
salesDf.iloc[:,0]

#根据行号和列名称来查询值
salesDf.loc[0,'商品编码']

#获取第一行
salesDf.loc[0,:]

#获取‘商品名称’这一列
salesDf.loc[:,'商品名称']
salesDf['商品名称']

#通过列表来选择某几列的数据
salesDf[['商品名称','销售数量']]

#通过切片功能,获取指定范围的列
salesDf.loc[:,'购药时间':'销售数量']

#通过条件判断筛选,构件查询条件
querySer=salesDf.loc[:,'销售数量']>1
salesDf.loc[querySer,:]

#读取Excel数据
fileNameStr='./朝阳医院2018年销售数据.xlsx'
xls=pd.ExcelFile(fileNameStr)
salesDf=xls.parse('Sheet1')

#打印前面三行
salesDf.head(3)

#有多少行,多少列
salesDf.shape

#查询某一列的数据类型
salesDf.loc[:,'销售数量'].dtype

#查看每一列的统计数值
salesDf.describe()

接下来鸭哥带大家做一个案例。

案例:药店销售数据分析

import pandas as pd
fileNameStr='./朝阳医院2018年销售数据.xlsx'
salesDf=pd.readexcel(fileNameStr,sheet_name='Sheet1',detpe=str)

#打印前面五行
salesDf.head(5)

#有多少行,多少列
salesDf.shape

#查看每一列的数据类型
salesDf.dtypes

2.数据清洗

1)选择子集(本案例不需要选择子集)

subSalesDf=salesDf.loc[0:4,'购药时间':'销售数量']

2)列名重命名

colNameDict ={'购药时间':'销售时间'}
salesDf.rename(columns=colNameDict,inplace=True)
salesDf.head()

3)缺失值处理

python缺失值有3种:

1)Python内置的None值

2)在pandas中,将缺失值表示为NA,表示不可用not available。

3)对于数值数据,pandas使用浮点值NaN(Not a Number)表示缺失数据。

后面出来数据,如果遇到错误:说什么foloat错误,那就是有缺失值,需要处理掉

所以,缺失值有3种:None,NA,NaN

dropna函数详细使用地址:

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html

#删除列(销售时间,社保卡号)中为空的行
#how='any' 在给定的任何一列中有缺失值就删除
salesDf=salesDf.dropna(subset=['销售时间','社保卡号'],how='any')

#字符串转为数值(浮点型)
salesDf['销售数量'] = salesDf['销售数量'].astype('float')
salesDf['应收金额'] = salesDf['应收金额'].astype('float')
salesDf['实收金额'] = salesDf['实收金额'].astype('float')

#字符串分隔
testList='2018-06-03 星期五'.spilt(' ')
testList[0]

'''
定义函数:分割销售日期,获取销售日期
输入:timeColSer 销售时间这一列,是个Series数据类型
输出:分割后的时间,返回也是个Series数据类型
'''
def splitSaletime(timeColSer):
    timeList=[]
    for value in timeColSer:
        #例如2018-01-01 星期五,分割后为:2018-01-01
        dateStr=value.split(' ')[0]
        timeList.append(dateStr)
    
    #将列表转行为一维数据Series类型
    timeSer=pd.Series(timeList)
    return timeSer
      
#获取“销售时间”这一列
timeSer=salesDf.loc[:,'销售时间']
#对字符串进行分割,获取销售日期
dateSer=splitSaletime(timeSer)

#修改销售时间这一列的值
salesDf.loc[:,'销售时间']=dateSer


#数据类型转换:字符串转换为日期
#errors='coerce' 如果原始数据不符合日期的格式,转换后的值为控制NaT

#format 是你原始数据中的日期的格式
salesDf.loc[:,'销售时间']=pd.to_datatime(salesDf.loc[:,'销售时间'],
formate='%y-%m-%d',
errors='coerce')

4.数据排序

by:按哪几行排序

ascending=true 表示升序排序

na-position='first' 表示空值放到前面

#按照销售日期升序
salesDf=salesDf.sort_values(by='销售时间',
ascending=True
naposition='first')

#重命名行号(index)排序后的列索引号是之前的行号,需要修改成从0到N按顺序的索引值
salesDf=salesDf.reset_index(drop=True)
salesDf.head()

5.异常值处理

#通过描述指标可以看出销售数量不可以小于0
salesDf.describe()

#删除异常值:通过条件判断筛选出数据
#查询条件
querySer=salesDf.loc[:,销售数量]>0
salesDf=salesDf.loc[querySer,:]

4.构建模型

#业务指标1:月均消费次数=总消费次数 / 月份数
kpilDf=salesDf.drop_duplicates(
subset=['销售时间','社保卡号']
)

#总消费次数:有多少行
totalI=kpi1_Df.shape[0]

#第一步,按销售时间升序排序
kpil_Df=kpilDf.sort_value(by='销售时间',
ascending=True)

#重命名行名(index)
kpil_Df=kpil_Df.reset.index(drop=Ture)

#获取时间范围
#最小时间值
startTime=kpil_Df.loc[0,'销售时间']
endTime=kpil_Df.loc[tatali-1,'销售时间']

#第三步 计算月份
daysi=(endTime-startTime).days

#月份数 //表示整除
monthsi=daysi//30

#业务指标1:月均消费次数=总消费次数 / 月份数
kpil_i=tatali//monthi

#指标2:月均消费金额 = 总消费金额 / 月份数
#总消费金额
totalMoneyF=salesDf.loc[:,‘实收金额’].sum()

#月均消费金额
monthMoneyF=totalMoneyF/monthsi

#指标3:客单价=总消费金额 / 总消费次数
pct=totalMoneyF/totali

打了这么多代码做个总结:

这回基本上都是熟悉API,所以比较枯燥,不过要熟能生巧,冲鸭!