利用Python进行数据分析(Ⅱ)

利用Python进行数据分析(Ⅱ)

本文参考书籍:《利用Python进行数据分析》

5.pandas入门

  pandas是用来处理表格型或异质型数据的,而NumPy则相反,它更适合处理同质型的数值类数组数据

5.1 pandas数据结构介绍

5.1.1 Series

  Series是一种一维的数组型对象,它包含了一个值序列,并且包含了数据标签,称为索引。最简单的序列可以仅仅由一个数组形成:
在这里插入图片描述
  由于我们不为数据指定索引,默认生成的索引是从0到N-1。可以通过value属性和index属性分别获得Series对象的值和索引:
在这里插入图片描述
  通常需要创建一个索引序列,用标签标识每个数据点:
在这里插入图片描述
  可以在从数据中选择数据的时候使用标签来进行索引:
在这里插入图片描述
  使用NumPy的函数或NumPy风格的操作,比如使用布尔值数组进行过滤,与标量相乘,或是应用数学函数,这些操作将保存索引值连接:
在这里插入图片描述
在这里插入图片描述
  从另一个角度考虑Series,可以认为它是一个长度固定且有序的字典,因为它将索引值和数据值按位置配对。在使用字典的上下文中,也可以使用Series:
在这里插入图片描述
  如果已经有数据包含在Python字典中,可以使用字典生成一个Series:
在这里插入图片描述
  当把字典传递给Series构造函数时,产生的Series的索引将是排序好的字典键。可以将字典键按照想要的顺序传递给构造函数:
在这里插入图片描述
  pandas中使用isnull和notnull函数来检查缺失数据:
在这里插入图片描述
  isnull和notnull也是Series的实例方法:
在这里插入图片描述
  Series可以在数学操作中自动对齐索引(与数据库中的join操作类似):
在这里插入图片描述
  Series对象自身和其索引都有name属性:
在这里插入图片描述
  Series的索引可以通过按位置赋值的方式进行改变:
在这里插入图片描述
  

5.1.2 DataFrame

  DataFrame表示的是矩阵的数据表,它包含已排序的列集合,每一列可以是不同值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被视为一个共享相同索引的Series的字典。在DataFrame中,数据被存储为一个以上的二维块,而不是列表、字典或其他一维数组的集合。

  可利用包含等长度列表或NumPy数组的字典来形成DataFrame。产生的DataFrame会自动为Sereies分配索引,并且列会按照排序的顺序排列:
在这里插入图片描述
  对于大型的DataFrame,head方法将会只选出头部的五行:
在这里插入图片描述
  如果指定了列的顺序,DataFrame的列将会按照指定顺序排列:
在这里插入图片描述
  如果传的列不包含在字典中,将会在结果中出现缺失值:
在这里插入图片描述
  DataFrame中的一列,可以按字典型标记或属性那样检索为Series:
在这里插入图片描述
  行也可以通过位置或特殊属性loc进行选取:
在这里插入图片描述
  列的引用是可以修改的。例如,空的’debt’列可以赋值为标量值或值数组:
在这里插入图片描述
  当将列表或数组赋值给一个列时,值的长度必须和DataFrame的长度相匹配。当将Series赋值给一列时,Series的索引将会按照DataFrame的索引重新排列,并在空缺的地方填充缺失值:
在这里插入图片描述
  如果被赋值的列不存在,则会生成一个新的列。del关键字可以像在字典中那样对DataFrame删除列
在这里插入图片描述
  从DataFrame中选取的列是数据的视图,而不是拷贝。因此,对Series的修改会映射到DataFrame中。如果需要复制,则应当显式地使用Series的copy方法

  另一种常用的数据形式是包含字典的嵌套字典:
在这里插入图片描述
  如果嵌套字典被赋值给DataFrame,pandas会将字典的键作为列,将内部字典的键作为行索引:
在这里插入图片描述
  可以对DataFrame进行转置操作(调换行和列):
在这里插入图片描述
  内部字典的键被联合、排序后形成了结果的索引。如果已经显式指明索引的话,内部字典的键将不会被排序:
在这里插入图片描述
  包含Series的字典也可以用于构造DataFrame:
在这里插入图片描述
  可以向DataFrame构造函数传递的对象如下:
在这里插入图片描述
  如果DataFrame的索引和列拥有name属性,则这些name属性也会被显示:
在这里插入图片描述
  DataFrame的values属性会将包含在DataFrame中的数据以二维ndarray的形式返回:
在这里插入图片描述
  若DataFrame的列是不同的dtypes,则values的dtype会自动选择适合所有列的类型:
在这里插入图片描述

5.1.3 索引对象

  pandas中的索引对象是用于存储轴标签和其他元数据的(例如轴名称或标签)。在构造Series或DataFrame时,你所使用的任意数组或标签序列都可以在内部转换为索引对象:
在这里插入图片描述
  索引对象是不可变的,用户无法修改索引对象:
在这里插入图片描述
  不变性使得在多种数据结构中分享索引对象更为安全:
在这里插入图片描述
  pandas索引对象可以包含重复标签:
在这里插入图片描述
  根据重复标签进行筛选,会选取所有重复标签对应的数据

  一些索引对象的方法和属性如下:
在这里插入图片描述
  

5.2 基本功能

  

5.2.1 重建索引

  reindex方法用于创建一个符合新索引的新对象。
在这里插入图片描述
  Series调用reindex方法时,会将数据按照新的索引进行排列,如果某个索引值之前并不存在,则会引入缺失值:
在这里插入图片描述
  对于顺序数据,比如时间序列,在重建索引时可能会需要进行插值或填值。method可选参数允许我们使用诸如ffill等方法在重建索引时插值,ffill方法会将值前向填充:
在这里插入图片描述
  在DataFrame中,reindex可以改变行索引、列索引,也可以同时改变二者。当仅传入一个序列时,结果中的行会重建索引:
在这里插入图片描述
  列可以使用columns关键字重建索引:
在这里插入图片描述
  以下为reindex方法的参数:
在这里插入图片描述
  可以使用loc进行更为简洁的标签索引:
在这里插入图片描述

5.2.2 轴向上删除条目

  drop方法返回一个含有指示值或轴向上删除值的新对象:
在这里插入图片描述
  在DataFrame中,索引值可以从轴向上删除
在这里插入图片描述
  在调用drop时使用标签序列会根据行标签删除值(轴0):
在这里插入图片描述
  可以通过传递axis=1或axis='columns’来从列中删除值:
在这里插入图片描述
  很多函数,例如drop,会修改Series或DataFrame的尺寸或形状,这些方法直接操作原对象而不返回新对象:
在这里插入图片描述

5.2.3 索引、选择与过滤

  Series的索引值可以不仅仅是整数:
在这里插入图片描述
在这里插入图片描述
  普通的Python切片中是不包含尾部的,Series的切片与之不同:
在这里插入图片描述
  使用这些方法设值时会修改Series相应的部分:
在这里插入图片描述
  使用单个值或序列,可以从DataFrame中索引出一个或多个列:
在这里插入图片描述
在这里插入图片描述
  这种索引方式也有特殊案例。可以根据一个布尔值数组切片选择数据:
在这里插入图片描述
  行选择语法data[:2]非常方便。传递单个元素或一个列表到[ ]符号中可以选择列。
  另一个用例是使用布尔值DataFrame进行索引,布尔值DataFrame可以是对标量值进行比较产生的:
在这里插入图片描述

5.2.3.1 使用loc和iloc选择数据

  loc和iloc允许使用轴标签(loc)或整数标签(iloc)从DataFrame中选出数组的行和列的子集
  通过标签选出单行多列的数据:
在这里插入图片描述
  在这里插入图片描述
  索引功能还可以用于切片:
在这里插入图片描述
  DataFrame索引选项如下:
在这里插入图片描述

5.2.4 整数索引

  

5.2.5 算术和数据对齐

  当将对象相加时,若存在某个索引对不相同,则返回结果的索引将是索引对的并集
在这里插入图片描述
  没有交叠的标签位置上,内部数据对齐会产生缺失值。在DataFrame的示例中,行和列上都会执行对齐:
在这里插入图片描述
在这里插入图片描述
  在这里插入图片描述

5.2.5.1 使用填充值的算术方法

  在两个不同的索引化对象之间进行算术操作时,可能会想要使用特殊填充值,比如当轴标签在一个对象中存在,在另一个对象中不存在时,想将缺失值填充为0:
在这里插入图片描述
  以下为Series和DataFrame的算术方法:
在这里插入图片描述
  以r开头的副本方法的参数是翻转的,如;
在这里插入图片描述
  当对Series或DataFrame重建索引时,可以指定一个不同的填充值:
在这里插入图片描述

5.2.5.2 DataFrame和Series间的操作

  在这里插入图片描述
  当我们从arr中减去arr[0]时,减法在每一行都进行了操作。这就是所谓的广播机制

在这里插入图片描述
  默认情况下,DataFrame和Series的数学操作中会将Series的索引和DataFrame的列进行匹配,并广播到各行:
在这里插入图片描述
  若一个索引值不在DataFrame的列中,也不在Series的索引中,则对象会重建索引并形成联合:
在这里插入图片描述
  若想改为在列上进行广播,在行上匹配,必须使用算术方法中的一种。如:
在这里插入图片描述
  传递的axis值是用于匹配轴的。上面的示例中表示我们需要在DataFrame的行索引上对行匹配(axis='index’或axis=0),并进行广播

5.2.6 函数应用和映射

  NumPy的通用函数(逐元素数组方法)对pandas对象也有效:
在这里插入图片描述
  DataFrame的apply方法可以实现将函数应用到一行或一列的一维数组上:
在这里插入图片描述
  函数f会计算Series最大值和最小值的差,会被frame中的每一列调用一次。结果是一个以frame的列作为索引的Series
  若传递axis='columns’给apply函数,函数将会被每行调用一次:
在这里插入图片描述
  传递给apply的函数并不一定要返回一个标量值,也可以返回带有多个值的Series:
在这里插入图片描述
  逐元素的Python函数也可以使用。假设想要根据frame中的每个浮点数计算一个格式化字符串,可以使用applymap方法:
在这里插入图片描述
  Series有map方法,可以将一个逐元素的函数应用到Series上:
在这里插入图片描述

5.2.7 排序和排名

  如需按行或列索引进行字典型排序,需要使用sort_index方法,该方法返回一个新的、排序好的对象:
在这里插入图片描述
  在DataFrame中,可以在各个轴上按索引排序:
在这里插入图片描述
  数据默认会升序排序,也可以按照降序排序:
在这里插入图片描述
  若要根据Series的值进行排序,使用sort_values方法:
在这里插入图片描述
  默认情况下,所有缺失值都会被排序至Series的尾部:
在这里插入图片描述
  当对DataFrame排序时,可以使用一列或多列作为排序键。可传递一个或多个列名给sort_values的可选参数by:
在这里插入图片描述
  对多列排序时,传递列名的列表:
在这里插入图片描述
  排名是指对数组从1到有效数据点总数分配名次的操作。Series和DataFrame的rank方法是实现排名的方法,默认情况下,rank通过将平均排名分配到每个组来打破平级关系:
在这里插入图片描述
  排名也可以根据它们在数据中的观察顺序进行分配:
在这里插入图片描述
  在上面的例子中,对条目0和2设置的名次为6和7,而不是之前的平均排名6.5,是因为在数据中标签0在标签2的前面
  可以按降序排名:
在这里插入图片描述
  下列为可用的平级关系打破方法:
在这里插入图片描述
  DataFrame可以对行或列计算排名:
在这里插入图片描述

5.2.8 含有重复标签的轴索引

  
在这里插入图片描述
  索引的is_unique属性可以告知它的标签是否唯一:
在这里插入图片描述
  带有重复索引的情况下,根据一个标签索引多个条目会返回一个序列,而单个条目会返回标量值:
在这里插入图片描述
  相同的逻辑可以拓展到在DataFrame中进行行索引:
在这里插入图片描述

5.3 描述性统计的概述与计算

  
在这里插入图片描述
  调用DataFrame的sum方法返回一个包含列上加和的Series:
在这里插入图片描述
  传入axis='columns’或axis=1,则会将一行上各个列的值相加:
在这里插入图片描述

  除非整个切片上都是NA,否则NA值是被自动排除的。可以通过禁用skipna来实现不排除NA值:
在这里插入图片描述
  以下为归约方法的常用可选参数:
在这里插入图片描述
  一些方法,如idxmin和idxmax,返回的是间接统计信息,比如最小值或最大值的索引值:
在这里插入图片描述
  除了归约方法外,有的方法是积累型方法:
在这里插入图片描述
  还有一类方法既不是归约型方法也不是积累型方法。describe就是其中之一,它一次性产生多个汇总统计:
在这里插入图片描述
  对于非数值型数据,describe产生另一种汇总统计:
在这里插入图片描述
  汇总统计及其相关方法如下:
在这里插入图片描述

5.3.1 相关性和协方差

  考虑某些使用附加pandas-datareader库从Yahoo! Finance上获取的包含股价和交易量的DataFrame。
  使用pandas_datareader模块下载一些数据:
在这里插入图片描述
  计算股价的百分比:
在这里插入图片描述
  Series的corr方法计算的是两个Series中重叠的、非NA的、按索引对齐的值的相关性。相应地,cov计算的是协方差:
在这里插入图片描述
  DataFrame的corr和cov方法会分别以DataFrame的形式返回相关性和协方差矩阵:
在这里插入图片描述
  使用DataFrame的corrwith方法,可以计算出DataFrame中的行或列与另一个序列或DataFrame的相关性。该方法传入一个Series时,会返回一个含有为每列计算相关性值的Series:
在这里插入图片描述
  传入一个DataFrame时,会计算匹配到列名的相关性数值:
在这里插入图片描述
  传入axis='columns’会逐行地进行计算

5.3.2 唯一值、计数和成员属性

  unique给出Series中的唯一值:
在这里插入图片描述
  uniques.sort()可以对唯一值进行排序。value_counts计算Series包含的值的个数:
在这里插入图片描述
  isin执行向量化的成员属性检查,还可以将数据集以Series或DataFrame一列的形式过滤为数据集的值子集:
在这里插入图片描述
在这里插入图片描述
  与isin相关的Index.get_indexer方法,可以提供一个索引数组,这个索引数组可以将可能非唯一值数组转换为另一个唯一值数组:
在这里插入图片描述
  唯一值、计数和集合成员属性方法如下:
在这里插入图片描述
  在这里插入图片描述
  将pandas.value_counts传入DataFrame的apply函数可以得到:
在这里插入图片描述
  结果中的行标签是所有列中出现的不同值,数值则是这些不同值在每个列中出现的次数

6. 数据载入、存储及文件格式

6.1 文本格式数据的读写

  Pandas的解析函数如下:

在这里插入图片描述

  这些函数的可选参数主要有以下几种类型:

  • 索引
      可以将一或多个列作为返回的DataFrame,从文件或用户处获得列名,或者没有列名

  • 类型推断和数据转换
      包括用户自定义的值转换和自定义的缺失值符号列表

  • 日期时间解析
      包括组合功能,也包括将分散在多个列上的日期和时间信息组合成结果中的单个列

  • 迭代
      支持对大型文件的分块迭代

  • 未清洗数据问题
      跳过行、页脚、注释以及其他次要数据,比如使用逗号分隔千位的数字

  使用type打印文件的原始内容:
在这里插入图片描述
  由于该文件是逗号分隔的,可以使用read_csv将它读入一个DataFrame:
在这里插入图片描述
  也可以使用read_table,并指定分隔符:
在这里插入图片描述
  有的文件并不包含表头行:
在这里插入图片描述
  要读取该文件,需要选择一些选项。可以允许pandas自动分配默认列名,也可以自己指定列名:
在这里插入图片描述
  若想要message列成为返回DataFrame的索引,可以指定位置4的列为索引,获将‘message’传给参数index_col:
在这里插入图片描述
  若想要从多个列中形成一个分层索引,需要传入一个包含列序号或列名的列表:
在这里插入图片描述
  在某些情况下,一张表的分隔符并不是固定的,使用空白或其他方式来分隔字段。如:
在这里插入图片描述
  当字段是以多种不同数量的空格分开时,可以向read_table传入一个正则表达式作为分隔符。在本例中,正则表达式为\s+:
在这里插入图片描述
  本例中,由于列名的数量比数据的列数少一个,因此read_table推断第一列应当作为DataFrame的索引

  解析函数有很多附加参数帮助你处理各种发生异常的文件格式。例如,可以使用skiprows来跳过第一行、第三行和第四行:
在这里插入图片描述
  通常情况下,缺失值要么不显示(空字符串),要么用一些标识值。默认情况下,pandas使用一些常见的标识,如NA和NULL:
在这里插入图片描述
  na_values选项可以传入一个列表或一组字符串来处理缺失值:
在这里插入图片描述
  在字典中,每列可以指定不同的缺失值标识:
在这里插入图片描述
  以下列举了pandas.read_csv和pandas.read_table中常用的选项:
在这里插入图片描述
在这里插入图片描述
  

6.1.1 分块读入文本文件

  当处理大型文件或找出正确的参数集来正确处理大文件时,可能需要读入文件的一个小片段或者按小块遍历文件。
  在尝试大文件之前,可以先对pandas的显示设置进行调整,使之更为紧凑:
在这里插入图片描述
  
在这里插入图片描述
  若只想读取一小部分行(避免读取整个文件),可以指明nrows:
在这里插入图片描述
  为了分块读入文件,可以指定chunksize作为每一块的行数:
在这里插入图片描述
  read_csv返回的TextParser对象允许根据chunksize遍历文件。例如,可以遍历ex6.csv,并对’key’列聚合获得计数值:
在这里插入图片描述
  TextParser还具有get_chunk方法,允许按照任意大小读取数据块

6.1.2 将数据写入文本格式

  数据可以导出为分隔的形式。使用DataFrame的to_csv方法,可以将数据导出为逗号分隔的文件:
在这里插入图片描述
  也可以使用其他的分隔符(写入到sys.stdout时,控制台中打印的文本结果):
在这里插入图片描述
  缺失值在输出时以空字符串出现。可用其他标识值对缺失值进行标注:
在这里插入图片描述
  若没有其他选项被指定,行和列的标签都会被写入。二者也可以禁止写入:
在这里插入图片描述
  也可以仅写入列的子集,并且按照选择的顺序写入:
在这里插入图片描述
  Series也有to_csv方法:
在这里插入图片描述

6.1.3 使用分隔格式

  考虑如下CSV文件:
在这里插入图片描述
  对于任何带有单字符分隔符的文件,可以使用Python的内建csv模块。要使用它,需要将任一打开的文件或文件型对象传给csv.reader:
在这里插入图片描述
  像遍历文件那样遍历reader会产生元组,元组的值为删除了引号的字符:在这里插入图片描述
  首先将文件读取为行的列表:
在这里插入图片描述
  然后,将数据拆分为列名行和数据行:
在这里插入图片描述
  然后,使用字典推导式和表达式zip(*values)生成一个包含数据列的字典,字典中行转置成列:
在这里插入图片描述
  若需根据不同的分隔符、字符串引用约定或行终止符定义一种新的格式时,可使用csv.Dialect定义一个简单的子类:
在这里插入图片描述
在这里插入图片描述
  也可不定义子类,直接将CSV方言参数传入csv.reader的关键字参数:
在这里插入图片描述

  csv.Dialect中的一些属性及其用途如下:
在这里插入图片描述
  需要手动写入被分隔的文件时,可以使用csv.writer。这个函数接收一个已经打开的可写入文件对象以及和csv.reader相同的CSV方言、格式选项:
在这里插入图片描述

JSON数据

  JSON(JavaScript Object Notation)是Web浏览器和其他应用间通过HTTP请求发送数据的标准格式。
在这里插入图片描述
  JSON基本类型是对象(字典)、数组(列表)、字符串、数字、布尔值和空值。对象中的所有键都必须是字符串。
  将JSON字符串转换为Python形式时,使用json.loads方法:
在这里插入图片描述
  json.dumps可以将Python对象转换回JSON:
在这里插入图片描述
  可将字典构成的列表(之前是JSON对象)传入DataFrame构造函数,并选出数据字段的子集:
在这里插入图片描述
  pandas.read_json可以自动将JSON数据集按照指定次序转换为Series或DataFrame。pandas.read_json的默认选项是假设JSON数组中的每个对象是表里的一行:
在这里插入图片描述
  若需要从pandas中将数据导出为JSON,可对Series和DataFrame使用to_json方法:
在这里插入图片描述

6.1.5 XML和HTML:网络抓取

  Python拥有很多可以对HTML和XML格式进行读取、写入数据的库,例如lxml、Beautiful Soup和html5lib。尽管lxml是相对更快的库,但其他库可以更好地处理异常的HTML或XML文件
  pandas的内建函数read_html可以使用lxml和Beautiful Soup等库将HTML中的表自动解析为DataFrame对象
  pandas.read_html函数有很多选项,但在默认情况下,它会搜索并尝试解析所有包含在< table >标签中的表格型数据,返回的结果是DataFrame对象的列表:
在这里插入图片描述
  计算每年银行倒闭的数量:
在这里插入图片描述

6.1.5.1 使用lxml.objectify解析XML

  XML(eXtensive Markup Language)是一种常用的结构化数据格式,它使用元数据支持分层、嵌套数据。
  使用lxml.objectify,可以解析xml文件,并用getroot来获得对XML文件的根节点的引用:
在这里插入图片描述
  root.INDICATOR返回一个生成器,可产生每一个< INDICATOR >XML元素。对于每条记录,可将标签名称的字典(如YTD_ACTUAL)填充为数据值(不包括某几个标签):
在这里插入图片描述
  最后,将包含字典的列表转换为DataFrame:
在这里插入图片描述
  XML数据中的每个标签也可以包含元数据。考虑一个HTML连接标签,也是有效的XML:
在这里插入图片描述
  现在可以访问标签或链接文本中的任何字段(如href):
在这里插入图片描述

6.2 二进制格式

  使用Python内建的pickle序列化模块进行二进制格式操作是存储数据的方式之一。pandas对象拥有一个to_pickle方法可以将数据以pickle格式写入硬盘:
在这里插入图片描述
  可以使用内建的pickle读取文件中“pickle化”的对象,或使用pandas.read_pickle:
在这里插入图片描述
  pickle仅被推荐作为短期的存储格式。pickle很难确保格式的长期有效性,可能会由于库的新版本而无法反序列化

6.2.1 使用HDF5格式

  HDF5文件格式用于存储大量的科学数组数据。它以C库的形式提供,并且具有许多其他语言的接口。HDF代表分层数据格式。每个HDF5文件可以存储多个数据集并且支持元数据。HDF5适用于处理不适合在内存中存储的超大型数据,可以使得能够高效读写大型数组的一小块
  pandas中的HDFStore类像字典一样工作并处理低级别细节:
在这里插入图片描述
  包含在HDF5文件中的对象可以使用相同的字典型API进行检索:
在这里插入图片描述
  HDFStore支持两种存储模式:fixed和table。后者速度更慢,但支持一种特殊语法的查询操作:
在这里插入图片描述
  put是store[‘obj2’]=frame方法的显式版本,但允许我们设置其他选项,如存储格式
  pandas.read_hdf函数是这些工具的快捷方法:
在这里插入图片描述

6.2.2 读取Microsoft Excel文件

  pandas支持通过ExcelFile类或pandas.read_excel函数来读取存储在Excel文件中的表格型数据。
  使用ExcelFile时,通过将xls或xlsx的路径传入,生成一个实例:
在这里插入图片描述
  存储在表中的数据可以通过pandas.read_excel读取到DataFrame中:

在这里插入图片描述
  若需将pandas数据写入到Excel格式中,必须先生成一个ExcelWriter,然后使用pandas对象的to_excel方法将数据写入:
在这里插入图片描述
  也可以将文件路径传给to_excel:
在这里插入图片描述

6.3 与Web API交互

  要获取Github上最新的30条关于pandas的问题,可以使用附加库requests发送一个HTTP GET请求:
在这里插入图片描述
  Response对象的json方法将返回一个包含解析为本地Python对象的JSON的字典:
在这里插入图片描述
  data中的每个元素都是一个包含Github问题页面上的所有数据的字典(注释除外)。可以将data直接传给DataFrame,并提取感兴趣的字段:
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

happy19991001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值