Python数据分析

299 阅读7分钟

一、环境安装

本文使用jupyter notebook进行python数据分析代码的练习编写,jupyter notebook是一个开源的web application,可以创建和分享包含代码、视图注释文档,可以用于数据统计、分析、建模、机器学习等领域。首先在www.anaconda.com/网站下载Anaconda。使用anaconda bin/conda --version命令检验是否安装成功。输入sudo ~/opt/anaconda3/bin/jupyter notebook --allow-root可以在相应的文件夹下启动jupyter。

二、数据科学领域的几个常用的Python库

1、numpy

矩阵基本概念:

矩阵的数组是二维数组。其中向量和标量均为矩阵的特例。向量是值1n或者n1的矩阵。标量是指11的矩阵。矩阵的加减必须有相同的行和列,数组的乘法是对应元素的乘法,矩阵的乘法必须A的列和B的行相等的时候AB才有意义

数组的创建

import numpy as np
list1=[1,2,3,4]
list2=[2,3,4,5]
n2=np.array(list1,list2)		#创建二维数组
n1=np.arange(1,10)				#通过arange函数创建数组
np.array([i for i in range(10)])
np.arange(0,1,0.2)				#创建0到1,第三个参数代表间隔
np.linspace(0,20,10)			#创建0到20,第三个参数代表个数
np.random.randint(0,10,10)		#创建0到10范围的随机整数,第三个参数代表10个1维数组。如果想要随机浮点数去掉int
np.random.randint(0, 10, size=(3,5)) 	#创建0到10范围的随机数,第三个参数代表3行5列的二维数组
np.random.seed(666)				#创建随机数种子,使得每次随机一样
np.random.normal(10,100,(3,5))	#创建平均数为10,方差为100的随机数
np.zeros(5,dtype=int)			#一维全为0矩阵
np.zeros([2,3])					#二维全为0矩阵
np.eye(5)						#5*5单位矩阵
np.ones(10)						#创建长度为10的全1矩阵
np.ones((3,5))					#创建长度为(3,5)的全1二维矩阵
np.full((3,5),fill_value=666)	#创建长度为(3,5)的全666二维矩阵
np.mat([[1,2,3],[4,5,6]])		#创建矩阵
np.mat(a)						#数组转化为矩阵
np.random? 或者help(np.random)	#可以获得到帮助~

数组的访问

n1[1]							#访问第2个元素
n1[-1]							#访问第最后1个元素
n1[1::2]						#访问从1个元素开始,步长为2的数据	
n1[1,5]							#访问第2个到第5个元素
n2[1][2]						#访问二维数组第二行第三个数据
n2[:1,2:]						#二维数组的切片
n2[::-1,::-1]					#将数组全部倒序
n3=n2[:2,:3].copy()
n3[0,0]=100						#使用copy将子数组赋值的时候不改变原数组
注:n2[:2][:3]和n2[:2,:3]			二维数组中使用“,”做索引,前者代表前两行后前三行

数组的方法

n1.shape						#返回数组维数
n1.ndim							#返回数组的维数
n1.reshape(4,2)					#改变数组行列数
n1.reshape(3,-1)				#改变数组3行,列随意
n1.size							#返回数组元素个数
n1.dtype						#返回数组类型,若类型不一致返回精确度最高的
np.unique(n1)					#返回不重复的值
np.sum(n1)						#返回数组列和
np.sum(n1[0])					#返回某一行和
np.sum(n1[:,1])					#返回某一列和
np.max(n1)						#返回最大值
np.argmax(n1)					#返回最大值的位置
np.max(n1[0])					#返回某一行的最大值
np.prod(n1)						#n1中所有数的乘积
np.mean(n1)						#n1中平均数
np.median(n1)					#n1中中位数
np.percentile(big_array, q=50)	#n1中几分位数
np.var(n1)						#n1中方差
x=np.array([1,2,3])
y=np.array([[1,2,3],
            [4,5,6]])
np.concatenate([x,x])			#一维数组合并
np.concatenate([y,y])			#二维数组合并,默认axis=0,垂直合并
np.concatenate([y,x.reshape(1,-1)]) #一维数组和二维数组合并
np.vstack([x,y])				#等同于上一个合并,垂直合并
z=np.full((2,2),100)			
np.hstack([y,z])				#矩阵合并,水平合并
x1,x2,x3=np.split(n2,[3,7])		#把n2分割按照3、7分割成3份
y1,y2=np.split(y,[2])			#二维数组分割,默认axis=0垂直分割,等于vsplit。axis=1等于hsplit
z1,z2= np.hsplit(y,[-1])		#把最后一列切分出来
np.random.shuffle(n2)			#打乱顺序
np.sort(n2)						#排序
np.argsort(x)					#排序索引
fancy=x.reshape(4,-1)
row = np.array([0, 1, 2])
col = np.array([1, 2, 3])
fancy[row, col]
fancy[0, col]
fancy[:2, col]
col = [True, False, True, True]
fancy[0, col]					#fancy应用在二维数组
np.count_nonzero(n1<= 3)
np.any(x < 0)

数组的序列化

import pickle
import numpy as np 
x=np.arange(10)					#返回数组维数
f=open('x.pkl','wb')
pickle.dump(x,f)
f=open('x.pkl','rb')
pickle.load(f)					#pickle方法存数据和读数据
np.save('one',x)
np.load('one.npy')				#使用np方法读取npy

数组的运算

import numpy as np 
n1=np.arange(1,16),reshape(3,5)
n1+1、n1-1、n1*2、n1/2、n1**2、n1%21/n1、np.abs(n1)、np.sin(n1)、np.cos(n1)、np.exp(n1)、np.power(3,n1)、np.log(n1)、np.log2(n1)	
								#数组的基本运算
x=np.arange(4).reshape(2,2)
y=np.full((2,2),10)
x+y								#数组的加法
x-y								#数组的减法
x*y								#数组的乘法
x.dot(y)						#矩阵的加法
x.T								#矩阵的转置
np.linalg.inv(x)				#矩阵的逆

2、pandas

series和dataframe的创建

import numpy as np 
import pandas as pd
s1=pd.Series([1,2,3,4],index=['A','B','C','D'])			#序列的创建
pd.Series(np.arange(10))
pd.Series({'1':1,'2':2,'3':3})							#使用字典创建序列
data={'Country':['A','B','C'], 
      'Capital':['AA','BB','CC'], 
      'Population':[1,2,3]}								#创建dataframe
pd.Series(data['Country'])								#dataframe是由多个series组成
s1=pd.Series([4,5,6,7],index=['A','B','C','D'])
d1=DataFrame([s1,s2],index=['A','B','C','D'],columns=['A','B'])	#使用2个series创建dataframe
df_new=DataFrame(df,columns=['change','2019'])			#添加不存在的列
df_new['2019']=range(0,7)								#赋值
df_new['2019']=np.Series(np.arange(0,7))				#赋值
df_new['2019']=np.Series([100,200],index=[1,2])			#特定index赋值


series和dataframe的访问

s1.values						#访问s1序列的数据
s1.index						#访问s1序列的index
s1['A']
s1[s1>2]
s1.to_dict()					#序列转化为字典

series和dataframe的方法

pd.isnull(s1)					#判断s1是否为null
df.T							#dataframe转置操作
df.head(4)						#返回前4行
df.tail(4)						#返回后4行
df.iloc[3:6,:]					#切片、iloc基于index和列无关
df.loc[3:6,: 'D']				#切片、loc基于label
df.reindex(index=['A','B','C','D','E'],fill_value=10) #重新设置index,填充10
df.reindex(index=range(8),method='ffill')  # 自动填充
df.drop('A',axis=1)				#删除列
np.nan							#not a number
df.dropna()						#删除na
df.dropna(how='any') 			#删除有na的行
df.dropna(thresh=2)				#na大于2就删除
df.fillna(value=1)				#na 填充1 
df.fillna(value={0:0, 1:1,2:2,3:3}) #某一列不同的nan修改
s1=Series(np.random.randn(6),index=[['1','1','1','2','2','2'],
                                    ['a','b','c','a','b','c']])
s1.unstack()					#二级series转置dataframe
df2=DataFrame([s1['1'],s1['2']])#二级series转置dataframe
s2 = df1.unstack()				#dataframe转置二级series

df1 = DataFrame({"城市":["北京","上海","广州"],"人口":[1000,2000,3000]})
gdp_map = {"北京":100,"广州":300,"上海":200}
df1['GDP'] = df1['城市'].map(gdp_map) #map方法按照字典添加新列
s1.replace(1,np.nan)			#index为1用nan代替


series和dataframe的IO

import numpy as np 
import pandas as pd
import webbrowser
link = 'https://www.tiobe.com/tiobe-index/'
webbrowser.open(link)					#打开链接
df=pd.read_clipboard()					#读取粘贴板信息
df.to_csv('df1.csv',index=False)		#csv写文件,index=False代表去掉index
df1=pd.read_csv('df1.csv')				#读取csv文件
df.to_json()							#转换成json格式

series和dataframe的进阶

df = DataFrame([[1,2,3],[4,5,np.nan],[7,8,9]],index=['A','B','C'],columns=['c1','c2','c3'])
df.sum()								#默认对每一行求和,nan忽略
df.describe()
df.sort_values('A',ascending=False)		#排序默认升序,ascending=False降序
df.index = df.index.map(str.upper)		#map方法
df1.rename(index=str.lower,columns=str.lower)#rename方法

df1 = DataFrame({'key':['X','Y','Z'],'data_set_1':[1,2,3]})
df2 = DataFrame({'key':['X','X','C'],'data_set_2':[4,5,6]})
pd.merge(df1,df2)						#merge方法
pd.merge(df1,df2,on='key',how='left')	#相当于left join

s1 = Series([1,2,3],index=['X','Y','Z'])
s2 = Series([4,5],index=['A','B'])
pd.concat([s1,s2])						#两个series链接
s1.combine_first(s2)					#相同index的s1中nan被s2填充

df['A']=df['A'].apply(str.upper)		#使用apply进行操作
df['data'][0].split(' ')				#将data分列成多列

len(df['time'].unique())				#查看列不重复的数量
df['time'].duplicated().head()
df_new = df.drop_duplicates()			#判断是否重复,并删除返回df_new.{'data'},keep='last' 以data列为标准,留最后一个

from datetime import datetime
t1 = datetime(2009,10,20)				#时间序列
date_list = [
    datetime(2016,9,1),
    datetime(2016,9,10),
    datetime(2017,9,1),
    datetime(2017,9,10),
    datetime(2017,10,1)
]
s1 = Series(np.random.rand(5),index=date_list)
s1['2016-9']							#获取9月份的数据
date_list_new = pd.date_range(start='2017-01-01',periods=10)#随机生成时间 w代表周、h代表小时
s1['2016-01'].mean()					#获取1月的平均值
s1_month = s1.resample('M').mean()		#算每个月的平均值
s1_test = s1.resample('H').ffill()		#数据填充,往前填充 bfill是往后填充

score_list = np.random.randint(0,100,size=20)
bins = [0,59,70,80,100]
score_cut = pd.cut(score_list,bins)		#score_list按照bins分箱
pd.value_counts(score_cut)				#统计每个数值区间的个数

g = df.groupby(df['city'])				#分箱分组技术
g.get_group('gz')						#获取分组后gz的结果
g.agg('min')							#聚合技术、获取每个组最小的值
g_new = df.groupby(['city','wind'])		#多分组技术


3、Matplotlib

matplotlib基本概念:

matloptilib是一个Python包,用于2D绘图

matloptilib的基本用法

import numpy as np 
import matplotlib.pyplot as plt
t=np.arange(0.0,2.0,0.1)			#x轴数据
s=np.sin(t*np.pi)					#y轴数据
plt.plot(t,s,'y--',label='AA')		#第一条曲线,颜色,名字,曲线类型
plt.plot(2*t,s,color="red", linestyle="--",label='bb')		#第二条曲线,颜色,名字,曲线类型
plt.xlabel('t')						#x轴命名
plt.ylabel('s')						#y轴命名
plt.xlim(-5, 15)					#限制x轴数据
plt.ylim(0, 1)						#限制y轴数据
plt.axis([-1, 11, -2, 2])			#x的最小、最大,y的最小、最大
plt.title('demo')
plt.legend()						#显示事例label
plt.scatter(t,s)					#绘制散点图
plt.subplot(2,1,1)					#代表2行1列图1
plt.plot(t,s,'y--',label='AA')
plt.subplot(212)					#代表2行1列图2
plt.plot(t*2,s,'r*',label='BB')
figure,ax = plt.subplots(2,2)   	# 表示两行两列的画布
ax[0][0].plot(t1,s)
ax[0][1].plot(t2,s)