python数据分析之numpy
导包给包重命名
import numpy as np
数组的打印方式
a=np.array([1,2,3,4]) print(a) l=[0,1,2,3] a=np.array(l) print(a) a=np.array([1,2,3,4]) print(a)
生成全0数组:
np.zeros(6) print(np.zeros(6))
修改数组的类型
a=a.astype('float') a.fill(2.5) print(a)
生成整数序列
//生成1-9每个数间隔为2数字,1-10左闭右开 a=np.arange(1,10,2) print(a)
生成等差数列
//生成一到十之间,十个等差数 a=np.linspace(1,10,10) print(a)
生成随机数
//生成随机数 a=np.random.randn(10) print(a) //生成随机整数,1到10,十个整数 a=np.random.randint(1,10,10) print(a)
数组排序
sort函数
np.sort()
argsort返回从小到大的排列在数组中的索引位置:
order=np.argsort()
order
mv_name[order[0]]
求和
np.sum(mv_num)
最大值
np.max(mv_length)
最小值
np.max(mv_length)
均值
np.mean(mv_length)
标准差
np.std(mv——length)
相关系数矩阵
np.cov(mv_score,mv_length)
多维数组操作
数组形状
a=np.arange(6)
a.shape=2,3//形成两行三列的矩阵
//与只对应的方法是reshape,但它不会修改原来数组的值,而是返回一个新的数组
a.reshape(2,3)
数组连接
有时我们徐亚将不同的数组按一定顺序连接起来
注意,这些数组要用()包括到一个元组中去。
除了给定的轴外,这些数组其他轴的长度必须是一样的
numpy内置函数
a=np.array([-1,2,3,-2])
np.abs(a)
np.exp(a)
np.exp(a)
np.median(a)
np.cumsum(a)
python数据分析之pandas
pandas基本数据结构
pandas中有两种常用的基本结构
series
一维数组,与numpy中的一维array类似,二者与python基本的
数据结构list也很相近。series能保存不同种数据类型,字符串、Boolean值
数字等都能保存series中。
dataframe
二维的表格型数据结构。很多功能与R中的date.frame类似。可以DataFrame理解为Series的容器。以下的内容主要以DataFrame为主
pandas库的series类型
一维series可以用一维列表初始化:
默认情况下,series的下标都是数字(可以使用额外参数指定),类型是统一的
下标,列标,数据
下标使用index属性查看
列标使用columns属性查看
数据值使用values查看
pandas读取数据及数据操作
df=pd.read_excel(r '路径\文件名字')
df.head()
提取数据
df.loc[0:5]
处理异常值
异常值,即在数据集中存在不合理的值,又称离群点,比如年龄为-1
笔记本电脑重量为1吨等,都属于异常值
对于异常值,一般来说数量都会很少,在不影响整体数据分布情况下,我们直接删除就可以了
其他属性的异常值处理,我们会在格式转换部分,进一步讨论
数据保存
数据处理之后,然后将数据重新保存到movie_data.xlsx
数据格式转换
在做数据分析的时候,原始数据往往会因为各种各样的原因产生各种数据格式的问题
数据格式是我们非常需要注意的一点,数据格式错误往往造成很严重的后果
并且,很多异常值也是我们经过格式转换之后才会发现,对我们规整数据,清洗数据有着重要的作用
将年份转化整数格式报错
基本统计分析
描述性统计
dataframe.describe():对dataframe中的数值型数据进行描述性统计
平均数与中位数
Matplotlib基础
matplotlib是一个python的2D图像包,pyplot封装了很多画图的函数
导入相关的包:
首先导包
import matplotlib.pyplot as plt import numpy as npplt.plot([1,2,3,4])//设置y轴 plt.ylabel('y')//设置y轴标签 plt.xlabel('x')//设置x轴标签 plt.show()//显示图
#基本用法 #plot函数基本的用法: #指定x和y #plt.plot(x,y) #默认参数,x为0~N-1 #plt.plot(y) #因此,在上面的例子中,我们没有给定x的值,所以默认值为[0,1,2,3] #传递x和y: plt.plot([1,2,3,4],[1,4,9,16]) plt.show()
plt.plot([1,2,3,4],[1,4,9,16],'ro') plt.show()
显示范围
与MATLAB类似,这里可以使用axis函数指定坐标轴显示的范围:
plt.axis([xmin,xmax,ymin,ymax])
传入Numpy数组
之前我们传给plot的参数都是列表,事实上,向plot中传入numpy数组时更常用的做法。事实上,如果传入的是列表,matplotlib会在内部将它转化成数组在进行处理:
在一个图里面画多条线
t=np.arange(0.,5.,0.2) plt.plot(t,t,'r--', t,t**2,'bs', t,t**3,'g*' )
传入多组数据
事实上,在上面的例子中,我们不仅仅向plot函数传入了数组,还传入了多组(x,yformat_str)参数,它们在同一张图上显示,这意味着我们不需要使用多个plot函数来画多组数组,只需要可以将这些组合放到一个plot函数中去即可
线条属性
之前提到,我们可以用字符串控制线条的属性,事实上还可以通过关键词来改变线条的性质,例如linwidth可以改变线条的宽度,color可以改变线条的颜色
x=np.linspace(-np.pi,np.pi)//-π到π y=np.sin(x)//sinx函数 plt.plot(x,y,linewidth=4.0,color='r')//设置粗细与颜色 plt.show()
使用plt.plot()的返回值来设置线条属性
plot函数返回一个line2D对象组成的列表,每个对象代表输入的一对组合,例如:
line1,line2为两个Line2D对象
line1,line2=plt.plot(x1,x2,y1,y2)
返回3个Line2D对象组成的列表
lines=plt.plot(x1,y1,x2,y2,x3,y3)
我们可以使用这个返回值对线条属性进行设置;
x=np.linspace(-np.pi,np.pi) y=np.sin(x) line1,line2=plt.plot(x,y,'r-',x,y+1,'g-')//绘图与线条属性 line1.set_antialiased(False) plt.show()
plt.setp()修改线条性质
x=np.linspace(-np.pi,np.pi) y=np.sin(x) line=plt.plot(x,y) plt.setp(line,color='g',linewidth=4)//设置属性 plt.show()
更方便的做法是使用plt的setp函数
子图
firgure()函数会产生一个指定编号为num的图:
plt.figure(num)
这里,figure(1)其实是可以省略的,因为默认情况下plt会自动产生一幅图像
使用subplot可以在一幅图中生成多个子图,其参数为;
plt.subplot(numrows,numcols,fignum)
当numrows*numols<10时,中间的逗号可以省略,因此plt.subplot(211)就相当于
plt.subplot(2.1.1)
2.电影数据绘图
在了解绘图的基础知识之后,我们可以对电影数据进行可视化分析
(1)绘制每个国家或地区的电影数量的柱状图
柱状图,是一种以长方形的长度为 变量的表达图形的统计报告图
由一系列高度不等的纵向条纹表示数据的情况,用来比较两个或以上的
价值(不同时间或者不同条件),只有一个变量,通常利用于较小的数据集分析。
柱状图亦可横向排列,或用多维方式表达
(2)绘制每年上映的电影数量的曲线图
曲线图有称折线图,是利用曲线的升降变化来表示被研究现象发展变化趋势的一种图像,它
在分析研究社会经济现象的发展变化、依存关系方面具有重要作用
绘制曲线图时,如果是某一现象的时间指标应将时间绘在坐标的横轴上,指标在坐标的纵轴上
如果是两个现象依存的显示,可以将表示原因 的指标绘在横 轴上,表示
结果的指标绘在纵轴上,同时还应注意整个图形的长宽比例
plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False df=pd.read_excel(r'D:\自带 重要文件\桌面\豆瓣电影数据.xlsx')#导入数据 print(df[:5]) data=df['产地'].value_counts()#统计每个产地出现的次数 print(data) x=data.index#搜索的数据即产地 y=data.values#得到的值 plt.figure(figsize=(10,6))#大小 plt.bar(x,y,color='g')#颜色 plt.title('各个国家或地区电影数量',fontsize=20)#标题 plt.xlabel('国家或地区',fontsize=18)#x轴标题 plt.ylabel('电影数量',fontsize=18)#y轴的标题 plt.tick_params(labelsize=14) plt.xticks(rotation=90)#x轴90度的旋转 #在柱子上显示值 for a,b in zip(x,y): plt.text(a,b+10,b,ha='center',fontsize=10) plt.grid()#加网格线 plt.show()
(2)绘制每年上映的电影数量的曲线图
曲线图又称折线图,降变化来表示被研究现象 发展变化趋势的一种图形,它在分析研究经济现象的发展变化、依存关系等方面具有重要作用。
绘制曲线图时,如果是某一现象的时间指标应将时间绘在坐标的横轴上,指标绘在坐标的纵轴上,如果是两个现象依存关系的显示,可以将表示原因的指标绘在横轴上,表示结果的指标绘在纵轴上,同时还应注意整个图形的长宽比例
出现这种错误要可能是整型和字符串混用,将年份全部转换成字符串类型
如下代码
df['年代']=df['年代'].astype('str')
显示所有列
pd.set_option('display.max_columns', None)
显示所有行
pd.set_option('display.max_rows', None)
查找年代为34943的那一行
print(df[df['年代']=='34943'])
替换34943年代
方法1:df.replace({"年代":{34943:2000}},inplace=True) 方法2:df.loc[df["年代"].isin([34943]),"年代"]=2000
成功运行
df['年代']=df['年代'].astype('str') data=df['年代'].value_counts() data=data.sort_index() pd.set_option('display.max_rows', None) print(data) plt.show()
df['年代']=df['年代'].astype('str') data=df['年代'].value_counts() data=data.sort_index()[:-1] pd.set_option('display.max_rows', None) print(df[df['年代']=='2008']) print(data) x=data.index y=data.values plt.plot(x,y,color='b') plt.title('每年电影数量',fontsize=20) plt.ylabel('电影数量',fontsize=18) plt.xlabel('年份',fontsize=18) plt.xticks(rotation=90) for a,b in zip(x[::10],y[::10]): plt.text(a,b+10,b,ha='center',va='bottom',fontsize=10) plt.show()
双轴图的画法
根据电影时长和电影评分绘制散点图
plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False#防止乱码 df=pd.read_excel(r'D:\自带 重要文件\桌面\豆瓣电影数据.xlsx')#读取数据 import matplotlib.mlab as mlab from scipy.stats import norm fig=plt.figure(figsize=(10,8))#生成一个10x8的空白图 ax1=fig.add_subplot(111)#一行一列的图 n,bins,patches=ax1.hist(df['评分'],bins=100,color='m')#n直方图向量,bins区间范围,patches每个bins包含的数据 ax1.set_ylabel('电影数量',fontsize=15) ax1.set_xlabel('评分',fontsize=15) ax1.set_title('频率分布图',fontsize=20) y=norm.pdf(bins,df['评分'].mean(),df['评分'].std()) ax2=ax1.twinx() ax2.plot(bins,y,'b--') ax2.set_ylabel('概率分布',fontsize=15) fig.tight_layout() plt.show()
5.根据电影时长和电影评分绘制散点图
用两组数据构成多个坐标点,考察坐标点的分布,判断两个变量之间是否村子某种关联或总结坐标
点的分布模式。散点图将序列为一组点。值由点在图表中的位置表示。类别由图表中的不同标记表示。散点图通常用于比较跨类型的聚合数据
由于我们的数据量过大,所以画出来的图非常杂
可以发现,大部分的电影时长还是集中在100附近,评分大多在7分左右
marker属性
设置散点的形状
df = pd.read_excel(r'D:\自带 重要文件\桌面\豆瓣电影数据.xlsx') # 读取数据 df['时长']=df['时长'].astype('str')#转换成字符串 df['评分']=df['评分'].astype('str') x=df['时长'][::100]# y=df['评分'][::100]#间隔100取一个 # t1=np.arange(11.0,2.0,1) # t2=np.arange(50,450,50) plt.figure(figsize=(10,8)) # plt.xticks(t2) # plt.yticks(t1) plt.scatter(x,y) # plt.legend() plt.title('电影时长与评分散点图',fontsize=20) plt.xlabel('时长',fontsize=10) plt.ylabel('评分',fontsize=10) # plt.xlim(xmax=1000,xmin=0) # plt.ylim(ymax=11,ymin=0) plt.xticks(rotation=90)#x轴90度的旋转 plt.show()
6.绘制各个地方的评分箱形图
箱形图又称为盒须图,盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图
。因形状如箱子而得名。在各种领域也经常使用,常见于品质管理。它2主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比较。箱线图的绘制方法是:先找出一组数据的中位数、两个四分位数、上下边缘先;然后,链接两个四分位数画出箱子;再将上下边缘线与箱子相连接。中位数在箱子中间
一般计算过程
(1)计算上四分位数(Q3),中位数,下四分位数(Q1)
(2)计算上四分位数和下四分位数之间的差值,即四分位数差(Q3-Q1)
(3)绘制箱线图的上下范围,上限为上四分位数,下限为下四分位数。在箱子内部中位数的位置绘制横线
(4)大于四分位数1.5倍数四分位数差的值,或者小于下四分位数1.5倍四分位数差的值,划为异常值
(5)异常值之外,最靠近上边缘和下边缘的两个值处,划横线,作为箱线图的触须
(6)极端异常值,即超出四分位数差3倍数距离的异常值,用实心点表示;较为温和异常值,
即处于1.5倍数-3倍四分位数差之间的异常值,用空心点表示
(7)为箱线图添加名称,数轴等
df = pd.read_excel(r'D:\自带 重要文件\桌面\豆瓣电影数据.xlsx') # 读取数据 data=df[df.产地=='美国']['评分'] plt.figure(figsize=(10,6)) plt.boxplot(data,whis=2,flierprops={'marker':'o','markerfacecolor':'r','color':'k'},patch_artist=True,boxprops={'color':'k','facecolor':'#9999ff'}) plt.title('美国电影评分',fontsize=20) plt.show()
多组数据箱线图
#多组数据箱线图 data1=df[df.产地=='中国大陆']['评分'] data2=df[df.产地=='日本']['评分'] data3=df[df.产地=='中国香港']['评分'] data4=df[df.产地=='英国']['评分'] data5=df[df.产地=='法国']['评分'] plt.figure(figsize=(12,8)) plt.boxplot([data1,data2,data3,data4,data5],labels=['中国大陆','日本','中国香港','英国','法国'],vert=False)#vert=False让图横过来 ax=plt.gca() ax.patch.set_facecolor('gray') ax.patch.set_alpha(0.3) plt.title('电影评分箱线图',fontsize=20) plt.show()
7.相关系数矩阵图--热力图
pandas本身也封装了画图函数
我们可以画出各个属性之间的散点图,对角线是分布图
现在我们来画电影时长,投票人数,评分的一个相关系数矩阵图
seaborn是一个精简的python库,可以创建具有统计意义的图表,能理解pandas的DataFrame类型