python --数据分析-numpy-pandas-series对象和dataframe对象

Python作为当下最为流行的编程语言之一,可以独立完成数据分析的各种任务

  • 功能强大,在数据分析领域里有海量开源库,并持续更新

  • 是当下热点——机器学习/深度学习 领域最热门的编程语言

  • 除数据分析领域外,在爬虫,Web开发等领域均有应用

常用Python数据分析开源库介绍

NumPy

  • NumPy(Numerical Python) 是Python数据分析必不可少的第三方库,NumPy的出现一定程度上解决了Python运算性能不佳的问题,同时提供了更加精确的数据类型,使其具备了构造复杂数据类型的能力。

  • 是一个运行速度非常快的数学库,主要用于数组计算,包含:

    • 高性能科学计算和数据分析的基础包

    • ndarray,多维数组,具有矢量(向量)运算能力,快速、节省空间

    • 矩阵运算,无需循环,可完成类似Matlab(商业数学软件)中的矢量运算

    • 用于读写磁盘数据的工具以及用于操作内存映射文件的工具

 Pandas

  • Pandas是一个强大的分析==结构化数据==的工具集,Pandas丰富的API能够更加灵活、快速的对数据进行==清洗==、==处理==以及==分析==。

  • Pandas在数据处理上具有独特的优势:

    • 底层是基于NumPy构建的,所以运行速度特别的快

    • 有专门的处理缺失数据的API

    • 具有强大而灵活的分组、聚合、转换功能

  • Pandas利器之==Series==

    • Series是一种类似于一维数据的数据结构

    • 是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即行索引)组成

    • 仅由一组数据也可产生简单的Series对象

  • Pandas利器之==DataFrame==

    • DataFrame是一种表格型的数据结构,既有行索引也有列索引,可以简单的把DataFrame理解为一张数据表

    • 包含有一组或多组有序的列(Series),每列可以是不同的值类型(数值、字符串、布尔型等)

 Matplotlib

  • Matplotlib 是一个功能强大的数据可视化开源Python库

  • Python中使用最多的图形绘图库

  • 可以创建静态,动态和交互式的图表

Seaborn

  • Seaborn是一个Python数据可视化开源库

  • 建立在matplotlib之上,并集成了pandas的数据结构

  • Seaborn通过更简洁的API来绘制信息更丰富,更具吸引力的图像

  • 面向数据集的API,与Pandas配合使用起来比直接使用Matplotlib更方便

Sklearn

  • scikit-learn 是基于 Python 语言的机器学习工具

    • 简单高效的数据挖掘和数据分析工具

    • 可供大家在各种环境中重复使用

    • 建立在 NumPy ,SciPy(Scientific Python) 和 matplotlib 上

Jupyter Notebook

  • Jupyter Notebook是一个开源Web应用程序,使用Jupyter Notebook可以创建和共享

    • 代码

    • 数学公式

    • 可视化图表

    • 笔记文档

  • Jupyter Notebook用途

    • 数据清理和转换

    • 统计分析

    • 数据可视化

    • 机器学习等

  • Jupyter Notebook是数据分析学习和开发的首选开发环境

  • 启动Jupyter服务

  • Windows使用

    1、打开命令提示符

    2、安装 Jupyter Notebook:在命令提示符中输入以下命令,使用 pip 安装 Jupyter Notebook。

    pip install jupyter notebook
    或
    pip install jupyter notebook  -i https://pypi.tuna.tsinghua.edu.cn/simple

    3、启动 Jupyter Notebook:在命令提示符中输入以下命令,启动 Jupyter Notebook。

    jupyter notebook

    4、接下来Jupyter Notebook 会在默认的浏览器中打开,如果没有自动打开,可以在浏览器中输入:

    http://localhost:8888/tree 来访问。

总结:

  • 了解Python做数据分析的优势

    • Python可以独立高效的完成数据分析相关的全部工作

  • 知道Python数据分析常用开源库

    • Pandas

    • Numpy

    • Matplotlib

    • Seaborn

    • sklearn

  • 会启动和使用jupyter notebook

Pandas的数据结构

panads是什么

Pandas是Python的一个开源数据分析库,用作数据分析,有两个数据结构:Series、DataFrame

Series:一维数组,可以保存任何数据类型(整数、字符串、浮点数、Python对象等),Series带有索引,目前可以理解为一列数据。
DataFrame:二维表格型数据结构,可以看作是由Series组成的字典对象。DataFrame既有行索引也有列索引,它可以被看作是一个共享相同索引的多个Series对象的集合。

认识Pandas中的数据结构

上图为通过pandas读取数据集展示出来的数据,以此为例我们来讲解Pandas的核心概念,以及这些概念的层级关系:

  • DataFrame

    • Series

      • 索引列

        • 索引名、索引值

        • 索引下标、行号

      • 数据列

        • 列名

        • 列下标

        • 列值,具体的数据

其中最核心的就是Pandas中的两个数据结构:DataFrameSeries

Series对象

  • Series也是Pandas中的最基本的数据结构对象,下文中简称s对象;一般是DataFrame的列对象,series本身也具有行索引。

  • Series是一种类似于一维数组的对象,由下面两个部分组成:

    • values:一组数据(numpy.ndarray类型)

    • index:相关的数据行索引标签;如果没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引。

数据类型

Pandas的Series数据结构可以容纳多种数据类型,以下是一些常见的数据类型:

  1. 整数类型 (Integer Types)

    • int8, int16, int32, int64: 这些是Pandas支持的整数类型,根据数据的范围和内存使用情况进行选择。默认情况下,整数数据通常会被存储为int64

  2. 浮点类型 (Floating-Point Types)

    • float16, float32, float64: 这些是用于存储浮点数的类型,根据精度和内存需求来选择。默认情况下,浮点数数据通常会被存储为float64

  3. 对象类型 (Object Type)

    • object: 用于存储字符串、混合类型数据或Python对象。这是非常灵活的数据类型,但可能会降低某些操作的性能。

  4. 布尔类型 (Boolean Type)

    • bool: 用于存储布尔值(True或False)。

  5. 日期和时间类型 (Datetime Types)

    • datetime64[ns]: 用于存储日期和时间数据,精确到纳秒。Pandas提供了丰富的日期和时间处理功能。

创建Series对象

通过numpy.ndarray来创建
  • 自动生成索引

参考代码:

  import numpy as np
  import pandas as pd
  
  # 创建numpy.ndarray对象
  n1 = np.array([1, 2, 3])
  print(n1)
  print(type(n1))
  
  # 创建Series对象
  s1 = pd.Series(data=n1)
  print(s1)
  print(type(s1))
  
  # 输出结果如下:
  [1 2 3]
  <class 'numpy.ndarray'>
  0    1
  1    2
  2    3
  dtype: int64
  <class 'pandas.core.series.Series'>

上面的结果中,左边显示的0,1是Series的索引,默认为0,1,2,3...,下边的dtype:int64就是该Series对象中值的数据类型

指定索引:
import numpy as np
import pandas as pd

# 创建numpy.ndarray对象
n1 = np.array([1, 2, 3])

# 创建Series对象, 同时指定索引
s1 = pd.Series(data=n1, index=['A', 'B', 'C'])
print(s1)
print(type(s1))

# 输出结果如下:
A    1
B    2
C    3
dtype: int64
<class 'pandas.core.series.Series'>
通过list列表来创建
  • 如果传入的数据类型是统一的数字,那么最终的dtype类型是int64

  • 如果传入的数据类型是统一的字符串,那么最终的dtype类型是object

  • 如果传入的数据类型是多种类型,那么最终的dtype类型也是object

    • 参考代码

import pandas as pd

# 创建Series对象
s1 = pd.Series(['banana', 42])
print(s1)
s2 = pd.Series(['banana', 'apple'])
print(s2)
s3 = pd.Series([50, 42])
print(s3)
# 自定义索引
s4 = pd.Series(['小明', '男'], index=['Name', 'Gender'])
print(s4)

# 输出结果如下:
0    banana
1        42
dtype: object 
0    banana
1     apple
dtype: object
0    50
1    42
dtype: int64
Name      小明
Gender     男
dtype: object
通过字典或元组创建s对象
  • 参考代码

import pandas as pd

# 使用元组
tuple1 = (1, 2, 3)
s1 = pd.Series(tuple1)
print(s1)

# 使用字典 字典中的key值是Series对象的索引值,value值是Series对象的数据值
dict1 = {'A': 1, 'B': 2, 'C': 3}
s2 = pd.Series(dict1)
print(s2)

# 输出结果如下
0    1
1    2
2    3
dtype: int64
A    1
B    2
C    3
dtype: int64

Series对象常用属性和方法

  • 常见属性​

  • 属性说明
    loc使用索引值取子集
    iloc使用索引位置取子集
    dtype或dtypesSeries内容的类型
    TSeries的转置矩阵
    shape数据的维数
    sizeSeries中元素的数量
    valuesSeries的值
  • 常见方法

    方法说明
    append连接两个或多个Series
    corr计算与另一个Series的相关系数
    cov计算与另一个Series的协方差
    describe计算常见统计量
    drop_duplicates返回去重之后的Series
    equals判断两个Series是否相同
    get_values获取Series的值,作用与values属性相同
    hist绘制直方图
    isinSeries中是否包含某些值
    min返回最小值
    max返回最大值
    mean返回算术平均值
    median返回中位数
    mode返回众数
    quantile返回指定位置的分位数
    replace用指定值代替Series中的值
    sample返回Series的随机采样值
    sort_values对值进行排序
    to_frame把Series转换为DataFrame
    unique去重返回数组
    value_counts统计不同值数量
    keys获取索引值
    head查看前5个值
    tail查看后5个值

import pandas as pd

# 创建s对象
s1 = pd.Series(data=[1, 2, 3, 4, 2, 3], index=['A', 'B', 'C', 'D', 'E', 'F'])
print(s1)
print('=================== 常用属性 ===================')
# 查看s对象值数量,就是查看有多少行函数
print(s1.size)
# 查看s对象维度, 返回一个单个元素的元组, 元素个数代表维度数, 元素值代表值数量
# (行数,列数),由于s对象时一维的,只显示行数,如果以后使用DataFrame来调用,则是二维的,既有行,又有列
print(s1.shape)  # (6,)
# 查看s对象数据类型
print(s1.dtypes)
print(s1.dtype)

# 获取s对象的数据值, 返回numpy的ndarray数组类型
print(s1.values)  #   [1 2 3 4 2 3]  本质上是一个numpy 数组
print(type(s1.values))  #  <class 'numpy.ndarray'>

# 获取s对象的索引
# 前边是索引值,dtype是索引值类型,这里是字符串(object)
print(s1.index)  # Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')

print('=================== 常用方法 ===================')
# 查看s对象值数量
print(len(s1))
# 查看s对象前5个值, n默认等于5
print(s1.head())  # 查询前5行数据
print(s1.head(n=2))  # 设置查询前2行数据

# 查看s对象后5个值, n默认等于5
print(s1.tail())   # 查询后5行数据
print(s1.tail(n=2))  # 设置查询后2行数据
# 获取s对象的索引
print(s1.keys())   # Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')
# s对象转换成python列表
print(s1.tolist())
print(s1.to_list())  # 作用同上
# s对象转换成DataFrame对象
print(s1.to_frame())
print(s1.to_frame().shape  # (6,1) 输出是一个二维信  表格有6行1列
# s对象中数据的基础统计信息
print(s1.describe())
"""
count: 数据集中的元素数量。在这里是6。
mean: 数据集的平均值。所有数值相加后除以数值的数量。在这里是2.5。
std: 数据集的标准差。它描述了数值相对于平均值的离散程度。在这里是1.048809。
min: 数据集中的最小值。在这里是1。
25%: 数据集的四分位数(或百分位数)的第25个值。它表示有25%的数据小于或等于这个值。在这里是2。
50%: 数据集的中位数。它表示有一半的数据小于这个值,另一半大于这个值。在这里是2.5。
75%: 数据集的四分位数(或百分位数)的第75个值。它表示有75%的数据小于或等于这个值。在这里是3。
max: 数据集中的最大值。在这里是4。
"""
# s对象最大值、最小值、平均值、求和值...
print(s1.max())
print(s1.min())
print(s1.mean())
print(s1.sum())
# s对象数据值去重, 返回s对象
print(s1.drop_duplicates())
      
# s对象数据值去重, 返回数组
print(s1.unique())
# s对象数据值排序, 默认升序
print(s1.sort_values(ascending=True))
# s对象索引值排序, 默认升序
print(s1.sort_index(ascending=False))
# s对象不同值的数量, 类似于分组计数操作
print(s1.value_counts())  # select 数字,count(*) from 表  group by 数字;

布尔值列表获取Series数据

scientists.csv数据集中,列出大于Age列的平均值的具体值,具体步骤如下:

有需要数据集资料的可以私信我

  • 加载并观察数据集

    import pandas as pd
    
    df = pd.read_csv('data/scientists.csv')
    print(df)
    # print(df.head())
    # 输出结果如下
                       Name        Born        Died  Age          Occupation
    0     Rosaline Franklin  1920-07-25  1958-04-16   37             Chemist
    1        William Gosset  1876-06-13  1937-10-16   61        Statistician
    2  Florence Nightingale  1820-05-12  1910-08-13   90               Nurse
    3           Marie Curie  1867-11-07  1934-07-04   66             Chemist
    4         Rachel Carson  1907-05-27  1964-04-14   56           Biologist
    5             John Snow  1813-03-15  1858-06-16   45           Physician
    6           Alan Turing  1912-06-23  1954-06-07   41  Computer Scientist
    7          Johann Gauss  1777-04-30  1855-02-23   77       Mathematicia
    计算Age列的平均值
  • # 获取一列数据 df[列名]
    ages = df['Age']
    print(ages)
    print(type(ages))
    print(ages.mean())
    
    # 输出结果如下
    0    37
    1    61
    2    90
    3    66
    4    56
    5    45
    6    41
    7    77
    Name: Age, dtype: int64
    <class 'pandas.core.series.Series'>
    59.125
    输出大于Age列的平均值的具体值
  • print(ages[ages > ages.mean()])
    
    # 输出结果如下
    1    61
    2    90
    3    66
    7    77
    Name: Age, dtype: int64

    在本例中,ages>ages.mean(),到底是什么?

    为什么ages[ages > ages.mean()]就能返回我们想要的结果?

 利用表达式 ages > ages.mean() ,获取布尔值构成的series对象
new_ages_s = ages > ages.mean()
print(new_ages_s) # series对象
print(new_ages_s.values)  # numpy的ndarray数据类型
print(list(new_ages_s.values))  # python的list数据类型

# 输出结果如下
0    False
1     True
2     True
3     True
4    False
5    False
6    False
7     True
Name: Age, dtype: bool
[False  True  True  True False False False  True]
[False, True, True, True, False, False, False, True]
从Series中获取部分数据,可以传入布尔值的列表
bool_list = list(new_ages_s.values) # 构造布尔值列表
print(ages[bool_list]) # 通过布尔索引来控制,输出指定范围

# 输出结果如下
1    61
2    90
3    66
7    77
Name: Age, dtype: int64

Series对象的运算

Series和数值型变量计算时,变量会与Series中的每个元素逐一进行计算;

两个Series之间计算时,索引值相同的元素之间会进行计算;索引值不同的元素的计算结果会用NaN值(缺失值)填充。

  • Series和数值型变量计算

  • # 加法
    print(ages + 10)
    # 乘法
    print(ages * 2)
    
    # 输出结果如下
    0     47
    1     71
    2    100
    3     76
    4     66
    5     55
    6     51
    7     87
    Name: Age, dtype: int64
    0     74
    1    122
    2    180
    3    132
    4    112
    5     90
    6     82
    7    154
    Name: Age, dtype: int64

    两个Series之间计算时,索引值相同的元素之间会进行计算;索引值不同的元素的计算结果会用NaN值(缺失值)填充

  • print(ages + ages)
    print('=' * 20)
    print(pd.Series([1, 100]))
    print('=' * 20)
    print(ages + pd.Series([1, 100]))
    
    # 输出结果如下
    0     74
    1    122
    2    180
    3    132
    4    112
    5     90
    6     82
    7    154
    Name: Age, dtype: int64
    ====================
    0      1
    1    100
    dtype: int64
    ====================
    0     38.0
    1    161.0
    2      NaN
    3      NaN
    4      NaN
    5      NaN
    6      NaN
    7      NaN
    dtype: float64

    DataFrame对象

    DataFrame是一个表格型的==结构化==数据结构,它含有一组或多组有序的列(Series),每列可以是不同的值类型(数值、字符串、布尔值等)。

    • DataFrame是Pandas中的最基本的数据结构对象,简称df;可以认为df就是一个二维数据表,这个表有行有列有索引

    • DataFrame是Pandas中最基本的数据结构,Series的许多属性和方法在DataFrame中也一样适用

    创建DataFrame对象

    DataFrame的创建有很多种方式:

    • Serires对象转换为df:上一小节中学习了s.to_frame()

    • 读取文件数据返回df:上一小节中我们使用了pd.read_csv('csv格式数据文件路径')的方式获取了df对象

    • 使用字典、列表、元组创建df

  • 使用字典加列表创建df

import pandas as pd

dict_data = {
    'id': [1, 2, 3],
    'name': ['张三', '李四', '王五'],
    'age': [18, 20, 22]
}
# 使用默认自增索引
# 字典中的key值是df对象的列名,value值是对应列的数据值
df1 = pd.DataFrame(data=dict_data)
print(df1)
print(type(df1))a
# 通过index参数指定索引, columns参数指定列的位置
df2 = pd.DataFrame(data=dict_data, index=['A', 'B', 'C'], columns=['id', 'age', 'name'])
print(df2)

# 输出结果如下
   id  name  age
0   1  张三   18
1   2  李四   20
2   3  王五   22
<class 'pandas.core.frame.DataFrame'>
   id  age  name
A   1   18  张三
B   2   20  李四
C   3   22  王五

使用列表加元组创建df,并自定义索引

list_data = [(1, '张三', 18),
             (2, '李四', 20),
             (3, '王五', 22)]
df3 = pd.DataFrame(data=list_data,
                   index=['A', 'B', 'C'],  # 手动指定索引
                   columns=['id', 'name', 'age'])  # 手动指定列名
print(df3)

# 输出结果如下
   id  name  age
A   1  张三   18
B   2  李四   20
C   3  王五   22

DataFrame对象常用属性和方法

DataFrame对象常用属性和方法与Series对象的几乎相同

import pandas as pd

# 加载数据集, 得到df对象
df = pd.read_csv('../data/scientists.csv')

print('=============== 常用属性 ===============')
# 查看维度, 返回元组类型 -> (行数, 列数), 元素个数代表维度数
print(df.shape)
# 查看数据值个数, 行数*列数, NaN值也算
print(df.size)
# 查看数据值, 返回numpy的ndarray类型
print(df.values)
# 查看维度数
print(df.ndim)
# 返回列名和列数据类型
print(df.dtypes)
# 查看索引值, 返回索引值对象
print(df.index)
# 查看列名, 返回列名对象
print(df.columns)
print('=============== 常用方法 ===============')
# 查看前5行数据
print(df.head())
# 查看后5行数据
print(df.tail())
# 查看df的基本信息
df.info()
# 查看df对象中所有数值列的描述统计信息
print(df.describe())
# 查看df对象中所有非数值列的描述统计信息
# exclude:不包含指定类型列
print(df.describe(exclude=['int', 'float']))
# 查看df对象中所有列的描述统计信息
# include:包含指定类型列, all代表所有类型
print(df.describe(include='all'))
# 查看df的行数
print(len(df))
# 查看df各列的最小值
print(df.min())
# 查看df各列的非空值个数
print(df.count())
# 查看df数值列的平均值
print(df.mean())

布尔值列表获取DataFrame对象中部分数据

  • 同Series一样,DataFrame也可以使用布尔值Series对象获取数据子集

# 加载数据集, 得到df对象
df = pd.read_csv('../data/scientists.csv')
print(df['Age'] > df['Age'].mean())
print(df[df['Age'] > df['Age'].mean()])

# 输出结果如下
0    False
1     True
2     True
3     True
4    False
5    False
6    False
7     True
Name: Age, dtype: bool
                   Name        Born        Died  Age     Occupation
1        William Gosset  1876-06-13  1937-10-16   61   Statistician
2  Florence Nightingale  1820-05-12  1910-08-13   90          Nurse
3           Marie Curie  1867-11-07  1934-07-04   66        Chemist
7          Johann Gauss  1777-04-30  1855-02-23   77  Mathematician

本质就是传入布尔值构成的列表,来获取部分数据,True所对应的数据会被保留

# 获取第1、2、4、8行数据
# 布尔值列表个数要和df的行数相同
bool_list = [True, True, False, True, False, False, False, True]
print(df[bool_list])

# 输出结果如下
                Name        Born        Died  Age     Occupation
0  Rosaline Franklin  1920-07-25  1958-04-16   37        Chemist
1     William Gosset  1876-06-13  1937-10-16   61   Statistician
3        Marie Curie  1867-11-07  1934-07-04   66        Chemist
7       Johann Gauss  1777-04-30  1855-02-23   77  Mathematician

DataFrame对象的运算

DataFrame和数值型变量计算时,变量会与DataFrame中的每个元素逐一进行计算,但df中存在非数值类型列时不能进行加减除运算

两个DataFrame之间、以及df和s对象进行计算时,索引值相同的行之间会进行计算;索引值不同的行的计算结果会用NaN值(缺失值)填充。

  • df和数值型变量计算

import pandas as pd

# 加载数据集, 得到df对象
df = pd.read_csv('../data/scientists.csv')
print(df * 2)
# print(df + 2)  # 报错,因为df2中有非数值类型的列
# 输出结果如下 数值类型列的值和数值变量正常运算, 非数值类型列的值重复拼接在一起

df之间进行运算

print(df + df)  # 输出结果和 df * 2 相同
# isin:判断df的索引值是否在values参数列表中, 返回布尔值的ndarray数据类型
print(df.index.isin(values=[0, 2, 4]))
df2 = df[df.index.isin(values=[0, 2, 4])]
print(df2)
print(df + df2)

总结

Pandas中的API太多,千万不要尝试去记忆,你记不住的,要求有印象、能找到、能看懂

  • 理解类知识点

    • dataframe和series对象是什么:

      • 可以认为df是有行有列有索引的二维数据表

      • df和s是Pandas中最核心的数据结构

      • df中每一列或者每一行都是s对象

      • s对象也有索引

      • 每一个s对象都有各自的数据类型,表示构成这个s对象中的值的type;常用的数据类型有

        • Object -- 字符串

        • int -- 整数

        • float -- 小数

  • series和dataframe的API

# <s/df>表示s对象或df对象
<s/df>.size # 返回数据个数
<s/df>.shape # s返回(行数,),df返回(行数,列数)
<s/df>.dtypes # s返回数据类型,df返回列名和该列数据的类型
<s/df>.values # 返回全部值
<s/df>.index # 查看索引
<s/df>.head() # s返回前5个数据,df返回前5行数据
<s/df>.tail() # s返回后5个数据,df返回后5行数据
df.info() # 返回df的基本信息:索引情况,以及各列的名称、数据数量、数据类型;s对象没有这个函数
<s/df>.describe() # 返回s或df对象中所有数值类型数据的基础统计信息
df.describe(include='all') # 返回df对象中全部列数据的基础统计信息
  • series以及dataframe的运算

    • 当s或df和数值进行运算时,每一个具体的值会分别和数值进行运算,但s或df中的数据存在非数值类型时不能做加减除法运算

    • 两个s之间、两个df之间,以及df和s对象进行计算,会根据索引的值进行对应计算,当两个对象的索引值不能对应时,不匹配的会返回NaN

  • 判断表达式

    • s对象的判断表达式返回由布尔值构成的numpy.ndarray数组

    • 布尔值列表或数组获取s或df对象中部分数据的方法:返回True对应的(行)数据

  • 25
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值