一、环境安装
本文使用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%2、1/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)