前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >疫情这么严重,还不待家里学Numpy和Pandas?

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

作者头像
开心鸭
发布2020-10-26 14:41:16
2.6K0
发布2020-10-26 14:41:16
举报
文章被收录于专栏:开心鸭数据分析

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

首先导入这两个包。

代码语言:javascript
复制
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

代码语言:javascript
复制
#定义: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)

二维数组分析:

代码语言:javascript
复制
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)

代码语言:javascript
复制
#第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()

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

案例:药店销售数据分析

代码语言:javascript
复制
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)选择子集(本案例不需要选择子集)

代码语言:javascript
复制
subSalesDf=salesDf.loc[0:4,'购药时间':'销售数量']

2)列名重命名

代码语言:javascript
复制
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

代码语言:javascript
复制
#删除列(销售时间,社保卡号)中为空的行
#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' 表示空值放到前面

代码语言:javascript
复制
#按照销售日期升序
salesDf=salesDf.sort_values(by='销售时间',
ascending=True
naposition='first')

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

5.异常值处理

代码语言:javascript
复制
#通过描述指标可以看出销售数量不可以小于0
salesDf.describe()

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

4.构建模型

代码语言:javascript
复制
#业务指标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,所以比较枯燥,不过要熟能生巧,冲鸭!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一维数据分析:Pandas
  • 二维数组分析:
  • pandas二维数组:数据框(DataFrame)
  • 案例:药店销售数据分析
  • 2.数据清洗
  • 4.构建模型
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档