Python数据分析与应用

文章目录

  • Python数据分析与应用
    • 一、基础知识
      • 数据分析:检查、清理、转换、建模
      • Anaconda
      • Python基础
      • 1.3 包/模块使用示例
    • 二、Numpy
      • 2.1 ndarray类(N-Dimension Array, n维数组)
      • 2.3 索引和切片
      • 2.4 数据拷贝
      • 2.5 数据处理
      • 2.6 高级索引
      • 附录:NumPy通用函数:
    • 三、Pandas
      • 3.1 Series类
      • 3.2 DataFrame对象
      • 3.3 index对象
      • 3.4 元素的访问方式
      • 3.5 数据清洗
      • 3.6 数据合并
      • 3.7 数据重塑
    • 四、数据统计分析
      • 4.1 基本统计分析
      • 4.2 分组分析
      • 4.3 分布分析
      • 4.4 交叉分析
      • 4.5 结构分析
      • 4.6 相关分析
    • 五、时间序列分析
      • 5.1 Datetime模块
      • 5.2 时间序列基础
      • 5.3 时间日期处理
      • 5.4 频率转换与重采样
    • 六、数据可视化
      • 6.1 Matplotlib
      • 6.2 Seaborn
      • 6.3 Pyecharts
    • 七、网络爬虫
      • 7.1、网络数据爬虫
      • 7.2 数据文件操作
    • 八、MySQL
      • Python连接数据库
      • 读数据库:
      • 数据操作

Python数据分析与应用

一、基础知识

数据分析:检查、清理、转换、建模

数据准备、预处理、统计分析及建模、可视化(将目标变量的预测值和实际值进行对比)

Anaconda

Anaconda Navigtor:用于管理工具包和图形用户界面,提供了Jupyter Spyder等编程环境的启动入口
Anaconda Prompt:用于管理工具包和环境的命令行界面
Jupyter Notebook:基于Web的交互式编程环境
Spyder: 基于客户端的Python程序集成开发环境。如果需要通过调试解决程序中的逻辑错误,可以使用spyter, 方便跟踪。

Python基础

1、内置数据类型6种:数字,字符串,列表、元组、字典
2、模块化:写成函数def 名:
3、面向对象 :

class 类名:
class Time:
    def __init__:# 构造方法,用于初始化新创建的对象
        self.h = h
        self.m = m
        self.s = s
    
    def AddOneSec(self):
        self.s += 1
        if self.s == 60:
            self.m += 1
            self.s = 0
            if self.m ==60:
                self.h += 1
                self.m = 0
                if self.h == 24:
                    self.h = 0
h = int(input())
m = int(input())
s = int(input())
count = int(input())
t = Time(h,m,s)# 创建Time类对象t,并使用h\m\s初始化t的属性值

4、文件操作

with open("d:\\python\\stuinfo.txt", 'w+') as f:# 以w+方式打开文件
    for i in range(len(ls)):# 遍历ls中的每一名学生数据
        f.write(str(df[i])) #将当前信息写入文件
        f.write('\n')
        
with open("d:\\python\\stuinfo.txt", 'r') as f:# 以r方式打开文件
    ls_read = f.readline #从文件中读取所有学生数据
    
for i in range(len(ls_read)):# 遍历ls中的每一名学生数据
    stu = ls_read[i].strip().split(',')# 按逗号分离出学生的各项信息
    print('{0},{1},{2}'.format(stu[0],stu[1],stu[2]))# 格式化输出
        

5、异常处理

#1-7 异常处理
try: # 异常捕获
    pos = df.index(sub, beg) # 通过字符串index方法,从df索引未beg的字符开始及进行sub字串的检索。检索成功则返回第一个匹配字串的起始字符索引,检索失败则产生ValueError异常,该异常会被后面的except ValueError捕获
except ValueError: # 捕获index方法检索事变所产生的ValueError异常
    break # index 方法产生产生ValueError异常,说明已经没有匹配的子串,退出while循环
import pandas
==dir(类名 或 对象名)== #查看类(或对象)中包含的方法和属性名称列表
==help(pandas)==# 查看pandas模块的详细帮助信息

1.3 包/模块使用示例

1.3.1 csv文件操作

with open("D\\Python\\stu.csv", 'w', newline='') as f:# 打开文件,注意需要将newline参数指定为空字符串
    csv_writer = csv.writer(f)
    csv_writer.writerow(['','',''])# 写入标题名称
    csv_writer.writerows(data)# 将数据写入csv文件
    
with open('D:\\Python\\stu.csv','r',newline='') as f:# 打开文件,注意需要将newline参数指定为空字符串
    csvreader = csv.reader(f)
    for line in csvreader:
        print(line)

random模块
用于生成随机数,具体查看random模块常用功能
(1)用于生成随机整数

random.randrange()
random.randint()
random.random()等等

(2)进行序列随机处理

random.choice(seq),在seq序列上随机选择一个数返回
random.shuffle(x) x是一个列表,将列表中的元素顺序随机打乱
random.sample(population, k) population表示一个元素序列或集合,k表示采样的元素数量

time模块

time.time()返回当前时间的时间戳
time.localtime([seconds])指定自纪元以来经过的浮点秒数,如省略,seconds默认为当前时间的时间戳 
epo= time.localtime(0)获取纪元时间,
cur = time.localtime() 获取当前时间
time.sleep(seconds)程序暂停执行seconds秒time.strftime(format[, tuple])format用于指定时间格式 
curtime = time.localtime()
time.strftime('%Y-%m-%d', curtime)

二、Numpy

2.1 ndarray类(N-Dimension Array, n维数组)

  • 2.1.1 为什么要使用ndarray
  • 2.1.2 ndarray类对象的常用属性
ndim, shape, size, dtype, itemsize 

	- ndarray.ndim:数组的轴数(维度)
ndarray.shape:返回一个元组,表示数组各维度长度信息
ndarray.size:数组中元素综述,相当于shape元组种个元素的乘积
ndarray.dtype: 表示数组中元素类型的对象
ndarray.itemsize: 数组中每个元素所占字节数
ndarray.dtype.itemsize == ndarray.itemsize

数组的元素类型既可以在创建ndarray类时指定,也可以对已有的ndarray类对象调用astype方法进行修改

from sklearn.datasets import load_boston
boston = load_boston()
data = boston.data #获取特征数据
target = boston.target # 获取目标房价
data.ndim
data.shape
data.size
data.dtype
data.itemsize
target属性也是这样
  • 2.1.3 创建ndarray类对象

    • numpy.array(object, dtype =None):
      参数: object是一个类似于数组的对象,可以是元组或列表,dtye用于指定元素类,如果不知道则默认有系统自动确定元素类型,其他对象具体去查
      返回值:一个ndarray对象

    • import numpy as np

#np.array(object, dtype=None)
x_int64 = np.array([2,3,4])
x_float63=np.array([2,3,4] , dtype = np.float64)
x_2d = np.array([[2,3,4], [5,6,7]])
#np.zeros(shape, dtype)
x = np.zeros(5)
y = np.zeros((2,3), dtype=int)
#np.ones(shape, dtype=None)
#np.empty(shape, dtype = float)
参数:与numpy.zeros参数含义相同
返回值:numpy.ones 用于创建一个所有元素值都为1的ndarray对象,
        numpy.empty 用于创建一个所有元素值都 未初始化 的ndarray对象,即随机值的ndarray对象
    
#np.arrange([start], stop[,step], dtype = None)
参数: start是区间的开始值,默认是0;stop是区间的结束值;step是步长,即ndarray中后一个元素减前一个元素的差值,默认是1,dtype是所创建的元素类型
    左闭右开区间
x = np.arange(2,6,-2)
y = np.arange(5)
z = np.arange(3, 6)
#np.linspace(start, stop, num = 50, endpoint = True, ..., dtype=None)
参数:start是区间的开始值,stop是区间的结束值,num是生成ndarray对象的元素数量,默认是50,endpoint是指定生成元素正是否包括end,默认Ture
返回值:ndarray对象,在争夺区间[start, stop]上以等间隔生成的num个值所创建的ndarray对象的元素
x = np.linspace(0, 1, 6)
y = np.linspace(0, 1, 4, endpoint = False)

np.arange和np.linspace 都是只可以生成一维数组,如果希望生成多维数组,可以结合ndarray对象的reshape方法使用
ndarray.reshape(newshape) 参数newshape是一个整数(一维数组)或一个整数元组,用于指定将数组改变为何种形状。

2.3 索引和切片

  • 索引:arr[idx_1, idx_2, idx_3, … idx_n]
    切片:arr[range_1, range_2, range_3… range_n] range既可以是一个索引值,也可以是一个包含多个索引值的序列,也可以是beg_i: end_i: step_i的形式,beg_i 缺省,从0开始;end_i缺省,到末尾结束;step_i缺省,步长为1

  • : 几到几
    () 几和几
    第三行:data[2]
    第三行第2列元素和第四列元素置为-1 data[2, (1,3)]
    前五行:data[0:5, :] 行
    前五行的第二列和第三列:data[0:5,1:3]
    前五行第2列元素:data[0:5, 1]
    第三行和第五行:data[(2,4),:]
    第三行和第五行的 第2列和第4列元素 data[(2,4), :][:, (1,3)]

2.4 数据拷贝

  • b=a #浅拷贝,指针指向了a
    b = a.copy()#深拷贝,有复制了一份

2.5 数据处理

  • 可以使用运算符,函数或方法、广播机制
x.reshape() 改变形状
x.T 转置
形状相同时
x+y
x+2 逐元素加2
x**2 逐元素乘方
x*y 逐元素成分
x@y矩阵乘法
x**y x与y逐元素幂运算结果

广播机制:会自动进行
使用ndarray数组对象进行运算时,如果形状不满足要求,系统会通过简单的元素复制操作自动对长度为1的维度进行拉伸,以使得数组对象可以做响应运算。

Numpy提供了通用函数:
数学运算函数(很多,与数学有关的基本都有),三角运算函数,位运算函数,比较运算函数,浮点运算函数
对于numpy提供的通用函数何以是哟个numpy.info查看相关信息
np.info(np.add)

常用函数和方法:

np.amax(a, axis = None)
- np.amax(a, axis = None)
参数:a是ndarray对象,axis是整数,用于指定计算的轴,默认是None,即返回a中所有元素最大值

np.amin(a, axis = None)
np.ptp(a, axis = None) 
计算数组对象a中所有元素的波动幅度(max-min), 或沿指定轴axis计算元素波动幅度

np.median(a, axis= None) 计算中值
np.percentile() 百分位数
mean 均值 
var方差 
average(a, axis = None, weight=None)加权平均值weights指定权值 通常为数组
sort排序 
diff 相邻两个元素的差值,
where(condition) 用于获取条件condition返回结果为真的元素对应的索引
log(x) 逐元素计算自然对数
split(a, indices, axis=0) 用于将素组对象a沿指定轴axis切分成多个子数组对象,标兵以列表形式返回,index用于指定切分位置
hstack(tup) 用于将序列tup中的多个数组对象进行==水平==堆叠,返回堆叠后的数组对象
    a=[[1 2]
       [3 4]]
    b=[[5 6]
       [7 8]]
    np.hstack([a,b]) [[1 2 5 6]
                      [3 4 7 8]]
vstack(tup) 垂直堆叠
unique(ar, return_, index = False) 用于滤除数组对象中的重复元素值

2.6 高级索引

  • Numpy提供了 整型数组索引和布尔索引

整型数组索引:
a=np.array() 3行3列的二维数组
x=np.array([2,1,2])
a[x] 依次获取a中行索引为2,1,1(即第3行,第2行,第1行)的数据 生成数组对象 并返回
y=np.array([0,1,1], [2, 1, 0])
a[y] 依次获取a中行索引为0,1,1的数据生成第一个子数组对象,再一次获取a中行索引为2,1,0的数据生成第二个子数组对象, 两个子数组对象 组成一个大的数组对象 返回 {【[], [], []】,【[], [], []】}

附录:NumPy通用函数:

数学运算符类, 三角运算符类,位运算符类,比较运算符类,浮点运算类

三、Pandas

3.1 Series类

  • Series对象的常用属性(10个)
Series.index 对象的索引,轴标签
Series.array 基础数据的扩展数组
Series.values 对象的基础数据,跟dtype以ndarray或类似ndarray的形式返回
Series.dtype 基础数据的dtype对象
Series.shape
Series.nbytes 基础数据的字节数
Series.ndim 对象的维度,默认值为1,即一维数组
Series.size 对象中基础数据的个数
Series.empty 对象是否为空的指示符
Series.name 对象名称
  • 创建Series对象:
    s=pd.Series(data, index, dtype, name…)
data 可以是类数组,可迭代对象,字典或标量值;
index是标签列表,必须是可哈西的,如果未指定,则默认未RangeIndex(0,1,2,...n-1)
name未对象名称,可以缺省

3.2 DataFrame对象

  • 具有行和列标签的二维表格型数据结构,可以视为一列列的Series序列左右拼接构成的类字典容器
  • DataFrame对象的常用属性(12个)
DataFrame.index 行标签
DataFrame.columns 列标签
DataFrame.dtypes
DataFrame.info() 简要信息
DataFrame.select_dtypes([include, exclude]) 根据列的dtypes返回DataFrame对象的 列子集
DataFrame.values 对象的数组,以ndarray数组形式返回
DataFrame.axes 轴标签信息表(行和列的信息列表)
DataFrame.ndim 数组的维度,即轴数 默认为2
DataFrame.size 对象中元素的个数
DataFrame.shape 行数和列数的shape元组
DataFrame.memory_use([index, deep]) 对象每一列内存的使用情况,以字节为单位
DataFrame.empty 对象是否为空的指示符
- 创建DataFrame对象:
df=pd.DataFrame(data, index, columns,dtype,''')
data可以是ndarray数组,可迭代对象,字典,DataFrame对象,其中字典可以包含Series对象,数组,常量或类列表对象等
index是行标签,默认为RangeIndex(1,...n-1)
columns是列标签
dtype 类型,只允许传递当dtype

3.3 index对象

  • Index对象是有序、可索引、不可修改的一维数组,负责存储 轴标签 、轴名 等元素

构建Series或DataFrame对象时,所用到的任何数据或类数组标签都会被转换为一个Index对象,Index对象是一个从标签到数据值的映射,当数据是一列时,Index是标签,当数据是一行时,Index时行标签

  • Index对象常用属性:
Index.values 以ndarray数组形式返回Index对象中的基础数据
Index.array 引用索引中基础数据的数组
Index.to_numpy 表示Index对象中基础数据的numpy数组
Index.dtype 
Index.name 对象的名称
Index.shape
Index.size
Index.ndim 对象中基础数据的维度,定义为1
  • 创建Index对象:
index= pd.Index(data, dtype, copy, name,...)
data类似于一维数组对象
dtype 默认为object
copy表示是否复制输入数据,默认值是False

3.4 元素的访问方式

. [] loc iloc at iat head tail

  • Pandas对象 轴标签允许直观的获取和设置数据集的子集
  • 属性运算符 . ;…的…
Series s.label label表示轴标签数据 返回dtype
DataFrame df.col col表示列标签数据 返回Series
DataFrame df.col.row col表示列标签数据,row表示行标签数据
  • 索引运算符 [] 位置索引和标签索引
    1、位置索引和切片(行)
    通过整数位置索引访问数据元素
Series s[range] 
range: 可以是一个下标位置索引值(0开始的整数);一个包含多个位置索引值的列表s[[1,2,3]];beg:end:step;与s的轴标签长度相同的布尔数组,提取True所对应的元素
DataFrame df[row_range]
row_range: beg:end:step;一个与df行长度相同的布尔数组,提取True对应的行切片

2、标签索引(列):通过轴标签索引访问数据元素

Series s[label] :label可以是Series对象中定义的标签,也可以是包含多个的标签的列表
DataFrame df[col] :col既可以是DataFrame对象中定义的列标签,也可以是一个包含多个列标签的列表

所以,[]里面既可以是数,也可以是属性名;
[]一次只能访问DataFrame对象的一个维度,位置索引只能实现对DataFrame对象的行切片,标签索引只能实现列切片。
通过列表对Pandas数据进行索引时,要有两组方括号df[[“c1”, “c2”]]

  • 3、loc访问方法 Pandas提供了优化后的loc,iloc元素访问方法。
loc:基于标签的索引与切片
Series s.loc[lable_range] 
label_range: 一个Series对象中定义的标签;一个包含多个标签的列表;beg:end:step;与Series对象标签长度相同的布尔数组

DataFrame

df.loc[row_range]
row_range: DataFrame对象中定义的行标签;一个包含多个行标签的列表;beg:end:step;与行标签长度相同的布尔数组
df.loc[row_range, col_range]: 行+
  • 4、iloc方法:将loc的标签替换为下标位置
Series s.iloc[i_range]
range: 一个整数位置索引;包含多个整数索引位置的列表;beg:end:step;布尔数组
DataFrame df.iloc[i_range] df.iloc[i_range, j_range]
  • 5、at和iat索引:只获取一个元素
Series s.at[label]
Series s.iat[i]
DataFrame df.at[col, row]
DataFrame df.iat[i,j]
  • 6、head和tail
Series s.head(n)/s.tail(n)  n默认为5
DataFrame df.head(n)/tail(n)

3.5 数据清洗

  • 1、缺失数据
    isna notna fillna dropna

    • Pandas缺失值表示为NA,
      数值类型NaN not a number
      datetime类型 标记为 NaT Not a Time
isna()/notna
pd.isna(data) == data.isna()
pd.notna(data) == data.notna()

data可以是一个Series对象,返回值为布尔Series对象;也可以是一个DataFrame对象,返回值为布尔DataFrame对象;可以是一个标量值,此时返回一个布尔值

1、fillna() 将缺失值重新赋值为新的元素值

result = data.fillna(value, method=None, ...)
data可以是Series/DataFrame 
value 可以是一个字典对象,Series对象或者DataFrame对象,用于将data中匹配标签(Series对象)或匹配列标签(DataFrame对象)所对应的缺失值替换为不同的值
mothod表示填充NA值的方法,默认为None,method = ’ffill‘或者methd='pad'时使用上一个有效值填充NA值 method='bfill'/'backfill'使用下一个有效值来填充NA值
返回值:为新赋值的Series或DataFrame对象。

2、dropna 实现行或列删除NA值功能

result = data.dropna(axis = 0, how='any',...)
axis:
如果data是Series对象,则axis只能等于0,直接删除所有的NA值
data是DataFrame对象,参数为0'index',实现删除缺失值所在的行; axis为1'columns',则删除缺失值所在的列
how:
how = 'any' 表示只要有NA值存在,就删除所在的行和列
how=all‘ 表示只有当全部元素都是NA是才会执行删除操作
返回值为删掉缺失值的Series或DataFrame对象

3、interpolate() 通过插值法补充缺失的数据点

result = data.interpolate(method='linear', axis=0..)
method表示使用的插值方法,缺省时默认为线性差值'linear' ,还有time,nearest, zero,slinear,等
  • 2、删除重复数据

    • data.duplicated(subject=None, keep=‘first’,…)
data是Series对象时,没有subset参数,subset是列标签参数,表示考虑某些特定列来标识重复数据,缺省时考虑全部列。
keep决定标记哪个重复数据,缺省时默认为first,即对于data中的每一组数据,第一次出现的位置标记为False,其他重复出现的位置标记为True。
data.drop_duplicates(subset=None,keep='first'...)
参数与duplicated方法相同,keep参数决定保留哪一行重复数据,返回值为删掉重复数据Series或DataFrame对象。

数据 标签 中存在重复项:Index.duplicated方法确定数据标签中是否存在重复值,
df3 = df[~df.index.duplicated(keep='last')]

3.6 数据合并

  • merge:
    result = pd.merge(left, right, how=“inner”, on =None, left_on=None, right_on=None, left_index=False, right_index=False,…)
  • join:
    result = data.join(other, on=None, how=''left",…)
  • concat:
    result = pd.concat(objs, axis=0, join=‘outer’, ignore_index=False, key=None,…)

3.7 数据重塑

  • 数据重塑:是指转换 数据表格的 结构,使其适合做进一步分析
  • pivot方法
    result = data.pivot(index=None, columns=None, values=None,…)
  • melt方法:
    将数据表从宽格式调整为长格式,其中一列或多列作为标识符变量(id_vars), 而其他列是转换为测量变量(value_vars), 填充两个新增的非标识符列
    result=data.melt(id_vars=None, value_vars=None, var_name=None, value_name=‘value’,…)

四、数据统计分析

4.1 基本统计分析

  • count() 非空数据项总数
    sum() 所有数值的总和
    mean() 平均值
    median()
    std() 标准差
    min()
    max()
    prod() 数组元素的乘积
    cumsum() 累计总和
    cumprod() 累计乘积
    describe() 关于DataFrame的统计信息摘要,包括 非空数据项数,最大值、最小值、平均值、标准差等

4.2 分组分析

  • 定性分组:根据待分析数据的已有类别进行分组划分,
    groupby可以使用指定的关键字(可以是多项)将原始数据分成若干组,并且可以对分组数据进行一些基本数据统计。
    groupby(by=[分组列1,分组列2,分组列3])[统计列1,统计列2,…].agg([统计函数1,统计函数2,…])
    by 指定用于分组的列
    [统计列1,统计列2,…]: 指定进行统计计算的列
    agg: 用于指定具体使用的统计函数,如size(记数),sum(求和),mean(均值)
  • 定量分组:根据分析对象的数值,按照一定的指标划分不同的区间,利用分组进行对比分析,从而揭示所分析对象的数量特点。
    cut(series, bins, right=True, labels=NULL)
    series 需要分组的序列数据
    bins 划分数组参数(即划分区间的指标,这是定量分组的关键)
    right 分组时,右面是否闭合,默认为闭合
    labels 分组的自定义标签,默认为空
data = pandas.read_csv('')
bins = [min(data.score),80,90,max(data.score)+1]
labels = ['80分以下', '80-90分', '90分以上']

data["cut"] = pandas.cut(data.score, bins, labels=labels, right=False)

4.3 分布分析

  • 通常会根据分析目的将待处理数据划分称等距或不等距的定量分组, 然后研究各组分布规律,从而得到响应结论。
    一般先用pandas.cut函数确定分布分析中的分层,再用groupby函数实现分组分析

4.4 交叉分析

  • 两个或两个以上分组变量之间的关系

4.5 结构分析

  • 通过计算各组成部分所占的比例,进而分析数据总体的内部结构特征的分析方法,
    目的是通过统计各分组的数据占总体数据的百分比对数据总体进行评价

先利用pivot_table()函数进行数据透视表分析,然后指定axis参数对数据透视表按行或列计算出所占比例

4.6 相关分析

  • 分析两个不同的随机变量之间的相关关系,概率论上相关系数

五、时间序列分析

5.1 Datetime模块

date,time,datetime

  • Datetime模块重新封装了time模块,提供了更多的接口,可以用于创建日期和时间类对象,并进行日期和时间的运算
    import datetime

#date类

datetime.date(year, month, day)  自定义创建日期对象
date.year, date.month, date,day 提取日期对象的年 月 日
date.max,date.min date对象能表示的最大最小日期
date.today() 返回一个当前本地日期对象
date.replace(year, month, day) 创建新的日期对象,用指定日期替换原date对象的内容,可单独修改年,月,日中的一项或多项
date.weekday() 周几 0~6 对应周一到周日
date.isoweekday() 周几 1`7对应周一到周日
date.isocalendar() 返回格式为(year, month, day)的元组
date.isoformat() 返回格式为"YYYY-MM-DD"的字符串

#time类

datetime.time(hour, minute[, second[, microsecond[,tzinfo]]]):自定义创建时间对象,可以精确到毫秒,tzinfo用于指定时区,不常用
time.hour, time.minute, time.second, time.microsecond,time.tzinfo: 分别提取time类中的时,分,秒,毫秒,时区,等数据
time类中没有类似于date类中today()的方法,往往用time.time()方法获取本地时间戳,在对得到的时间戳进行格式化。

#datetime

datetime.datetime(year,month,day[,hour[, minute[, second[, microsecond[,tzinfo]]]]]) 将date类和time类整合起来
datetime.combine(date, time):数据date和time对象创建一个datetime对象
datetime.today() 返回一个表示本地时间的datetime对象
datetime.now([tz]) 返回本地时间的datetime对象
datetime.date() 获取dateduix
datetime.time() 获取time对象

5.2 时间序列基础

  • 1、解析时间格式字符串
    np.datetime64, datetime.datetime等
    示例:
对含有三个元素的一维列表进行格式化
字符串,np.datetime64对象,datetime模块中的datetime对象
pd_todatetime() 用pandas中to_datetime对不同的时间序列数据进行统一的格式化,特定格式可以使用format=' '进行指定
dti = pd.to_datetime( ['1/1/2018', np.datetime64('2018-01-01'),datetime.datetime(2018,1,1)] )
运行结果:DatetimeIndex(['2018-01-01', '2018-01-01', '2018-01-01'], dtype='datetime64[ns]', freq=None)
  • 2、生成DatetimeIndex,TimedeltaIndex, PeriodIndex等定频日期与时间段序列
perios:固定十七,取值为整数或None
pd.date_range() 至少指定start, end, periods中的两个参数值
dti = pd.date_range('2018-01-01',periods=3, freq='H')
运行结果:
DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 01:00:00',
               '2018-01-01 02:00:00'],
              dtype='datetime64[ns]', freq='H')
  • 3、处理,转换带时区的日期时间数据
    tz_localize()用于时区处理
  • 4、按指定频率重采样,并转换为时间序列
idx = pd.date_range('2018-01-01',periods=5, freq='H')
ts = pd.Series(range(len(idx)), index = idx)
ts

2018-01-01 00:00:00    0
2018-01-01 01:00:00    1
2018-01-01 02:00:00    2
2018-01-01 03:00:00    3
2018-01-01 04:00:00    4
Freq: H, dtype: int64
  • 5、用绝对或相对时间差计算日期与实践
pd.Timedelta(" ")指定时间长度

5.3 时间日期处理

  • 1、获取本地当前时间
time.localtime 仅对时间戳进行封装,输出结果时结构体形式
import time
localtime = time.localtime(time.time())
localtime
运行结果:
time.struct_time(tm_year=2022, tm_mon=5, tm_mday=4, tm_hour=9, tm_min=51, tm_sec=1, tm_wday=2, tm_yday=124, tm_isdst=0)
  • 2、日期时间格式化及生成时间戳
time.asctime()函数可以生成固定格式的日期时间字符串

localtime = time.asctime(time.localtime(time.time()))
localtime
运行结果:
'Wed May  4 09:53:44 2022
- time.acstime()返回的日期时间字符串格式是固定的
time.strftime()函数可以返回格式话日期时间字符串
time.mktime()函数可以返回指定日期时间字符串对应的时间戳

格式化日期数据的符号
%y, %Y, %m, %d, %H, %I ,%M等等

5.4 频率转换与重采样

  • 1、频率转换,按照时,分,秒等
按日
td/np.timedelta64(1,'D')
td.astype('timedelta64[D]')
  • 2、重采样
向下、向上重采样(对应转换为时间间隔为5分钟,50天)
将秒数按5分钟间隔重采样
re = ts.resample('5Min')
re.asfreq()#输出重采样结果
re.sum()/re.mean()等等重采样之后的结果

向上重采样 由于数据频率增大,采样时间点增加, 往往需要指定填充值 .ffill()

  • 3、采样中的数据聚合
    可以使用聚合的方式对原始数据进行扩充

六、数据可视化

6.1 Matplotlib

  • Matplotlib提供的Figure对象是绘制图表的基础,包含点、线、图例、坐标等所有图表元素。
Figure 图形
Axes 坐标轴
Subplots 子图

Matplotlib将数据绘制在Figure(图形)对象上,每个Figure对象可以包含一个或多个Axes(坐标轴),多个Axes会将Figure切分成多个区域展示不同的Subplots(子图)。每个坐标轴都可以设置标题,x轴标签,y轴标签等属性。

创建Figure, Axes对象的简单方法是使用pyplot提供的subplots方法

fig, ax = matplotlib.pyplot.subplots(nrow=1, ncols=1,...)
参数:
nrows 子图网格的行数 默认值1
ncols 子图网格的列数 默认值1
返回值:
fig为Figure对象,ax既可以是一个Axes对象,也可以是一个Axes对象序列

pyplot是Matplotlib的关键模块,提供了很多构建图表的函数接口,pyplot提供的绘图方式类似于Matlab,主要适用于交互式绘制图形。

  • 1、线形图

    • 1、线形图
plot() 常用于显示数据的变化趋势。
matplotlib.pyplot.plot([x], y, fmt, [x2], y2, [fmt2], ... ,**kwargs)
x表示x轴数据,可为列表,缺省是根据x轴数据长度设置为索引数组
y:y表示y轴数据,可为列表
可选参数fmt为格式字符串,用于快速设置线条的基本格式,如颜色,标记和线的形状等
[x2], y2, [fmt2], ... ,:表示可以同时绘制第二组或更多的数据

pyplot还提供了可以设置图表的坐标轴标签,标题图例等的函数

matplotlib.pyplot.xlabel(xlabel) 
matplotlib.pyplot.ylabel(ylabel)
函数功能,为图表添加轴标签,xlabel为x轴,y为y轴
matplotlib.pyplot.title(label) 为图表添加标题
matplotlib.pyplot.text(x,y, s) 为图表添加文本注解,x,y为文本位置的坐标,s为添加的文本字符串
matplotlib.pyplot.legend(handles, labels, **kwargs) 为图表设置图例,handles指定要添加到图例中的lines,patches等对象列表,labels指定添加到图例中的标签列表,若未传递任何参数,将根据标签自动确定添加到图例

绘图案例

import numpy as np
import matplotlib.pyplot as plt #重名名

x1 = np.linspace(0.0, 5.0) #生成均匀间隔的序列
x2 = np.linspace(0.0, 2.0) 
y1 = np.cos(2 * np.pi *x1)*np.exp(-x1) #对应y值
y2 = np.cos(2 * np.pi *x2)
fig, (ax1, ax2) = plt.subplots(2,1) #创建一个2行1列的Figure对象fig,在后续的程序中用来操纵图像
fig.suptitle('Matplotlib Line') #是指图像标题
ax1.plot(x1, y1) #绘制线形图 线条采用默认设置
ax1.set_ylabel('y_label') #设置y坐标标签
ax2.plot(x2, y2, 'o-')
ax2.set_xlabel('time')
ax2.set_ylabel('Undamped')
plt.show()# 显示图像
  • 2、条形图

    • 条形图用相同的条形的高度或长短来表示数据的多少,适用于比较数据的情况
    • 柱状图:
matplotlib.pyplot.bar(x, weight, width=0.8, bottom=None, **kwargs)
参数说明:
x为条形图x坐标,数据类型为float或列表
height为条形图高度,数据类型为float或列表
width为条形图的宽度,数据类型为float或列表,默认为0.8
bottom为条形图==底部其实的y坐标==,用于绘制堆叠条形图,数据类型为float或列表,默认为0
**kwargs可以设置图形颜色,标签,图例线宽等属性。
	- 水平图:
matplotlib.pyplot.barh(y, width, height=0.8, left=None, **kwargs)
y为水平条形图的y坐标,数据类型为float或列表
width
height
left为水平条形图左侧的x坐标,数据类型为float或列表,默认值为0
**kwargs
  • 3、饼图

    • pie()
      饼图可以直观显示某一类数据在全部样本数据中的百分比,从而分析出该类数据的重要程度,影响力
      matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, shadow=False,startangle=0,…)
      主要参数:
x:要显示的数据
explode 序列设置饼图每一部分的偏离程度,默认值为Nonem可为数组或列表(在饼图中凸出来的某项)
labels序列设置饼图每部分的标签,默认None
colors序列设置饼图每部分的颜色,默认使用当前活动循环中的颜色
autopct设置数据显示的格式,默认None,可为字符串或可调用的函数
shadow 设置饼图下是否有阴影,布尔类型,默认值False
startangle 起始角度,float类型,默认值为0
import matplotlib.pyplot as plt
labels = '1_','2_', '3_', '4_', '5_'
size = [10, 20, 30, 40, 50]
explode = (0,0,0,0,0.1)

fig1, ax1 = plt.shbplots()
ax1.pie(siezes, explode=explode, labels=labels, autopct='%1.1f%%', startangle=90)
ax1.axis('equal')
plt.show()
  • 4、散点图

    • scatter()
将样本以点的形式绘制在二维平面上,从而判断变量之间的相互关系
	- matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, **kwargs,...)
参数
x,y为数据坐标,可为float类型或列表
s size散点大小
c color散点颜色
marker散点显示的图形
	- x=np.random.rand(50)
y=np.random.rand(50)
colors = y
size = (30*x)**2
plt.scatter(x,y,s=size,c=colors,alpha=0.5)#alpha表示透明度
  • 5、直方图

    • hist() Histogram
      分析数据分布情况,不等于条形图

6.2 Seaborn

sns

  • 1、关系图

    • relplot()
      关系图能直观地展示数据变量之间的关系,这些关系如何依赖于其他变量
seaborn.relplot(*[, x, y, hue, size, style, data, kind,...])
通过kind参数选择要使用的方法,通过hue、size、style等参数来显示数据的不同子集 
data是输入的数据集,数据类型可以是pd.DataFrame对象,np.ndarray数组,映射等
x和y 是参数data中的键或向量,指定关系图中的x轴和y轴的变量
hue是 data中的键或向量,根据hue变量对数据进行分组,并在图中使用不同颜色的元素加以区分
size data中的键或向量,根据size控制图中点的大小或线条的粗细
style data中的键或向量,根据style变量对数据进行分组,并在图中使用不同类型的元素 加以区分,如点线,虚线
kind 指定要绘制的关系图类型,可选 散点图scatter,线形图line, 默认为scatter

更具体的绘制分布图的函数,sns.scatterplot(), sns.lineplot()

sns.scatterplot() == sns.relplot(kind='scatter')
sns.lineplot() == sns.lineplot(kind='scatter')

import matplotlib.pyplot as plt
import seaborn as sns

data=sns.load_dataset('tip')
data.head()
sns.replot(x='total_bill',y='tip', data =data, hue='smoker', style='sex', size='size')
plt.show()
  • 2、分布图

    • displot()/histplot()/rdeplot()/rugplot()/distplot()/jointplot()
    • 1、displot()函数
可视化数据单变量或双变量分布的方法
seaborn.displot([data, x, y, hue, row, col,...])

data 输入数据集,数据类型可以是pd.DataFrame对象,np.ndarrray对象,映射等
x和y 是参数data中的键或向量,根据hue变量对数据进行分组,并在图中使用不同颜色的元素加以区分
row 和 col 是data中的键或向量,根据row或col变量提取子集,并将子集分布情况绘制在不同的面板上
kind 指定要绘制的分布图类型,默认为his如hist(直方图),kde(核密度估计)、ecdf(经验累积分布函数),
更具体的绘制分布图的函数,sns.hisplot(), kdeplot(), ecdfplot()
sns.hisplot == sns.displot(kind='hist')
- 2、rugplot()函数

绘制轴须图(毛毯分布图),即通过 边缘轴虚线的方式 显示单个观测点的位置,以补充其他分布图
sns.rugplot()
- 3、distplot()函数
sns.distplot() 整合了matplotlib的hist()函数和Seaborn的kdeplot()函数的功能,并增加了rugplot()函数绘制轴须图的功能。一次出现多个图
sns.distplot([a, bins, hist, kde, rug, fit, …])
- 4、jointplot()函数
提供了几种绘制两个变量的联合分布图的方法
sns.jointplot()
联合分布:双向绘制,即两个变量分别以对方作为自变量绘制分布图。

  • 3、分类图

    • catplot() 分类图展示数据根据特定变量进行分类后的统计情况, 分类散点图,箱型图,条形图等。Seaborn的catplot()函数提供了几种不同的分类可视化方法,以便展示数值变量与一个或多个分类变量之间的关系。
    • seaborn.catplot(*[, x, y, hue, data, row, col, kind,…])
data是输入的数据集,数据类型只能是长格式的pandas.DataFrame对象,即每一列对应一个变量,每一行对应一个观测值
x和y是 data数据集中的变量名,指定分类图中的x轴和y轴变量
hue是data数据集中的变量名,根据hue变量对数据进行分组,并在图中使用不同的颜色加以区分。
row和col也是data数据集中的变量名,作为分类变量提取数据子集,并将子集分布情况绘制在不同的面板上
kind指定要绘制的分类图类型,strip带状图,swarm分簇散点图,box箱型图,violin小提琴图,boxen增强箱型图,point点估计,bar条形图,count记数条形图,默认值为strip

catplot() 函数通过kind参数选择要使用的绘制数据分类的方法,并通过hue,row,col等参数来处理不同的子集,

- Seaborn还提供了三类更具体的绘制分类图的函数,包括分类散点图,分类分布图,分类预测图
  1. 分类散点图 stripplot()和swarmplot()
sns.stripplot() == sns.catplot(kind = "strip") 可以显示测量变量在每个类别的分布情况,绘制的散点呈带状,数据较多时会有重叠部分
sns.swarmplot() 与stripplot()类似,但是绘制的数据点不会重叠

2、分类分布图 boxplot(), violinplot(), boxenplot(),

sns.boxplot() == ...绘制箱型图以显示与类别相关的分布情况,可以显示四分位数,中位数,和极值
violinplot() 结合了箱型图和核密度估计图
boxenplot() 用于为更大的数据集绘制增强箱型图

3、分类预测图函数 pointplot() barplot() countplot()

pointplot() 使用散点图显示点估计和置信区间
barplot() 使用条形图来显示点估计和置信区间
countplot() 使用条形图显示每个分类中的观察值计数
	- f = sns.catplot(data=tips, kind='bar', x="day", y='total_bill', hue="smoker")
通过sns.catplot()函数针对数据集tips绘制分布图,
kind=bar指定绘制条形图,
x=day指定x坐标为day变量,即根据day变量对数据集进行分类,
y=total_bill指定y坐标为total_bill 变量,即显示total_bill变量的统计情况,
hue=smoker 指定以smoker变量对数据点进行分类并以不同的颜色显示,smoker值为No的对应数据条是蓝色的,smoker值为yes对应的数据条是棕色的,
sns.set_theme(style="whitegrid") 设置主题颜色
f.despine(left=True)设置移除f左侧的y轴轴线。
f.se_axis_labels()# x轴y轴标签
f.legend.set_title()
  • 4、回归图

    • 使用模型估计两个变量间的关系
regplot()和Implot()

regplot()函数的功能是绘制数据和线性回归模型拟合的曲线,
sns.regplot(*[, x, y, data, x_estimator, ... ])

lmplot()函数结合了regplot()和FacetGrid的功能,为绘制数据集的 条件子集 的回归模型提供接口
sns.lmplot(*[, x, y, data, hue, col, row, ... ])
hue,col, row 是划分子集的变量,子集将绘制在不同的面板上
  • 5、热力图

    • 将不同的数据值 用不同的标志 加以标注 的一种可视化分析手段
      标注的手段一般包括颜色的深浅,点的疏密以及呈现比重的形式。
      数据分析中,如果离散数据波动比较大,那么可以使用热力图来观察波动情况。
Seaborn提供的heatmap()函数可以为二维数据绘制由颜色编码矩阵组成的热力图
sns.heatmap(data, *[, vmini, vmax, cmap, center,...])
data是输入的二维矩阵数据集,数据类型可以是dataframe对象或二维ndarray数值等
vmin和vmax指定colormap的值,数据类型为float
cmap是指定数据值到颜色空间的映射,数据类型可以是Matplotlib colormap名称或对象,颜色列表等
center指定在绘制发散数据时颜色映射的居中值,数据类型为float。

sns.heatmap(data)
plt.show()

6.3 Pyecharts

  • Echarts是一款用JavaScript实现的开源数据可视化库,常用于网页数据可视化。
    Pyecharts 是一款将Echarts与Python结合的数据可视化工具,可以直接生成Echarts图表。

  • 1、Pyecharts图标类

    • 支持折线图,柱状图,散点图,饼图,K线图,
      用于统计的箱线图,
      用于地理数据可视化的地图,热力图,线图,
      用于关系数据库可视化的关系图,树形图,旭日图,
      用于多维数据可视化的平行坐标,
      用于商业智能(BI)的漏斗图,仪表盘等,且pyecharts支持图于图之间的混搭
    • 1、Pyecharts支持的图标类(具体很多很全面)

Line, Bar,Scatter, Kline, Pie, Boxlot, Radar, Map, HeatMap, Gauge, Funnel, Treemap, TRee, Sunburst, WordCloud

- 2、Pyecharts图表配置

全局配置项 和 系列配置项
全局配置项:
p = pyecharts.Pie(init_opts)
标题配置项,图例配置项,工具箱配置项,区域缩放配置项,提示框配置项,视觉映射配置项等
系列配置项:
设置图表中的文本,线样式,标记等元素,包括图元样式配置项,文字样式配置项,标签配置项,线样式配置项等。

p = pyecharts.Pie(init_opts)
init_opts是全局初始化配置项,数据类型为pyecharts.options.InitOpts对象,
常用属性包括width(图表画布宽度)、height,chart_id, page_title(网页标题)、theme,bg_color
init_opts可以通过opts.InitOpts对象或字典进行参数传递,返回值p为一个Pie类对象。

全局配置项:
p.set_global_opts(title_opt, legend_opts, tooltip_opts, toolbox_opts, visualmap_opts, datazoom_opts, ...)
标题配置项,图例配置项,工具箱配置项,提示框配置项,视觉映射配置项,区域缩放配置项等
系列配置项:系列配置项 用于 设置图表中的文本,线样式,标记等元素,包括图元样式配置项,文字样式配置项,标签配置项,线样式配置项等。
系列配置项:
p.set_series_opt(label_opts, linestyle_opts, areastyle_opts, markpoint_opts, markline_opts, itemstyle_opts,...)
标签配置项,线样式配置项,区域样式配置项,标记点配置项,标记线配置项,图元样式配置项。

可以调用图标类的add方法添加图表数据并设置各种配置项,不同图表的add方法参数列表不同,。Pie类中,add方法的语法格式如下
p.add(series_name, data_pair, color, radius, center, rosetype,…)

七、网络爬虫

7.1、网络数据爬虫

  • Python中获取网络数据的方式主要是调用Requests模块中的函数
requests.get(url, **kwargs) #向指定url发送http的get请求,常用于从服务器请求各类数据
requests.post(url, **kwargs)# 向指定url发送http的post请求,常用于先服务器提交各类数据
requests.put(url, **kwargs)提交数据
reauests.delete(url, **kwargs) 从服务器中删除数据
requests.head(url, **kwargs) 向指定url发送head请求,获取响应头
requests.requests(method, url, **kwargs)向指定url发送自定义请求

返回的都是Response对象,表示服务器对该请求的响应

Requests请求函数的 相关参数 功能
Response 类对象成员:
response.status_code 200表示成功
response.text 相应内容的文本形式
response.content 响应内容的二进制形式
response.json() 将json响应解码为json对象
response.encoding 该响应的编码方式
  • 会话操作

    • 在网络获取的过程中,可以通过会话实现 跨请求保持 指定请求参数 的功能,即 后一个请求可以直接使用前一个请求的请求参数
with requests.Session() as session: #用with语句(上下文管理器)来打开一个会话
    # 通过设置会话的各参数对应成员属性的值,可以使改会话下的请求保持这些参数
    session.params  
    session.cookies
    session.auth
    session.headers

7.2 数据文件操作

  • 通过requests模块获取网络中的数据,这些数据通常是结构化的HTML文档,文件操作的目标是如何从中提取所需的有效信息,

常用的是Beautiful Soup模块,Beautiful Soup基于Python解释器,有丰富的API和多种解析方式,能够用于HTML,XML,等markup文档的解析,可以快速实现从网页中提取数据。

  • BeautifulSoup4模块对象成员
Tag, 即HTML中的“标签”。通过tag的name属性,可以获取标签的名字,如 title, body
        通过tag['属性名'], 可以获取标签的属性,如id,class等,其操作和字典相同,可直接通过“tag.属性名”进行访问
NavigableString 标签内的字符串文本,例如 <h1>TEXT<\h1>中的TEXT就是NavigableString对象
BeautifulSoup 表示整个文档,其操作类似于Tag类型
Comment HTML内的注释,可以将其当作特殊的NavigableString对象

文档树的建立与遍历

BeautifulSoup(markup, features) 功能,解析markup文档,生成文档树
tag.contents 给出tag节点的直接子节点构成的列表
tag.children tag节点的直接子节点生成器
tag.等等属性

文档树的搜索方法

soup.find_all(name, attrs, recursive, string, limit, **kwargs) 在文档树上搜索满足过滤条件的所有标签
soup.find(...) 在文档树上搜索满足过滤条件的单个标签

八、MySQL

Python连接数据库

db = pymysql.connect(host, user,password, database, port)
返回值是创建的connect对象

读数据库:

data = pd.read_sql(sql, con, index_col, …)
存储到数据库
data.to_sql()

数据操作

查询、插入、更新、删除

你可能感兴趣的:(Python,python)