关于数据分析中NumPy,Pandas,看完这一篇基本够了
前言
数据分析是Python的重要应用领域之一:Python在数据分析领域有着广泛的应用,许多数据科学家和分析师使用Python作为主要的数据分析工具。学好数据分析可以让你更好地应用Python来解决实际问题,并提升在数据分析领域的竞争力。
在当今信息爆炸的时代,数据分析能力成为了一种重要的技能。无论是在工作中还是个人生活中,我们都需要从大量的数据中提取有用的信息和洞察,并做出相应的决策。学好数据分析可以帮助你更好地理解和利用数据,提高决策的准确性和效率。
数据分析可以帮助我们从数据中发现规律、趋势和模式,从而做出更加明智的决策和创新。学好数据分析可以让你更好地理解数据,发现数据中的价值,并将其应用于实际的业务和创新中。
而且数据分析是许多其他领域的基础,如机器学习、人工智能、金融分析、市场营销等。学好数据分析可以为你进一步学习和应用这些领域提供坚实的基础。
学习数据分析可以培养你的逻辑思维、问题解决能力和创新思维。数据分析需要你从数据中提取有用的信息、进行推理和推断,并做出相应的结论。这种思维方式在许多其他领域也是非常有价值的。
总之,学好数据分析可以让你更好地应用Python解决实际问题,提高决策的准确性和效率,并为你进一步学习和应用其他领域提供坚实的基础。
接下来我们就详细介绍:NumPy,Pandas的种种
一丶NumPy篇
1.NumPy基本类型
在数据分析中,NumPy(Numerical Python)是一个重要的Python库,它提供了高性能的多维数组对象和用于处理这些数组的函数。以下是NumPy中的一些基本数据类型:
数值类型(Numeric Types):
- int:整数类型,如int8、int16、int32、int64等。
- uint:无符号整数类型,如uint8、uint16、uint32、uint64等。
- float:浮点数类型,如float16、float32、float64等。
- complex:复数类型,如complex64、complex128等。
布尔类型(Boolean Type):
- bool:布尔类型,只有两个值True和False。
字符串类型(String Type):
- string:字符串类型,用于存储文本数据。
时间类型(Datetime Type):
- datetime64:日期和时间类型,用于存储日期和时间数据。
对象类型(Object Type):
- object:对象类型,可以存储任意Python对象。
这些数据类型可以用于创建NumPy数组,通过指定dtype参数来指定数组的数据类型。例如,可以使用np.array
函数创建一个整数类型的数组:
import numpy as np
arr = np.array([1, 2, 3, 4], dtype=np.int32)
print(arr.dtype) # 输出 int32
在数据分析中,根据具体的需求和数据类型的特点,选择合适的数据类型可以提高计算效率和节省内存空间。NumPy还提供了丰富的函数和方法来处理这些不同类型的数据,例如数值计算、数组操作、统计分析等。
2.NumPy基础数据结构
NumPy(Numerical Python)是Python中用于科学计算和数据分析的重要库。它提供了高性能的多维数组对象(ndarray)和用于处理这些数组的函数。以下是NumPy中的一些基础数据结构:
ndarray(N-dimensional Array):
ndarray是NumPy中最重要的数据结构,它是一个多维数组对象。ndarray可以是一维、二维或更高维的数组,可以存储相同类型的元素。ndarray提供了快速的数值计算和向量化操作,是进行数据分析的基础。
Scalar(标量):
标量是NumPy中的基本数据类型,表示单个的数值。标量可以是整数、浮点数、布尔值等。
Vector(向量):
向量是一维的ndarray数组,表示一列数值。向量可以通过一维数组创建,例如np.array([1, 2, 3])。
Matrix(矩阵):
矩阵是二维的ndarray数组,表示一个二维表格的数值。矩阵可以通过二维数组创建,例如np.array([[1, 2], [3, 4]])。
Tensor(张量):
张量是NumPy中的高维数组,可以是三维、四维或更高维的数组。张量在深度学习和神经网络中经常使用。
多维数组:
np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]):创建一个三维数组,包含两个二维数组。
数组属性:
- shape:数组的维度信息,返回一个元组,例如(2, 3)表示2行3列的数组。
- dtype:数组元素的数据类型。
数组操作:
- indexing和slicing:通过索引和切片操作获取和修改数组元素。
- reshape:改变数组的形状。
- transpose:交换数组的维度。
数学运算:
- 加法、减法、乘法、除法等数学运算。
- 常用函数:例如
np.sum()
、np.mean()
、np.max()
等用于对数组进行统计计算。
除了基本的数据结构,NumPy还提供了很多高级功能,如广播(broadcasting)、向量化操作等,可以大大提高数据分析的效率。
使用NumPy进行数据分析时,通常还会结合其他库,如Pandas、Matplotlib等,以实现更强大的数据分析和可视化功能。
3.NumPy通用函数
NumPy(Numerical Python)是Python中用于科学计算和数据分析的重要库。它提供了许多通用函数(Universal Functions,简称ufuncs),用于对NumPy数组进行元素级别的操作和计算。以下是一些常用的NumPy通用函数及其功能:
数学函数:
-
np.abs(arr)
:计算数组元素的绝对值。 -
np.sqrt(arr)
:计算数组元素的平方根。 -
np.exp(arr)
:计算数组元素的指数。 -
np.log(arr)
:计算数组元素的自然对数。 -
np.sin(arr)
、np.cos(arr)
、np.tan(arr)
:计算数组元素的正弦、余弦和正切值。 -
np.arcsin(arr)
、np.arccos(arr)
、np.arctan(arr)
:计算数组元素的反正弦、反余弦和反正切值。
统计函数:
-
np.mean(arr)
:计算数组元素的平均值。 -
np.median(arr)
:计算数组元素的中位数。 -
np.std(arr)
:计算数组元素的标准差。 -
np.var(arr)
:计算数组元素的方差。 -
np.min(arr)
、np.max(arr)
:计算数组元素的最小值和最大值。 -
np.sum(arr)
:计算数组元素的总和。
逻辑函数:
-
np.logical_and(arr1, arr2)
:对两个数组进行逻辑与操作。 -
np.logical_or(arr1, arr2)
:对两个数组进行逻辑或操作。 -
np.logical_not(arr)
:对数组进行逻辑非操作。
形状操作函数:
-
np.reshape(arr, new_shape)
:改变数组的形状。 -
np.transpose(arr)
:交换数组的维度。 -
np.flatten(arr)
:将多维数组转换为一维数组。
其他函数:
-
np.concatenate((arr1, arr2), axis)
:沿指定轴连接两个或多个数组。 -
np.sort(arr)
:对数组进行排序。 -
np.unique(arr)
:返回数组中的唯一值。
这些通用函数可以对NumPy数组进行各种元素级别的操作和计算,提供了丰富的功能来处理和分析数据。通过熟练掌握这些函数,可以高效地进行数据分析和科学计算。
4.NumPy索引及切片
在NumPy中,索引和切片是对数组进行访问和操作的重要方式。以下是对NumPy数组进行索引和切片的详细分析:
索引:
- 一维数组索引:可以使用整数索引访问一维数组中的元素。例如,arr[0]表示访问一维数组arr中的第一个元素。
- 多维数组索引:可以使用逗号分隔的整数索引访问多维数组中的元素。例如,arr[0, 1]表示访问多维数组arr中的第一行第二列的元素。
切片:
- 一维数组切片:可以使用冒号(:)进行切片操作。例如,arr[1:4]表示从一维数组arr的索引1开始到索引4之前的元素(不包括索引4)。
- 多维数组切片:可以使用逗号分隔的冒号(:)进行切片操作。例如,arr[:, 1:4]表示从多维数组arr的所有行中,从索引1开始到索引4之前的列(不包括索引4)。
布尔索引:
可以使用布尔数组作为索引来选择满足特定条件的元素。例如,arr[arr > 5]表示选择数组arr中大于5的元素。
花式索引:
可以使用整数数组作为索引来选择指定位置的元素。例如,arr[[0, 2, 4]]表示选择数组arr中索引为0、2和4的元素。
需要注意的是,索引和切片操作返回的是原始数组的视图(view),而不是副本(copy)。这意味着对视图的修改会影响原始数组。如果需要创建副本,可以使用arr.copy()
方法。
5.NumPy随机数
在数据分析中,NumPy的random模块提供了生成随机数的函数,用于模拟随机实验、生成随机样本和进行随机抽样等操作。以下是NumPy中常用的随机数函数的详细分析:
生成随机数:
-
np.random.rand(shape)
:生成指定形状的[0, 1)之间的均匀分布随机数。 -
np.random.randn(shape)
:生成指定形状的标准正态分布(均值为0,标准差为1)的随机数。 -
np.random.randint(low, high, size)
:生成指定范围内的整数随机数。 -
np.random.random_sample(shape)
:生成指定形状的[0, 1)之间的均匀分布随机数。 -
np.random.random(shape)
:生成指定形状的[0, 1)之间的均匀分布随机数。 -
np.random.uniform(low, high, size)
:生成指定范围内的均匀分布随机数。 -
np.random.normal(loc, scale, size)
:生成指定均值和标准差的正态分布随机数。 -
np.random.standard_normal(size)
:生成标准正态分布(均值为0,标准差为1)的随机数。
随机抽样:
-
np.random.choice(a, size, replace, p)
:从给定的一维数组a中进行随机抽样。 -
np.random.shuffle(arr)
:对数组进行原地随机重排。 -
np.random.permutation(arr)
:返回一个随机重排的数组副本。
随机种子:
-
np.random.seed(seed)
:设置随机数生成器的种子,用于生成可重复的随机数序列。
这些随机数函数可以用于生成各种类型的随机数,满足不同的需求。通过灵活使用这些函数,可以进行模拟实验、生成随机样本、进行随机抽样等操作,支持数据分析和统计推断的应用。
6.NumPy数据的输入输出
在数据分析中,NumPy提供了多种方式来进行数据的输入和输出。以下是NumPy中常用的数据输入输出方式的详细解释:
从文件读取数据:
-
np.loadtxt(fname, delimiter=None, dtype=float)
:从文本文件中加载数据到NumPy数组。可以指定分隔符和数据类型。 -
np.genfromtxt(fname, delimiter=None, dtype=float)
:从文本文件中加载数据到NumPy数组,支持缺失值处理和数据类型推断。 -
np.fromfile(file, dtype=float, count=-1, sep='')
:从二进制文件中加载数据到NumPy数组。
将数据写入文件:
-
np.savetxt(fname, X, fmt='%.18e', delimiter=' ')
:将NumPy数组保存为文本文件。可以指定格式和分隔符。 -
np.savetxt(fname, X, fmt='%.18e', delimiter=' ', header='', footer='', comments='# ')
:将NumPy数组保存为文本文件,并添加头部、尾部和注释。
从CSV文件读取数据: -
np.genfromtxt(fname, delimiter=',', dtype=None, names=True)
:从CSV文件中加载数据到NumPy结构化数组。可以指定分隔符、数据类型和列名。
将数据写入CSV文件:
-
np.savetxt(fname, X, delimiter=',', fmt='%.18e', header='', footer='', comments='# ')
:将NumPy数组保存为CSV文件。可以指定分隔符、格式、头部、尾部和注释。
从数据库读取数据:
-
np.frombuffer(buffer, dtype=float, count=-1, offset=0)
:从缓冲区中加载数据到NumPy数组。 -
np.fromstring(string, dtype=float, count=-1, sep='')
:从字符串中加载数据到NumPy数组。
将数据写入数据库:
-
np.ndarray.tofile(fid, sep='', format='%s')
:将NumPy数组保存为二进制文件。
这些数据输入输出函数提供了灵活的方式来读取和写入数据,支持多种数据格式和数据源。通过使用这些函数,可以方便地进行数据的导入和导出,与其他数据源进行交互,并进行数据分析和处理。
二丶Pandas篇
1.pandas核心概念
在数据分析中,pandas是一个重要的Python库,提供了高效的数据结构和数据分析工具。以下是pandas的核心概念的详细解释:
Series(序列):
Series是pandas中的一维标记数组,类似于带有标签的一维数组。它由两个数组组成,一个用于存储数据,另一个用于存储标签(索引)。
Series可以通过多种方式创建,例如从列表、数组、字典等。
Series提供了许多方法和属性,用于对数据进行索引、切片、过滤、计算等操作。
DataFrame(数据框):
DataFrame是pandas中的二维表格数据结构,类似于电子表格或SQL中的表。它由行索引和列索引组成,每列可以是不同的数据类型。
DataFrame可以通过多种方式创建,例如从二维数组、字典、CSV文件等。
DataFrame提供了丰富的方法和属性,用于对数据进行索引、切片、过滤、计算、合并、重塑等操作。
Index(索引):
Index是pandas中的标签数组,用于标识Series或DataFrame中的行或列。
Index可以是整数、字符串、日期等类型,可以是唯一的或重复的。
Index提供了许多方法和属性,用于对索引进行操作和处理。
数据对齐:
pandas的一个重要特性是数据对齐,即在进行操作时,pandas会自动根据索引对数据进行对齐,确保数据的正确对应。
数据对齐使得在处理不完整或不规则数据时更加方便,可以避免许多错误和麻烦。
缺失数据处理:
pandas提供了灵活的方法来处理缺失数据,例如使用NaN(Not a Number)表示缺失值。
可以使用方法如isnull()
、notnull()
、dropna()
、fillna()
等来检测和处理缺失数据。
数据分组和聚合:
pandas提供了强大的数据分组和聚合功能,可以根据某些条件将数据分组,并对每个组进行聚合操作,如求和、平均值、计数等。
可以使用方法如groupby()
、agg()
、transform()
等来进行数据分组和聚合操作。
这些核心概念是pandas在数据分析中的基础,通过灵活运用这些概念和相应的方法,可以高效地进行数据处理、分析和建模。
2.数据结构series索引
在pandas中,Series是一种一维的数据结构,类似于带有标签的数组。Series具有两个主要的组成部分:数据和索引。以下是对pandas Series索引的详细解释:
索引标签:
Series的索引是一组标签,用于标识每个元素。索引可以是整数、字符串、日期等类型。
索引标签可以通过series.index
属性访问。
默认索引:
如果没有显式指定索引标签,pandas会自动创建一个默认的整数索引,从0开始递增。
默认索引可以通过series.index
属性访问。
自定义索引:
可以通过传递一个索引列表来创建自定义索引的Series。例如,series = pd.Series(data, index=['a', 'b', 'c'])
。
自定义索引可以是唯一的或重复的。
索引操作:
可以使用索引标签来访问Series中的元素。例如,series['a']
表示访问索引标签为'a'的元素。
可以使用整数索引来访问Series中的元素。例如,series[0]
表示访问索引为0的元素。
可以使用切片操作来访问Series中的多个元素。例如,series['a':'c']
表示访问索引标签从'a'到'c'的元素。
索引对齐:
在进行操作时,pandas会自动根据索引对Series进行对齐,确保数据的正确对应。
索引对齐使得在处理不完整或不规则数据时更加方便,可以避免许多错误和麻烦。
索引修改:
可以通过重新赋值的方式修改Series的索引。例如,series.index = ['x', 'y', 'z']
。
通过灵活运用Series的索引,可以方便地对数据进行访问、操作和分析。索引提供了一种标签化的方式来标识和定位数据,使得数据处理更加直观和高效。
3.series基础技巧
当进行数据分析时,pandas的Series是一个非常有用的数据结构。以下是一些常见的Series基础技巧的详细解释:
创建Series:
可以使用pd.Series(data, index)
函数创建Series,其中data可以是列表、数组、字典等,index是可选的索引标签。
例如,s = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
创建了一个带有自定义索引的Series。
访问Series数据:
可以使用索引标签或整数索引来访问Series中的元素。例如,s['a']或s[0]都可以访问第一个元素。
可以使用切片操作来访问Series中的多个元素。例如,s['a':'c']表示访问索引标签从'a'到'c'的元素。
Series运算:
可以对Series进行基本的数学运算,如加法、减法、乘法和除法。运算会根据索引对齐数据。
例如,s1 + s2会对两个Series对象进行元素级别的加法运算,并根据索引对齐数据。
筛选数据:
可以使用布尔索引来筛选Series中的数据。例如,s[s > 2]会返回满足条件的元素。
可以使用isin()
方法来筛选Series中包含在给定值列表中的元素。
缺失数据处理:
可以使用isnull()
和notnull()
方法来检测Series中的缺失数据。
可以使用dropna()
方法来删除Series中的缺失数据。
可以使用fillna()
方法来填充Series中的缺失数据。
排序和排名:
可以使用sort_values()
方法对Series进行排序。
可以使用rank()
方法对Series中的元素进行排名。
统计分析:
可以使用describe()
方法获取Series的统计摘要信息,如均值、标准差、最小值、最大值等。
可以使用sum()
、mean()
、median()
、std()
等方法计算Series的总和、平均值、中位数、标准差等。
这些基础技巧可以帮助您更好地使用pandas的Series进行数据分析和处理。通过灵活运用这些技巧,可以轻松地操作和分析Series中的数据。
4.数据结构Dataframe基本概念及创建
在数据分析中,pandas的DataFrame是一个二维的表格型数据结构,类似于电子表格或SQL中的表。DataFrame由行索引和列索引组成,每列可以是不同的数据类型。以下是对pandas DataFrame的基本概念和创建方式的详细解释:
DataFrame的基本概念:
DataFrame是一个二维的数据结构,由行和列组成。行索引用于标识和访问DataFrame中的行,列索引用于标识和访问DataFrame中的列。DataFrame中的每列可以是不同的数据类型,如整数、浮点数、字符串等。
创建DataFrame的方式:
从列表或数组创建:可以使用pd.DataFrame(data, index, columns)
函数从列表或数组创建DataFrame。其中data可以是列表、数组、字典等,index是行索引,columns是列索引。
-
从字典创建:可以使用
pd.DataFrame(dict)
函数从字典创建DataFrame。字典的键将成为列索引,字典的值将成为列数据。 -
从CSV文件创建:可以使用
pd.read_csv(file)
函数从CSV文件创建DataFrame。 -
从数据库查询结果创建:可以使用
pd.read_sql(query, connection)
函数从数据库查询结果创建DataFrame。
DataFrame的属性和方法:
-
df.shape
:返回DataFrame的行数和列数。 -
df.head(n)
:返回DataFrame的前n行,默认为5行。 -
df.tail(n)
:返回DataFrame的后n行,默认为5行。 -
df.columns
:返回DataFrame的列索引。 -
df.index
:返回DataFrame的行索引。 -
df.info()
:显示DataFrame的基本信息,包括列名、数据类型、非空值数量等。 -
df.describe()
:显示DataFrame的统计摘要信息,包括计数、均值、标准差、最小值、最大值等。
通过灵活运用这些创建DataFrame的方式和使用DataFrame的属性和方法,可以方便地进行数据分析和处理。DataFrame提供了丰富的功能和方法,支持数据的索引、切片、过滤、计算、合并、重塑等操作。
6.Dataframe索引
在pandas中,DataFrame是一个二维的表格型数据结构,由行索引和列索引组成。以下是对pandas DataFrame索引的详细解释:
行索引:
行索引用于标识和访问DataFrame中的行。默认情况下,行索引是从0开始的整数索引,可以通过df.index
属性访问。可以使用df.loc[label]
或df.iloc[index]
来访问具有特定标签或整数索引的行。
列索引:
列索引用于标识和访问DataFrame中的列。默认情况下,列索引是从0开始的整数索引,可以通过df.columns
属性访问。可以使用df[column]
或df.loc[:, column]
来访问具有特定列名的列。
自定义索引:
可以通过传递一个索引列表来创建自定义的行索引或列索引。例如,df = pd.DataFrame(data, index=['a', 'b', 'c'])
。自定义索引可以是唯一的或重复的。
多级索引:
多级索引是指在DataFrame中使用多个层次的行索引或列索引。可以使用pd.MultiIndex.from_arrays()
、pd.MultiIndex.from_tuples()
或pd.MultiIndex.from_product()
等函数创建多级索引。可以使用df.index
或df.columns
属性访问多级索引。
索引操作:
可以使用df.loc[row_indexer, column_indexer]
来访问具有特定行索引和列索引的数据。可以使用切片操作来访问DataFrame中的多行或多列。例如,df.loc['a':'c', 'x':'z']
表示访问行索引从'a'到'c'和列索引从'x'到'z'的数据。
重置索引:
可以使用df.reset_index()
方法重置行索引,将原来的行索引转换为默认的整数索引。可以使用df.set_index(keys)
方法设置新的行索引或列索引。通过灵活运用DataFrame的索引操作,可以方便地对数据进行访问、操作和分析。索引提供了一种标签化的方式来标识和定位数据,使得数据处理更加直观和高效
7.Dataframe基本技巧
在数据分析中,pandas的DataFrame是一个非常有用的数据结构。以下是一些常见的DataFrame基本技巧的详细解释:
访问DataFrame数据:
- 可以使用列名来访问DataFrame中的列数据。例如,
df['column_name']
可以访问名为'column_name'的列。 - 可以使用
df.loc[row_indexer, column_indexer]
来访问具有特定行索引和列索引的数据。 - 可以使用
df.iloc[row_indexer, column_indexer]
来使用整数索引访问数据。
列操作:
- 可以使用
df['new_column'] = value
来添加新的列,并为每个元素赋予相同的值。 - 可以使用
df.drop('column_name', axis=1)
来删除指定的列。 - 可以使用
df.rename(columns={'old_name': 'new_name'})
来重命名列。
行操作:
- 可以使用
df.loc[row_indexer]
来访问具有特定行索引的行数据。 - 可以使用
df.iloc[row_indexer]
来使用整数索引访问行数据。 - 可以使用
df.drop(row_indexer)
来删除指定的行。
筛选数据:
- 可以使用布尔索引来筛选DataFrame中的数据。例如,df[df['column'] > 0]会返回满足条件的行数据。
- 可以使用
df.isin(values)
来筛选DataFrame中包含在给定值列表中的行数据。
缺失数据处理:
- 可以使用
df.isnull()
和df.notnull()
方法来检测DataFrame中的缺失数据。 - 可以使用
df.dropna()
方法来删除DataFrame中的缺失数据。 - 可以使用
df.fillna(value)
方法来填充DataFrame中的缺失数据。
排序和排名:
- 可以使用
df.sort_values(by='column')
方法对DataFrame进行排序。 - 可以使用
df.rank()
方法对DataFrame中的元素进行排名。
统计分析:
- 可以使用
df.describe()
方法获取DataFrame的统计摘要信息,如计数、均值、标准差、最小值、最大值等。 - 可以使用
df.sum()
、df.mean()
、df.median()
、df.std()
等方法计算DataFrame的总和、平均值、中位数、标准差等。
这些基本技巧可以更好地使用pandas的DataFrame进行数据分析和处理。通过灵活运用这些技巧,可以轻松地操作和分析DataFrame中的数据。
8.时间模块
在数据分析中,pandas的时间模块提供了强大的时间序列处理功能。以下是pandas时间模块的一些常用功能和方法的详细解释:
时间戳(Timestamp):
时间戳表示某个具体的时间点,可以使用pd.Timestamp()
函数创建时间戳对象。时间戳可以用于表示日期、时间或日期时间。
时间范围(DatetimeIndex):
时间范围是一种特殊的索引类型,用于表示一段连续的时间序列。可以使用pd.date_range()
函数创建时间范围对象,指定起始日期、结束日期和频率。
时间序列数据(Series):
时间序列数据是指按照时间顺序排列的数据,可以使用时间戳或时间范围作为索引。可以使用pd.Series()
函数创建时间序列对象,指定数据和索引。
时间戳索引(DatetimeIndex):
- 时间戳索引是一种特殊的索引类型,用于按照时间顺序对数据进行索引和切片。
- 可以使用
pd.to_datetime()
函数将字符串转换为时间戳索引。 - 可以使用
df.set_index()
方法将时间戳索引设置为DataFrame的索引。
时间序列的重采样:
重采样是指将时间序列数据从一个频率转换为另一个频率的过程,如从日频率转换为月频率。可以使用resample()
方法对时间序列进行重采样,指定目标频率和聚合函数。
时间序列的偏移:
时间序列的偏移是指将时间序列按照一定的时间间隔进行移动的操作。可以使用shift()
方法对时间序列进行向前或向后的偏移。
时间序列的滚动窗口:
- 滚动窗口是指在时间序列上按照固定大小的窗口进行滑动,并对窗口内的数据进行聚合操作。
- 可以使用
rolling()
方法创建滚动窗口对象,然后使用聚合函数对窗口内的数据进行计算。 - 通过灵活运用pandas的时间模块,可以方便地处理和分析时间序列数据,进行时间相关的计算和操作。时间模块提供了丰富的功能和方法,支持时间戳的创建、时间范围的生成、时间序列的重采样、偏移和滚动窗口等操作。