1.前言
-Ptthon3
-cell有两种模式:
-code:代码模式
-markdown:编写笔记模式
2.快捷键
-添加cell:a在选中的上方添加 b在选中的下方添加
-删除:x
-修改cell的模式:m:修改成markdown模式 y:修改成code模式
-执行cell:shift+enter
-自动补全:tab
3.数据分析三剑客:numpy pandas matplotib
3.1Numpy
相当于一个容器,重在数值计算
Numpy的创建
使用np.array()创建
import numpy as np
arr = np.array([1,2,3])
array([[14, 29, 93, 73, 81, 24],
[ 9, 78, 16, 17, 44, 37],
[48, 66, 71, 57, 25, 48],
[76, 44, 73, 29, 84, 75],
[37, 15, 82, 4, 92, 39]])
3.1.1属性
数组和列表的区别
数组中存储的数据元素类型必须是统一类型
优先级:字符串>浮点型>整数
shape 返回数组的形状 5行6列
ndim 输出数组的维度 2维
size 输出数组元素的个数
dtype 输出元素的类型
arr=np.array([1,2,3],dtype=‘int64’) dtype可指定元素类型
3.1.2numpy的索引和切片
array([[41, 38, 16, 4, 42, 46],
[87, 15, 15, 13, 13, 35],
[61, 99, 44, 40, 66, 40],
[84, 4, 40, 7, 3, 93],
[58, 99, 81, 22, 73, 99]])
3.1.2.1切片操作属性
arr[[1,2]]输出的是第一第二行
arr[0:2] 输出的是第零到第一行
arr[1,2] 输出的是第一第二列的元素
arr[:,0:2] 逗号前面的切行后面切列若不切行前面一定要打: 这样输出前两列
arr[::-1]行倒置
arr[::-,::-1]列倒置
arr[::-1,::-1]行列倒置
3.3.2.2图片数组同理
plt.imshow(img_arr[:,::-1])左右对称倒置
图片数组的三个坐标img_arr[行,列,颜色]
图片也可通过数组元素切片进行切片
Reshape 可以改变数组维数 5行6列的数组改为1行30列的一维数组
3.1.3级联操作
np.concatenate((合并的第一个数组, 合并的第二个数组),axis=0) axis为0列合并 为1 行合并
arr.sum(axis=0) 求每一列的和 axis为0是行为1是列
arr.max(axis=0) 求每一列的最大值 axis为0是行为1是列
3.1.4常用的数学函数
标准三角函数 sin() cos() tan()
around(,decimals=) 函数返回指定数字的四舍五入 decimals为保留位数
numpy.amin0 和 numpy.amax0,用于计算数组中的元素沿指定轴的最小、最大值,
numpy.ptp0:计算数组中元素最大值与最小值的差(最大值 - 最小值)
numpy.median0 西数用于计算数组a中元素的中位数(中值)
标准差std0:标准差是一组数据平均值分散程度的一种度量。
公式:std = sart(mean((x - x.mean0)**2))
如果数组是11,2,3,4,则其平均值为2.5。因此,差的平方是 12.25,0.25,0.25,2.25],并且其平均值的平方根除以
4,即sqrt(5/4),结果为1.1180339887498949。
方差var0:统计中的方差(样本方差) 是每个样本值与全体样本值的平均数之差的平方值的平均数,即mean(x - x.meanO)*
Eye()可以返回一个单位矩阵
np.eye(6).T ,T可以转置矩阵
np.dot(a1,a2) 矩阵相乘
3.2Matplotlib
import matplotlib.pyplot as plt
img_arr=plt.imread('./1.jpg\') //读取一张图片存到变量img_arr中
3.2.1属性
//输出img_arr时是输出一个三维数组
plt.imshow(img_arr) //将图片输出到一坐标上
ones(shape=(3,4)) //生成三维数组每个里面有四个元素
linspace(0,100,num=20) //生成0-100间20个等差数列
arange(10,50,step=2) //生成10到50每隔两个生成一位数
random.randint(0,100,size=(5,3)) //生成5行3列在0-100之间的随机数
3.3pandas
主要存储非数值类对象
Series 类似于一维数组的对象
Value:一组数据
Index:相关的数据索引
df=pd.read_excel('lemon.xlsx',sheet_name='student')#可以通过sheet_name来指定读取的表单
from pandas import Series //引入
3.3.1series的常用属性
shape
size
index
values
3.3.2series的常用方法
head(),tail()
unique()
isnull()
notnull()
add() sub() mul() div()
例子:
s.head(1) 输出前几个数据
s.tail(1) 输出后几个数据
s.unique() 去重
s.isnull() 判断是否为空 不是为false
s.notnull() 与上面相反
3.3.3series的算数法则
索引一致的元素进行算数运算否则补空
3.3.4DataFrame
• DataFrame是一个【表格型】的数据结构。DataFrame由按 一定顺序排列的多列数据组成。设计初衷是Series的使用场 景从一维拓展到多维。DataFrame既有行素引,也有列引。
行素引:index
列素引:columns
值:values
from pandas import DataFrame
df=DataFrame(data=[[1,2,3],[4,5,6]])
df
df[1]取单列 df[[1,2]]取多列 都是显示索引
df.loc[1] 显示取行 df.iloc[1] 隐示取行
df.iloc[1,1] 隐示取第一行第一个
df[0:2] #切行 df.loc[0:2] #切列
单独取一个值 a[行,列]
df.to_csv(’./maotai.csv’) 将数据存储到本地
df.drop 删除
3.3.5数据清洗
import numpy as np
type(None) //None对象类型
type(np.nan) //NAN浮点型
为什么在数据分析中需要用到的是浮点类型的空而不是对象类型?
数据分析中会常常使用某些形式的运算来处理原始数据,如果原数数据中的空值为NAN的形式,则不会干扰或者中断运
算。
NAN可以参与运算的
None是不可以参与运算
3.3.5.1 方式1:对空值进行过滤(删除空行所在的数据)
技术:isnull,notnull,any,all
df.isnull()
df.isnull().any(axis=1) //找出为空的行
df.loc[df.isnull().any(axis=1)]
drop_index=df.loc[df.isnull().any(axis=1)].index #要删除的索引
df.drop(labels=drop_index,axis=0)
或者用
df.dropna(axis=0)
df.dropna(axis=0) pandas内集成的
3.3.5.2方法二:对缺失值的覆盖
Fillna
df.fillna(value=) 填充值
df.fillna(method=‘ffill’,axis=1) 填充前面的值 axis=1 左右填充 axis=0 纵向填充
df.fillna(method=‘bfill’,axis=1) 填充后面的值 axis=1左右填充 axis=0 纵向填充
df.fillna(method='ffill',axis=1)
3.3.5.3使用drop_duplicates清洗重复行数据
df.drop_duplicates(keep='first') //保留重复的第一行
3.3.6DataFrame的级联
pd.concat((df1,df2),axis=0,join='inner') //axis的取值决定合并行或列 join的取值决定外内链接
不匹配链接
不匹配指的是级联的维度的索引不一致。例如纵向级联时列索引不一致,横向级联时索引不一致
3.3.6.1有两种连接方式
外连接:补NaN(默认模式)
内连接:只连接匹配的项
Append函数的使用 只能是列跟列的外级联
df1.append(df2)
3.3.7DataFrame的合并
pd.merge(df1,df2,on='employee' ,how=) //on的值为合并条件 how的值为内外连接
查找符合条件的数据,括号内为条件
abb_pop.query(’’)
3.3.8排序
abb_pop.sort_values(by=‘pop’,axis=0,ascending=False)
3.3.9替换操作
替换操作可以同步作用于Serise和DataFrame中
3.3.9.1单值替换
普通替换:替换所有符合要求的元素:to_replace=15,val='e
按指定单值替换: to_replace=(列标签:替换值) value=‘value’
df.replace(to_replace=4,value='Two')
3.3.9.3多值替换
列表替换:to_replace[] val=[]
字典替换:to_replace={to_replace;value,to_replace:value}
df.replace(to_replace={97:'ome'})
3.3.10映射操作
概念:创建一个映射关系列表,把values元素和一个特征值的标签或者字符串绑定
创建一个df,两列分别是姓名和薪资,然后给其名字起对应的英文名
dic={
'name':['张三','李四','张三'],
'salary':[15000,2000,15000]
}
df=DataFrame(data=dic)
df
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1g7HpGA5-1647857721436)(https://cdn.jsdelivr.net/gh/kdmvp-lin/MarkdownImg/202203211812989.png)]
dic={
'张三':'Tom',
'李四':'Jack'
}
df['e_name']=df['name'].map(dic)
df
Map是series的方法,只能被series调用
Map也可以充当运算工具
def after_sal(s):
return s-(s-3000)*0.5
df['salary'].map(after_sal)
括号里写运算方法
3.3.11数据的分类处理
数据分类处理的核心
Groupby()函数
df=DataFrame({
'item':['Apple','Banana','Orange','Banana','Orange','Apple'],
'color':['red','yellow','yellow','green','green','green'],
'weight':[12,20,50,30,20,44]
})
df
Groups属性查看分组情况
#想要水果种类进行分类
df.groupby(by='item')
df.groupby(by='item').groups #按照item分类
df.groupby(by='color')['weight'].mean()
df.groupby(by=‘item’)[‘weight’].transform(my_mean) 使用transform自定义聚合操作my_mean为自定义函数
def my_mean(s):
m_sum=0
for i in s:
m_sum += i
return m_sum /len(s)
df.groupby(by='item')['weight'].transform(my_mean)
3.3.12透视表和交叉表
import numpy as np
import pandas as pd
from pandas import DataFrame
df=pd.read_csv('./text_1/text1.txt')
df
df.shape
pd.read_csv('./text_1/text1.txt',header=None,sep='-')
Header表示行的名称 sep表示设置分隔
#建立连接数据库 import sqlite3 as sqlit3 conn=sqlite3.connect(’./data/weather_2020.sqlite’)
#读取库表中的数据 sql_df=pd.read_sql(‘select * from weather_2020’,conn)
#将df中的数据值写入存储到db中 data.to_sql(‘sql_data123’,conn)
import pandas as pd
import numpy as np
df=pd.read_excel('./text_1/meal_order_detail.xlsx')
df
df.pivot_table(index=['dishes_name'])
Pivot_table有四个最重要的参数index,values,columns,aggfunc
Index参数:分类汇总条件
每个pivot_table必须拥有一个index
在index内数据作为行名时只看values内的值
Columns可以设置列层次字段
对values字段进行分类
df=DataFrame({
'sex':['man','man','woman','woman','man','woman','man','woman','woman'],
'age':[15,23,25,17,35,57,24,31,22],
'smoke':[True,False,False,True,True,False,False,True,False],
'height':[168,179,181,166,173,178,188,190,160]
})
df
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oddoXeqt-1647857721441)(https://cdn.jsdelivr.net/gh/kdmvp-lin/MarkdownImg/202203211814960.png)]
pd.crosstab(df.smoke,df.sex) #以是否抽烟和年龄为条件统计
pd.crosstab(df.age,df.smoke)
3.3.13iterows()
iterrows()
是在数据框中的行进行迭代的一个生成器,它返回每行的索引及一个包含行本身的对象。
所以,当我们在需要遍历行数据的时候,就可以使用 iterrows()
方法实现了。
4.绘图
import matplotlib.pyplot as plt
import numpy as np
4.1单线图
#绘制单条线性图
x=np.array([1,2,3,4,5])
y=x+3
plt.plot(x,y)
4.2多线图
#绘制多条线性图
plt.plot(x,y)
plt.plot(x+2,y-1)
plt.plot(x,y,x+1,y+2)
4.3设置坐标系的比例plt.figure(figsize=(a,b))
#设置坐标系的比例plt.figure(figsize=(a,b))
plt.figure(figsize=(5,9))
plt.plot(x,y)
![image-20211107225156619](https://cdn.jsdelivr.net/gh/kdmvp-lin/MarkdownImg/202203211814600.png)
4.4#设置图例legend()
#设置图例legend()
plt.plot(x,y,label='one')
plt.plot(x+2,y-2,label='two')
plt.legend()
4.5#设置标识
#设置标识
plt.plot(x,y)
plt.xlabel('temple')
plt.ylabel('dist')
plt.title('dist&temple')
4.6#图例保存
#图例保存
fig =plt.figure() #先建一个图像保存的对象
plt.plot(x,y,label='x,y')
fig.savefig('./123.png') #保存路径
4.7柱状图
#柱状图
plt.bar(x,y)
4.8直方图
#直方图 统计密度看出现的次数
data=[1,1,1,1,2,2,2,3,3,5,5,5,5,5,5,6,6,6,6]
plt.hist(data,bins=20)
4.9饼图
#饼图
arr=[11,22,31,15]
plt.pie(arr)
4.10散点图
#散点图
x=np.array([1,2,3,4,5,6])
y=x**2-3
plt.scatter(x,y)