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) 改变数组形状,n行n列
  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) 相关系数比较

=.