numpy:

ndarry: n->多个 d->维度
矢量计算,广播功能 这是与列表最大的区别.

创建数组:

import numpy

  1. import numpy as np
  2. np.arange(start,end,step) # step可为浮点数,range为python下的
  3. np.array(列表|元组)
  4. np.zeros((元组-shape)) 行.列
  5. np.zeros_like(arr)
  6. np.ones()
  7. np.ones_like()
  8. np.empty(size)
  9. np.linspace(start,end,points,endpoint=True)# 均匀分布的线性数组,
  10. np.eye(size) #单位矩阵
  11. np.identily() 矩阵
  12. #随机数创建
  13. np.random.seed(种子号) 固定随机数,保持模型的稳定性,数据持久
  14. np.random.rand(shape|size). 形状
  15. np.random.random(size)左闭右开 0-1
  16. np.random.randn(size) #正态分布的随机数
  17. np.random.randint(start,end,size) size:数据个数

矩阵点乘:
左列=右行->左行右列
33 . 32 =3*2
b6e8548ff49a84c05a8f7303943af10.jpg

数组属性:

  1. arr.dtype 数组元素类型 df.dtypes type()
  2. arr.itemsize 数组元素占用内存
  3. arr.size 数组元素个数
  4. arr.shape 数组形状(几行几列)
  5. arr.ndim 维度 (行.列-二维) 行-一维

数组方法:

  1. arr.reshape(n,n1) 改变数组形状,nn
  2. arr.astype(np.int) 转变元素类型
  3. arr.transpose() arr.T 转置
  4. arr.dot(arr.T) 矩阵点乘 如上图
  5. arr.max() 数组最大值
  6. arr.argmax() 返回最大值的下标
  7. arr.min()
  8. arr.argmin()
  9. arr.mean(axis) 平均值
  10. arr.mode()众数
  11. arr.medain() 中位数
  12. arr.where((condition条件),为True的执行代码,为False | 符合条件元素的所在位置)
  13. arr.std() 标准差
  14. arr.var() 方差
  15. arr.sqrt()
  16. np.log()
  17. np.log10()
  18. np.unique() 去重
  19. np.cumsum() 累加函数
  20. np.sort(axis)
  21. np.vstack((arr1,arr2)) v-vertical 垂直叠加
  22. np.hstack((arr1,arr2)) h-horizontal 水平叠加
  23. np.insert()
  24. np. append()
  25. np.isnan()

pandas

一.series

` 1.创建series:
传入数据:字典
(列表,index,dtype)

  1. import pandas as pd
  2. #创建
  3. pd.Series(data,dtype=np.int,index=[],dtype)

`2.属性:

  1. ser.size
  2. ser.index
  3. ser.values :->array
  4. ser.dtype

3.方法:

  1. pd.isnull(ser)
  2. ser.astype()
  3. ser.map(字典) :{key待映射数据: 映射值}
  4. serr.apply(函数)

4.索引切片:

  1. #索引:
  2. ser[index]
  3. ser[index]=np.nan
  1. #遍历
  2. 1.for i in ser.values:
  3. 2.for i in ser.index:
  4. 3.for k,v in ser.items()
  5. 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. import numpy as np
    2. import pandas as pd
    1.1数据: dict{key:value} ; key—列索引 , value—数据值
    dict{key:{key1:value}} 外层索引为列索引,内存索引为行索引
  1. # 用字典创建dataframe
  2. data = {'city': ['北京', '北京', '北京', '上海', '上海', '上海'],
  3. 'year': [2000, 2001, 2002, 2001, 2002, 2003],
  4. 'population': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
  5. frame = pd.DataFrame(data)
  6. frame
  7. city year population
  8. 0 北京 2000 1.5
  9. 1 北京 2001 1.7
  10. 2 北京 2002 3.6
  11. 3 上海 2001 2.4
  12. 4 上海 2002 2.9
  13. 5 上海 2003 3.2

2.属性

  1. df.columns
  2. df.shape
  3. df.dtypes
  4. df.axes

3索引:

布尔索引:
一般根据下标索引,布尔索引可以按照真假来索引.
外层数据data[ bool值]传入的真假个数必须与外层数据个数相同.
通过比较运算符得到bool值,

  1. df['列名'] -series
  2. df.列名 #只能提取列,不能用它创建新列 -series
  3. df[['列名']] -dataframe
  4. df.loc[行,列] 字符串索引
  5. df.iloc[] #integer 数字索引

4.方法:

  1. 删除列
  2. labels=columns,写了columns可以不用axis
  3. df.drop(columns=['列名','列名'],axis=1 inplace=,errors='raise']
  4. df.drop(labels=['列名','列名'],axis=1 inplace=,errors='raise']
  5. ##1.信息查看:-----------
  6. df.dtypes
  7. df.info() #对象类型, 行数据量,列数,每列的非空数据, 数据类型,各种类型的个数,占用空间的大小
  8. df.describe(include=object) #默认数值型数据.加上include字符串也可以描述
  9. ##2.空值:--------------
  10. df.isnull()
  11. df.dropna(subset=['a','b'],how=any|all,axis=0|1) #subset:子系删除
  12. df.fillna(value|dict,axis=0|1) # 值填充可定位空值,或者字典KeyValue对应单个空值定位填充
  13. df.fillna(method="ffill/bfill",limit=n) # method:向前/向后填充,limit:限制个数
  14. ##3.重复值--------------
  15. df.duplicated()#判断重复值
  16. df.drop_duplicates([列名],subset=['a','b'],keep=last|first)# keep:保留第一个和最后一个
  17. ## 排序-----------------
  18. df.sort_index()
  19. df.sort_values(by=''|[],ascending=False)
  20. ##设置索引--------------
  21. df.set_index(keys=str) 把某一列作为索引
  22. df.reset_index(drop=) 把索引重置(0-n),drop参数:是否把现在的索引当成你的列,相当于多了一个列.
  23. ##读取----------------
  24. df.head()
  25. df.tail()
  26. pd.read_csv(文件路径)
  27. pd.read_excel()
  28. pd.read_sql

5.分组:

groupby(by=[],as_index=Faelse,group_keys=False)
group_keys=”” : 将聚合的组字段是否做为分组的字段.会出来索引套索引的相同的列
在索引的基础上让他不重复出现
as_index=False :将聚合的字段是否作为索引.,变为dataframe
去掉索引

应用场景:
分组排序,填充空值,列计算
下载.png

  1. groupby(by=[],as_index=Faelse,group_keys=False)['str'].aggregate('sum'|[]|{}) #函数功能
  2. .apply() #函数
  3. .nlargest() #取前几个最大的
  4. .transform('sum') # 值计算,聚合后个数与行数相同
  5. .unstack(level=-1) 行转列,不堆
  6. .stack() 列转行,堆
  7. level,默认倒数第一层索引-1,行:最右边为最后一层,列.最下边为最后一层

5.1多个索引分组聚合,求和在排序

  1. #计算每年销量的top3
  2. s1.groupby(['销售年份','销售代表ID'],as_index=False]).sum()['销售额'].groupby('销售年份',group_keys=False).nlargest(5)
  3. .apply(lambda x:x.sort_values(by='',ascending=True)[:n])

5.2transfrom(sum)的利用

下载 (1).png
解决聚合求值后生成个数与行数不同

  1. # transform () 对每一个数据都进行转化,传入需要的结果
  2. df1.groupby('order')[['ext price']].transform('sum')
  3. df1['percent_of_total']=df1['ext price']/df1.groupby('order')['ext price'].transform('sum')
  4. df1

apply()方法求值

  1. total=df2.groupby('order')['ext price_y'].sum().rename('order_total')
  2. df3=pd.merge(df1,total,how='left',on='order')
  3. df3['parenr_of_total']=df3['ext price']/df3['order_total']

6.透视表

  1. 透视表参数利用笔记
    1. pd.pivot_table(data=titanic,values='survived',index='sex',columns='class',aggfunc='mean')
    当aggfunc 传列表时:出现多层索引的列,外层是函数,内层是列索引
    传字典时,对value进行操作:每一个把value 对应一个函数

    7.连接表

    1. df.concat(df1,axis=)
    2. ###ignore_index==reset_index(drop=True)
    3. pd.concat([df1,df2],axis=,ignore_index=True)#ignore_index,重设索引,忽略原来的索引.横向连不需要,纵向连需要,
    4. df.merge(df1)
    5. pd.merge(df1,df2,on='',left_on='',right_on='',right_index='',left_index=''/how='left'/'right'/'inner'/'outer',Suffixes=('str','str'))
    6. suffixes: 防止列重名

    8.值计数:

    df[ ‘’].value_counts() 排序的Series

    9.分桶

    等距分桶
    pd.cut( series,bins= ):
    bins=int 桶数 | [ 0,4,6] 区间 -桶左开右闭,包头不包尾
    1. #bins:分桶个数|桶界限,labels:桶区间名字
    2. pd.cut(titanic['age'],bins=n|[0,10,18] ,labels=['''''])
    等频分桶:
    1. q: 四分位数等频,分割成10
    2. pd.qcut(titanic['age'],q=n|[0,0.25,0.5,0.75,1] ,labels=['''''])
    10.统计学异常值检测:
    1.正态分布数据三西格玛:
    2.四分位检测
    11.读取文件:
    11.1 csv文件
    1. pd.read_csv(path)
    2. ##参数-------------
    3. sep=',' 分割符,默认','
    4. enconding=utf8 编码乱码
    5. parse_date={新列名:[0,1,2]} #合并旧列为新列
    6. comment='#',删除数据中的带# 的数据
    7. skiprow=n 删除头部n
    8. skipfooter=n 删除尾部n
    11.2 sql 文件
    直接读取
    1. 直接读取:
    2. import pymysql
    3. import pandas as pd
    4. #创建连接
    5. con=pymysql.connect(host='localhost',user='root',password='password',db='train')
    6. # 读取数据,执行SQL语句
    7. data=pd.read_sql('select * from distribute',con)
    8. data.head()
    配置环境读取
    1. def function(sqli):
    2. import pymysql
    3. import pandas as pd
    4. config={'host':'localhost', #默认localhost==127.0.0.1
    5. 'user':'root', # 用户名
    6. 'password':'password', #密码
    7. 'port':3306, #端口.默认3306
    8. 'database':'train', #数据库名字
    9. 'charset':'utf8' #字符编码
    10. }
    11. # 查询语句
    12. sql='SELECT * FROM %s'%(sqli)
    13. # 使用配置参数创建连接
    14. conn=pymysql.connect(**config)
    15. #用连接获得游标
    16. cursor=conn.cursor()
    17. #用游标执行SQL语句
    18. cursor.execute(sql)
    19. #通过fetchall获取数据
    20. data=cursor.fetchall()
    21. # 获取字段属性
    22. col=cursor.description
    23. #遍历数据的前5条
    24. df=pd.DataFrame(list(data))
    25. col_name=[]
    26. for i in range(len(col)):
    27. col_name.append(col[i][0])
    28. df.columns=col_name
    29. print(df)
    30. #关闭游标
    31. cursor.close()
    32. #关闭连接
    33. conn.close()
    34. function('distribute')
    11.3 json 文件:
    json.loads(data)
    1. import requests #倒入库
    2. import json
    3. #定义地址
    4. add='九王坟'
    5. #创建访问应用时获取的AK(秘钥)
    6. mykey='DdOyOKo0VZBgdDFQnyhINKYDGkzBkuQr'
    7. #请求地址api应用程序接口 geocoder 地理
    8. url = 'http://api.map.baidu.com/geocoder/v2/?address=%s&output=json&ak=%s'
    9. # 获取返回请求
    10. res=requests.get(url% (add,mykey))
    11. #返回文本信息
    12. add_info=res.text
    13. print(add_info)
    14. add_json=json.loads(add_info)
    15. add_json
    11.4 xml文件解析
    root=Etree.fromstring(add_info)
    1. import requests
    2. import xml.etree.ElementTree as Etree
    3. url='http://api.map.baidu
    4. .com/geocoder/v2/?address=%s&output=xml&ak=%s'
    5. res=requests.get(url %(add,mykey))
    6. add_info=res.text
    7. root=Etree.fromstring(add_info)
    8. 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() 将时间固定为字符串
  1. <a name="vdFcP"></a>
  2. #### 13.画图:
  3. pandas下画图:<br />import matplotlib.pyplot as plt
  4. ```sql
  5. #导入画图包mat-matlab软件的一部分库
  6. import matplotlib.pyplot as plt
  7. # 换字体
  8. plt.rcParams['font.sans-serif']=['SimHei'] #plt是matplotlip包的缩写,他修改了参数
  9. # kind是图表类型
  10. a.season.value_counts().plot(kind='bar')#python的画图函数(plot)
  11. #对季度的值的个数进行统计绘图
  12. a.season.value_counts().plot(kind='pie',figsize=(10,10)) # 规定图表类型,画布大小
  13. plt.rcParams['axes.unicode_minus']=False #解决负号不出现的问题
  14. plt.show()# 图显示

matplotlib 下画图:

  1. # 线图===============
  2. plt.plot(x,y,fmt,lw,label=)
  3. ftm- 线型,颜色,标记形状 linestyle,marker color
  4. lw=0~1 线宽
  5. label=' ' 图例
  6. #散点图 plt.scatter 看俩个变量中间的关系========
  7. x=2*np.random.rand(100,1)
  8. y=4+3*x+np.random.randn(100,1)
  9. # 传x,y轴
  10. # c是标记点颜色,edgecolors是外层膜的颜色.lw是外层膜的厚度,s标记点大小,alpha透明度
  11. plt.scatter(x,y,alpha=0.21,s=1000,c='red',linewidths=10,edgecolors='blue')
  12. ##柱状图看数据分布plt.hist()=========
  13. np.random.seed(2)
  14. data=np.random.randn(10000)
  15. # 直接传数据,bins是条个数
  16. plt.hist(data,bins=1000,alpha=0.4)
  17. plt.show()
  18. #t条形图:plt.bar()计数
  19. data=[5,20,15,25,10]
  20. # 第二个参数是高度,
  21. plt.bar(['a','b','c','d','e'],data)# [a,b,c,d]为横坐标点,data为纵坐标
  22. #饼图plt.pie([],[])========

子图的创建:

  1. fig,ax=plt.subplots(3,3,sharex='col',sharey='row',figsize=())#返回画布和子图
  2. plt.add_subplot()
  3. plt.subplot()
  4. 定义索引位置: ax=0

核密度图:kde

  1. sns.kdeplot()
  2. #分布图:
  3. sns.displot(列)
  4. 俩变量图:
  5. sns.joinplot(x,y,数据,kind='kde,hex,reg")
  6. #多变量图
  7. sns.pairplot(data,hue='spices',height=1,kind=kde) hue:分成不同的数据/系列,增加一个维度(变量),用不同颜色标记处理
  8. #热力图
  9. sns.heatmap(data.corr(),annot=True,camp='summer) 相关系数比较

=.