
2.1 数据类型
在介绍数据类型之前,我们鼓励通过安装Anaconda完成Python解释器的安装,Anaconda不仅包括Python,而且包括更多的数据科学方面的包,例如Pandas、Matplotlib、BeautifulSoup等。
Python中有六种标准数据类型:数值(number)、字符串(string)、列表(list)、元组(tuple)、集合(set)、字典(dictionary)。不同的数据类型适用于不同的应用场景。按照是否可变分为可变数据类型和不可变数据类型,如图2-1所示。可变数据类型意味着可以对其修改,而不会创建新的对象。对不可变数据类型的操作会创建新的对象,而原始对象保持不变。

图2-1 数据类型分类
2.1.1 数值
数值型数据分为整型(int)、浮点型(float)和复数(complex),其中复数在金融场景的使用较少。不同的金融场景使用的数值型数据也会不同,例如,在表示工资、股票价格、利率等数据时采用浮点型数据,在表示股吧数据的评论量、股票日交易量等数据时通常采用整型。
整型也被称为整数,是正整数或负整数,没有小数点。整数运算的结果依然是整数。

浮点型由整数部分和小数部分组成,浮点型不精确存储;如果用于运算的两个数有一个是浮点数,那么运算结果是浮点数。

复数是由实部和虚部组成的,在Python中可以用a+bj或者complex(a,b)表示,其中a和b为浮点数。

数值型数据之间可以进行类型转化。但是,在转换过程中可能会涉及精度丢失的问题(例如,浮点数转化成整数会丢失小数点后面的精度),因此我们需要根据具体的情况进行数据转换。
2.1.2 字符串
1.字符串的创建
字符串类型是编程中表示文本的数据类型。在金融领域,常常遇到文本数据(如股吧评论、财经新闻等),这样的数据就是用字符串表示的。创建字符串可以使用单引号、双引号、三单引号和三双引号,其中三引号可以多行定义字符串,使用三引号还可以实现多行注释的功能。不论使用哪种引号进行字符串创建,引号需要成对地出现,不能使用双引号开始用单引号结尾;如果文本中出现了双引号,那么在创建字符串时需要与文本内部的双引号进行区分。

字符串还可以用来表示网页的网址、数据存储的路径等。但是在用字符串表示路径时,常常出现转义字符(如:“\t”等),导致显示出来的结果与我们希望得到的结果有所不同。

因此,我们常常在字符串前面加上“r”,表示“r”内部的字符串默认不转义,或者采用将“\”写成“\\”的方法。

我们在字符串前加上f可以灵活地在字符串中嵌入变量和表达式的值,称为f-string,这方便我们构造特定的字符串。例如,应用大语言模型分析文本时,通常需要构建提示语,下面的例子展示了如何构造一个提示语,在提示语中通过{}和f,将公司名称、新闻标题和新闻日期引入。

2.字符串相关操作以及方法
字符串常用的操作函数或方法如表2-1所示。
表2-1 字符串常用的操作函数或方法

(续)

(1)字符串的索引和切片
字符串索引通过下标访问字符串相应位置(索引)的元素,如代码str[index]。字符串切片,通过起始位置的下标以及步长(step)切取特定对象,str[start_index:end_index:step],如果不写step参数,默认为1,即获取start_index: end_index的每个字符(不包括end_index位置字符)。

思考:切片的操作范围为什么是左闭右开的?
(2)字符串的替换
在Python中对字符串中的文本进行替换的语句如下:

将字符串str中的字符old_str替换为新的new_str字符串,count是可选参数,表示只有前面的count个出现被替换,默认情况下替换所有old_str。

(3)字符串的大小写转换
在处理英文评论时,会出现大小写的情况,为了得到更加精确的结果或减轻工作量,我们常常进行大小写转换。比如,在处理文本过程中常常涉及词频统计,但在Python中,相同的单词若大小写不同则会算成不同的单词,为了得到更加精确的统计,我们常常将文本中的单词统一转换为小写或大写。
str.lower():用于将字符串中的所有大写字母转换为小写字母。
str.upper():用于将字符串中的所有小写字母转换为大写字母。


(4)统计字符出现的次数
str.count("char",start,end)用于统计字符串中某个字符出现的次数,默认情况下统计整个字符串中出现的相应字符。
• char——要统计的字符。
• start——索引字符串的起始位置,默认参数为0。
• end——索引字符串的结束位置,默认参数为字符串长度。
下面的代码对原始的article和小写处理后的article做词频统计。

(5)字符串的查找
str.find(sub,start,end)用于在字符串中查找相应的子串sub,并返回该子串的起始位置(即最小索引),如果未找到返回-1。
• sub——要查找的子字符串。
• start——索引的起始位置,默认值为0。
• end——索引的结束位置,默认值为字符串长度。
下面这个程序采用find函数查找出“摊手”这个词第一次出现的位置。

(6)字符串的拆分
str.split(sep=None,maxsplit=-1)[n]用于拆分字符串。通过指定分隔符sep对字符串进行分割,并返回分割后的字符串列表。
• sep——分隔符,默认为空格。
• maxsplit——最大分割参数,默认参数为-1。
• [n]——返回列表中下标为n的元素。列表索引的用法。

输出:

(7)字符串的连接
sep.join(iterable)
该方法可以采用将一个可迭代对象,按照一定的规则(即按照sep的定义)合并成为一个字符串。
• sep——分隔符,可以为空。
• iterable——要连接的变量,可以是字符串、元组、字典、列表等。

上述代码将三个句子用句号连接起来,输出字符串如下:

2.1.3 列表
“列表”是一种可变的数据类型,我们可以在列表中增加、删除、替换元素。列表没有长度限制,元素类型可以不同,使用非常灵活。列表用左中括号开始,右中括号结束,列表中的每个元素用逗号分开。
1.列表的创建
列表的创建有两种方法,[]和list()函数。
[]:将需要存储的元素以逗号分隔放在方括号内,如果没有值,就是空列表。
list()函数:将其他可迭代对象(如字符串、元组或其他列表)转换为列表。

2.列表的操作
列表的常用操作如表2-2所示。
表2-2 列表的常用操作

(1)索引和切片
列表的索引,通过下标访问字符串相应位置的元素,如代码lis[index]。列表的切片,通过起始位置的下标以及步长(step)切取特定对象,lis[start_index:end_index:step]。

(2)扩展
列表的扩展有多种方法,如“+”“extend()”“append()”等。下面的代码将展示不同的扩展方法的作用和最终输出结果的形式。
采用“+”进行扩展,需要注意的是加号两边连接的必须为列表,不能为字符串或者数字,最后得到的是一个列表。

extend()和append()虽然都可以起到扩展结果的作用,但是这两种函数的扩展原理对于可迭代对象(列表)有所不同。extend()是将可迭代对象中的每一个元素纳入列表中。

append()是将整个可迭代对象作为一个元素直接加入列表。在使用时需要特别注意对这两种方法加以区别。

上面的列表扩展方法只是单纯地把要添加的数据直接加到列表的后面,然而有时候我们需要在特定的位置添加元素,这个时候通常采用.insert()方法。下面这个程序是在lis1列表中的下标为1处添加元素“f”。

(3)删除
我们可以通过del和clear方法实现列表的删除。其中del是删除指定元素,而clear是删除列表里面的所有元素。

(4)排序
对列表中的元素进行排序采用的是.sort()方法,这种方法不仅能够对数字元素进行排列,也可以对字符串进行排列,根据字符串从左到右的每一个字符对应的ASCII码大小进行排序。

(5)计数
采用count()方法即可实现列表中元素的计数,用法与字符串的统计相同。

3.列表的推导
列表推导是一种创建列表的简洁方式,它允许在单个语句中使用循环语句和条件语句来生成列表元素。通过列表推导,可以将一个复杂的循环结构压缩成一行代码。Python的内部对列表推导式做了大量的优化,可以保证很快的运行速度,也是推荐使用的一种技术。下面这个程序采用列表推导式构建了一个从0~10的平方数的列表。

2.1.4 元组
“元组”是一个不可变的数据类型,且在创建元组时,用左括号开始,右括号结束。如果需要一个永远不会被改变的值的序列,可以考虑采用元组。同时,由于列表功能强大,会影响运行效率,因此可以采用元组对Python的一些代码块进行优化,让使用元组的代码比使用列表的代码运行得更快。
1.创建元组
元组输入时采用圆括号(),而不是方括号[]。如果元组中只有一个元素,则必须在最后增加一个逗号,例如,x=(3,)。
2.元组解包
一次性将元组赋值给多个变量,这个过程称为“元组的解包”。

在Python中,函数可以同时返回多个值,这些值被封装在一个元组中。使用元组解包,可以将返回的元组解包成多个变量,从而将每个返回值分配给对应的变量。

2.1.5 集合
Python中的集合数据类型与数学中集合的概念一致,即具有无序性、确定性、互异性。集合中的元素是唯一的,不允许重复。这对于财经数据分析很有用,因为财经数据分析中常常需要处理大量的重复数据,例如去重股票代码、排除重复的交易记录等。
1.集合的创建
我们可以使用花括号{}创建,或者使用set()函数创建集合:

2.集合运算
集合的常用运算如表2-3所示。
表2-3 集合的常用运算

下面的代码对股票代码进行了处理。

2.1.6 字典
Python中的字典提供了一种灵活的访问和组织数据的方式。字典是一种可变的数据类型,是由很多值(item)组成的集合。字典的索引被称为“键”,键与键所关联的值称为“键值对”,字典的每个键(key)与值(value)用冒号隔开,每个键值对之间用逗号分割,整个字典包括在花括号{}内。字典的索引可以是不同的数据类型,不仅可以是整数,也可以是字符串。字典中的键(key)具有集合的性质,集合可以看成一种特殊的字典,集合中的每个元素相当于字典中的键。
1.字典的基本操作
我们可以访问、修改字典里的值。

2.字典的常用函数和方法
字典的常用函数和方法包括keys、values等,具体的内容如表2-4所示。
表2-4 字典的常用函数和方法

(1)返回字典中的键信息
采用keys()方法可以获取字典中所有键组成的列表。

(2)返回字典中的值信息
采用values()方法可以获取字典中所有值信息组成的列表。

(3)返回字典中的键值对
通过items()可以获取字典中所有的键值对。

(4)返回字典中键对应的值,同时删除键值对
通过pop()可以删除字典给定的值。

(5)删除字典中的所有键值对
采用clear()方法可以将字典里面的所有键值对清空。

(6)删除字典中指定的键值对
上面讲了如何清空字典里面的键值对,然而很多时候我们只需要删除指定的键值对,这个时候可以采用del函数。

(7)判断键是否在字典中
输出为True代表键在字典中,输出为False代表键不在字典中。

3.get()与setdefault()方法
这两种方法都是从字典中取出一个已有键的值,直接返回结果。不同之处在于,当取出字典中一个不存在的键的值时,get()方法不会出现返回值,同时也不报错;setdefault()会返回默认键的值,并且将新的键值对保存在字典中。下面两种方法都可以统计message中每个字母出现的次数。
