numpy:
ndarry: n->多个 d->维度
矢量计算,广播功能 这是与列表最大的区别.
创建数组:
import numpy
import numpy as np
np.arange(start,end,step) # step可为浮点数,range为python下的
np.array(列表|元组)
np.zeros((元组-shape)) 行.列
np.zeros_like(arr)
np.ones()
np.ones_like()
np.empty(size)
np.linspace(start,end,points,endpoint=True)# 均匀分布的线性数组,
np.eye(size) #单位矩阵
np.identily() 矩阵
#随机数创建
np.random.seed(种子号) 固定随机数,保持模型的稳定性,数据持久
np.random.rand(shape|size). 形状
np.random.random(size)左闭右开 0-1
np.random.randn(size) #正态分布的随机数
np.random.randint(start,end,size) size:数据个数
数组属性:
arr.dtype 数组元素类型 df.dtypes type()
arr.itemsize 数组元素占用内存
arr.size 数组元素个数
arr.shape 数组形状(几行几列)
arr.ndim 维度 (行.列-二维) 行-一维
数组方法:
arr.reshape(n,n1) 改变数组形状,n行n列
arr.astype(np.int) 转变元素类型
arr.transpose() arr.T 转置
arr.dot(arr.T) 矩阵点乘 如上图
arr.max() 数组最大值
arr.argmax() 返回最大值的下标
arr.min()
arr.argmin()
arr.mean(axis) 平均值
arr.mode()众数
arr.medain() 中位数
arr.where((condition条件),为True的执行代码,为False | 符合条件元素的所在位置)
arr.std() 标准差
arr.var() 方差
arr.sqrt()
np.log()
np.log10()
np.unique() 去重
np.cumsum() 累加函数
np.sort(axis)
np.vstack((arr1,arr2)) v-vertical 垂直叠加
np.hstack((arr1,arr2)) h-horizontal 水平叠加
np.insert()
np. append()
np.isnan()
pandas
一.series
` 1.创建series:
传入数据:字典
(列表,index,dtype)
import pandas as pd
#创建
pd.Series(data,dtype=np.int,index=[],dtype)
`2.属性:
ser.size
ser.index
ser.values :->array
ser.dtype
3.方法:
pd.isnull(ser)
ser.astype()
ser.map(字典) :{key待映射数据: 映射值}
serr.apply(函数)
4.索引切片:
#索引:
ser[index]
ser[index]=np.nan
#遍历
1.for i in ser.values:
2.for i in ser.index:
3.for k,v in ser.items()
4.for k,v in enumerate(ser4) #枚举
二. DataFrame
1.创建:
- frame=pd.DataFrame(数据, columns=[列索引], index=[行索引])
- 嵌套字典创建(外层key是列名,内层key是行名)
通过对列的索引位置交换可以改变排列:
pd.DataFrame(data, columns=[‘year’, ‘city’, ‘population’])
对于字典创建的数据在输入列索引columns时,可以添加多个索引,值为NaN
- 列索引多了不会报错,但是行索引多了会报错
1.1数据: dict{key:value} ; key—列索引 , value—数据值import numpy as np
import pandas as pd
dict{key:{key1:value}} 外层索引为列索引,内存索引为行索引
# 用字典创建dataframe
data = {'city': ['北京', '北京', '北京', '上海', '上海', '上海'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'population': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data)
frame
city year population
0 北京 2000 1.5
1 北京 2001 1.7
2 北京 2002 3.6
3 上海 2001 2.4
4 上海 2002 2.9
5 上海 2003 3.2
2.属性
df.columns
df.shape
df.dtypes
df.axes
3索引:
布尔索引:
一般根据下标索引,布尔索引可以按照真假来索引.
外层数据data[ bool值]传入的真假个数必须与外层数据个数相同.
通过比较运算符得到bool值,
df['列名'] -series
df.列名 #只能提取列,不能用它创建新列 -series
df[['列名']] -dataframe
df.loc[行,列] 字符串索引
df.iloc[] #integer 数字索引
4.方法:
删除列
labels=columns,写了columns可以不用axis
df.drop(columns=['列名','列名'],axis=1 inplace=,errors='raise']
df.drop(labels=['列名','列名'],axis=1 inplace=,errors='raise']
##1.信息查看:-----------
df.dtypes
df.info() #对象类型, 行数据量,列数,每列的非空数据, 数据类型,各种类型的个数,占用空间的大小
df.describe(include=object) #默认数值型数据.加上include字符串也可以描述
##2.空值:--------------
df.isnull()
df.dropna(subset=['a','b'],how=any|all,axis=0|1) #subset:子系删除
df.fillna(value|dict,axis=0|1) # 值填充可定位空值,或者字典KeyValue对应单个空值定位填充
df.fillna(method="ffill/bfill",limit=n) # method:向前/向后填充,limit:限制个数
##3.重复值--------------
df.duplicated()#判断重复值
df.drop_duplicates([列名],subset=['a','b'],keep=last|first)# keep:保留第一个和最后一个
## 排序-----------------
df.sort_index()
df.sort_values(by=''|[],ascending=False)
##设置索引--------------
df.set_index(keys=str) 把某一列作为索引
df.reset_index(drop=) 把索引重置(0-n),drop参数:是否把现在的索引当成你的列,相当于多了一个列.
##读取----------------
df.head()
df.tail()
pd.read_csv(文件路径)
pd.read_excel()
pd.read_sql
5.分组:
groupby(by=[],as_index=Faelse,group_keys=False)
group_keys=”” : 将聚合的组字段是否做为分组的字段.会出来索引套索引的相同的列
在索引的基础上让他不重复出现
as_index=False :将聚合的字段是否作为索引.,变为dataframe
去掉索引
应用场景:
分组排序,填充空值,列计算
groupby(by=[],as_index=Faelse,group_keys=False)['str'].aggregate('sum'|[]|{}) #函数功能
.apply() #函数
.nlargest() #取前几个最大的
.transform('sum') # 值计算,聚合后个数与行数相同
.unstack(level=-1) 行转列,不堆
.stack() 列转行,堆
level,默认倒数第一层索引-1,行:最右边为最后一层,列.最下边为最后一层
5.1多个索引分组聚合,求和在排序
#计算每年销量的top3
s1.groupby(['销售年份','销售代表ID'],as_index=False]).sum()['销售额'].groupby('销售年份',group_keys=False).nlargest(5)
.apply(lambda x:x.sort_values(by='',ascending=True)[:n])
5.2transfrom(sum)的利用
解决聚合求值后生成个数与行数不同
# transform () 对每一个数据都进行转化,传入需要的结果
df1.groupby('order')[['ext price']].transform('sum')
df1['percent_of_total']=df1['ext price']/df1.groupby('order')['ext price'].transform('sum')
df1
apply()方法求值
total=df2.groupby('order')['ext price_y'].sum().rename('order_total')
df3=pd.merge(df1,total,how='left',on='order')
df3['parenr_of_total']=df3['ext price']/df3['order_total']
6.透视表
- 透视表参数利用笔记
当aggfunc 传列表时:出现多层索引的列,外层是函数,内层是列索引pd.pivot_table(data=titanic,values='survived',index='sex',columns='class',aggfunc='mean')
传字典时,对value进行操作:每一个把value 对应一个函数7.连接表
df.concat(df1,axis=)
###ignore_index==reset_index(drop=True)
pd.concat([df1,df2],axis=,ignore_index=True)#ignore_index,重设索引,忽略原来的索引.横向连不需要,纵向连需要,
df.merge(df1)
pd.merge(df1,df2,on='',left_on='',right_on='',right_index='',left_index=''/how='left'/'right'/'inner'/'outer',Suffixes=('str','str'))
suffixes: 防止列重名
8.值计数:
df[ ‘’].value_counts() 排序的Series9.分桶
等距分桶
pd.cut( series,bins= ):
bins=int 桶数 | [ 0,4,6] 区间 -桶左开右闭,包头不包尾
等频分桶:#bins:分桶个数|桶界限,labels:桶区间名字
pd.cut(titanic['age'],bins=n|[0,10,18] ,labels=['''''])
10.统计学异常值检测:q: 四分位数等频,分割成10份
pd.qcut(titanic['age'],q=n|[0,0.25,0.5,0.75,1] ,labels=['''''])
1.正态分布数据三西格玛:
2.四分位检测
11.读取文件:
11.1 csv文件
11.2 sql 文件pd.read_csv(path)
##参数-------------
sep=',' 分割符,默认','
enconding=utf8 编码乱码
parse_date={新列名:[0,1,2]} #合并旧列为新列
comment='#',删除数据中的带# 的数据
skiprow=n 删除头部n行
skipfooter=n 删除尾部n行
直接读取
配置环境读取直接读取:
import pymysql
import pandas as pd
#创建连接
con=pymysql.connect(host='localhost',user='root',password='password',db='train')
# 读取数据,执行SQL语句
data=pd.read_sql('select * from distribute',con)
data.head()
11.3 json 文件:def function(sqli):
import pymysql
import pandas as pd
config={'host':'localhost', #默认localhost==127.0.0.1
'user':'root', # 用户名
'password':'password', #密码
'port':3306, #端口.默认3306
'database':'train', #数据库名字
'charset':'utf8' #字符编码
}
# 查询语句
sql='SELECT * FROM %s'%(sqli)
# 使用配置参数创建连接
conn=pymysql.connect(**config)
#用连接获得游标
cursor=conn.cursor()
#用游标执行SQL语句
cursor.execute(sql)
#通过fetchall获取数据
data=cursor.fetchall()
# 获取字段属性
col=cursor.description
#遍历数据的前5条
df=pd.DataFrame(list(data))
col_name=[]
for i in range(len(col)):
col_name.append(col[i][0])
df.columns=col_name
print(df)
#关闭游标
cursor.close()
#关闭连接
conn.close()
function('distribute')
json.loads(data)
11.4 xml文件解析import requests #倒入库
import json
#定义地址
add='九王坟'
#创建访问应用时获取的AK(秘钥)
mykey='DdOyOKo0VZBgdDFQnyhINKYDGkzBkuQr'
#请求地址api应用程序接口 geocoder 地理
url = 'http://api.map.baidu.com/geocoder/v2/?address=%s&output=json&ak=%s'
# 获取返回请求
res=requests.get(url% (add,mykey))
#返回文本信息
add_info=res.text
print(add_info)
add_json=json.loads(add_info)
add_json
root=Etree.fromstring(add_info)import requests
import xml.etree.ElementTree as Etree
url='http://api.map.baidu
.com/geocoder/v2/?address=%s&output=xml&ak=%s'
res=requests.get(url %(add,mykey))
add_info=res.text
root=Etree.fromstring(add_info)
print(add_info)
12.转数据格式:
提起年月日
.dt.year|month|day ```sql from datetime import datetime from dateutil import parser data[‘’].astype(‘datetime64[ns]’) pd.to_datetime(数据,format=’%Y%m%d%H%M%S’,errors=’coerce’) df[].apply(lambda x:parser.parse(x) df[].apply(lambda x:datetime.strptime(x,%Y%m%d%H%M%S) 将字符串转化为时间 strftime() 将时间固定为字符串
<a name="vdFcP"></a>
#### 13.画图:
pandas下画图:<br />import matplotlib.pyplot as plt
```sql
#导入画图包mat-matlab软件的一部分库
import matplotlib.pyplot as plt
# 换字体
plt.rcParams['font.sans-serif']=['SimHei'] #plt是matplotlip包的缩写,他修改了参数
# kind是图表类型
a.season.value_counts().plot(kind='bar')#python的画图函数(plot)
#对季度的值的个数进行统计绘图
a.season.value_counts().plot(kind='pie',figsize=(10,10)) # 规定图表类型,画布大小
plt.rcParams['axes.unicode_minus']=False #解决负号不出现的问题
plt.show()# 图显示
matplotlib 下画图:
# 线图===============
plt.plot(x,y,fmt,lw,label=)
ftm- 线型,颜色,标记形状 linestyle,marker color
lw=0~1 线宽
label=' ' 图例
#散点图 plt.scatter 看俩个变量中间的关系========
x=2*np.random.rand(100,1)
y=4+3*x+np.random.randn(100,1)
# 传x,y轴
# c是标记点颜色,edgecolors是外层膜的颜色.lw是外层膜的厚度,s标记点大小,alpha透明度
plt.scatter(x,y,alpha=0.21,s=1000,c='red',linewidths=10,edgecolors='blue')
##柱状图看数据分布plt.hist()=========
np.random.seed(2)
data=np.random.randn(10000)
# 直接传数据,bins是条个数
plt.hist(data,bins=1000,alpha=0.4)
plt.show()
#t条形图:plt.bar()计数
data=[5,20,15,25,10]
# 第二个参数是高度,
plt.bar(['a','b','c','d','e'],data)# [a,b,c,d]为横坐标点,data为纵坐标
#饼图plt.pie([],[])========
子图的创建:
fig,ax=plt.subplots(3,3,sharex='col',sharey='row',figsize=())#返回画布和子图
plt.add_subplot()
plt.subplot()
定义索引位置: ax=0
核密度图:kde
sns.kdeplot()
#分布图:
sns.displot(列)
俩变量图:
sns.joinplot(x,y,数据,kind='kde,hex,reg")
#多变量图
sns.pairplot(data,hue='spices',height=1,kind=kde) hue:分成不同的数据/系列,增加一个维度(变量),用不同颜色标记处理
#热力图
sns.heatmap(data.corr(),annot=True,camp='summer) 相关系数比较
=.