Python 金融交易实用指南(二)(1)https://developer.aliyun.com/article/1523755
对 DataFrame 进行排序值和排列值顺序
首先,让我们创建一个具有整数行索引、整数列名和随机值的 DataFrame:
import numpy as np df = pd.DataFrame(np.random.randn(5,5), index=np.random.randint(0, 100, size=5), columns=np.random.randint(0,100,size=5)); df
DataFrame 包含以下数据:
87 79 74 3 61 7 0.355482 -0.246812 -1.147618 -0.293973 -0.560168 52 1.748274 0.304760 -1.346894 -0.548461 0.457927 80 -0.043787 -0.680384 1.918261 1.080733 1.346146 29 0.237049 0.020492 1.212589 -0.462218 1.284134 0 -0.153209 0.995779 0.100585 -0.350576 0.776116
pandas.DataFrame.sort_index(...)
按索引值对 DataFrame 进行排序:
df.sort_index()
结果如下:
87 79 74 3 61 0 -0.153209 0.995779 0.100585 -0.350576 0.776116 7 0.355482 -0.246812 -1.147618 -0.293973 -0.560168 29 0.237049 0.020492 1.212589 -0.462218 1.284134 52 1.748274 0.304760 -1.346894 -0.548461 0.457927 80 -0.043787 -0.680384 1.918261 1.080733 1.346146
我们也可以通过指定 axis
参数按列名值进行排序:
df.sort_index(axis=1)
这产生了以下按顺序排列的 DataFrame:
3 61 74 79 87 7 -0.293973 -0.560168 -1.147618 -0.246812 0.355482 52 -0.548461 0.457927 -1.346894 0.304760 1.748274 80 1.080733 1.346146 1.918261 -0.680384 -0.043787 29 -0.462218 1.284134 1.212589 0.020492 0.237049 0 -0.350576 0.776116 0.100585 0.995779 -0.153209
要对 DataFrame 中的值进行排序,我们使用 pandas.DataFrame.sort_values(...)
方法,该方法采用 by=
参数指定要按其排序的列:
df.sort_values(by=df.columns[0])
这产生了以下按第一列值排序的 DataFrame:
87 79 74 3 61 0 -0.153209 0.995779 0.100585 -0.350576 0.776116 80 -0.043787 -0.680384 1.918261 1.080733 1.346146 29 0.237049 0.020492 1.212589 -0.462218 1.284134 7 0.355482 -0.246812 -1.147618 -0.293973 -0.560168 52 1.748274 0.304760 -1.346894 -0.548461 0.457927
pandas.DataFrame.rank(...)
方法产生一个包含每列值的排名/顺序的 DataFrame:
df.rank()
输出包含值的排名(按升序):
87 79 74 3 61 7 4.0 2.0 2.0 4.0 1.0 52 5.0 4.0 1.0 1.0 2.0 80 2.0 1.0 5.0 5.0 5.0 29 3.0 3.0 4.0 2.0 4.0 0 1.0 5.0 3.0 3.0 3.0
本课程完成后,在下一节中,我们将对 DataFrame 执行算术运算。
DataFrame 上的算术操作
首先,让我们为我们的示例创建两个 DataFrames:
df1 = pd.DataFrame(np.random.randn(3,2), index=['A', 'C', 'E'], columns=['colA', 'colB']); df1
df1
DataFrame 包含以下内容:
colA colB A 0.519105 -0.127284 C -0.840984 -0.495306 E -0.137020 0.987424
现在我们创建df2
DataFrame:
df2 = pd.DataFrame(np.random.randn(4,3), index=['A', 'B', 'C', 'D'], columns=['colA', 'colB', 'colC']); df2
这包含以下内容:
colA colB colC A -0.718550 1.938035 0.220391 B -0.475095 0.238654 0.405642 C 0.299659 0.691165 -1.905837 D 0.282044 -2.287640 -0.551474
我们可以将两个 DataFrame 相加。请注意它们具有不同的索引值以及不同的列:
df1 + df2
输出是元素的总和,如果索引和列存在于两个 DataFrame 中,则为 NaN:
colA colB colC A -0.199445 1.810751 NaN B NaN NaN NaN C -0.541325 0.195859 NaN D NaN NaN NaN E NaN NaN NaN
我们可以使用pandas.DataFrame.add(...)
方法并带有fill_value=
参数指定一个值来替代NaN
(在这种情况下是0
):
df1.add(df2, fill_value=0)
输出如下所示:
colA colB colC A -0.199445 1.810751 0.220391 B -0.475095 0.238654 0.405642 C -0.541325 0.195859 -1.905837 D 0.282044 -2.287640 -0.551474 E -0.137020 0.987424 NaN
我们还可以在 DataFrame 和 Series 之间执行算术操作:
df1 - df2[['colB']]
这个操作的输出如下(因为右侧只有colB
):
colA colB A NaN -2.065319 B NaN NaN C NaN -1.186471 D NaN NaN E NaN NaN
现在让我们学习如何将多个 DataFrame 合并和组合成一个单独的 DataFrame。
将多个 DataFrame 合并和组合成一个 DataFrame
让我们首先创建两个 DataFrame,df1
和 df2
:
df1.index.name = 'Index'; df1.columns.name = 'Columns'; df1
df1
DataFrame 包含以下数据:
Columns colA colB Index A 0.519105 -0.127284 C -0.840984 -0.495306 E -0.137020 0.987424
现在我们创建df2
:
df2.index.name = 'Index'; df2.columns.name = 'Columns'; df2
df2
DataFrame 包含以下数据:
Columns colA colB colC Index A -0.718550 1.938035 0.220391 B -0.475095 0.238654 0.405642 C 0.299659 0.691165 -1.905837 D 0.282044 -2.287640 -0.551474
pandas.merge(...)
方法连接/合并两个 DataFrames。left_index=
和right_index=
参数指示合并应该在两个 DataFrames 的索引值上执行:
pd.merge(df1, df2, left_index=True, right_index=True)
这产生了以下合并后的 DataFrame。_x
和 _y
后缀用于区分左右两个 DataFrame 中具有相同名称的列:
Columns colA_x colB_x colA_y colB_y colC Index A 0.519105 -0.127284 -0.718550 1.938035 0.220391 C -0.840984 -0.495306 0.299659 0.691165 -1.905837
我们可以使用suffixes=
参数指定自定义后缀:
pd.merge(df1, df2, left_index=True, right_index=True, suffixes=('_1', '_2'))
结果是带有我们提供的后缀的以下 DataFrame:
Columns colA_1 colB_1 colA_2 colB_2 colC Index A 0.519105 -0.127284 -0.718550 1.938035 0.220391 C -0.840984 -0.495306 0.299659 0.691165 -1.905837
我们可以使用how=
参数指定连接的行为(外部、内部、左连接或右连接):
pd.merge(df1, df2, left_index=True, right_index=True, suffixes=('_1', '_2'), how='outer')
这会产生以下带有NaNs
的 DataFrame,用于缺失值:
Columns colA_1 colB_1 colA_2 colB_2 colC Index A 0.519105 -0.127284 -0.718550 1.938035 0.220391 B NaN NaN -0.475095 0.238654 0.405642 C -0.840984 -0.495306 0.299659 0.691165 -1.905837 D NaN NaN 0.282044 -2.287640 -0.551474 E -0.137020 0.987424 NaN NaN NaN
pandas DataFrame 本身具有pandas.DataFrame.merge(...)
方法,其行为方式相同:
df1.merge(df2, left_index=True, right_index=True, suffixes=('_1', '_2'), how='outer')
这会产生以下结果:
Columns colA_1 colB_1 colA_2 colB_2 colC Index A 0.519105 -0.127284 -0.718550 1.938035 0.220391 B NaN NaN -0.475095 0.238654 0.405642 C -0.840984 -0.495306 0.299659 0.691165 -1.905837 D NaN NaN 0.282044 -2.287640 -0.551474 E -0.137020 0.987424 NaN NaN NaN
另一种选择是pandas.DataFrame.join(...)
方法:
df1.join(df2, lsuffix='_1', rsuffix='_2')
并且连接的输出(默认为左连接)如下所示:
Columns colA_1 colB_1 colA_2 colB_2 colC Index A 0.519105 -0.127284 -0.718550 1.938035 0.220391 C -0.840984 -0.495306 0.299659 0.691165 -1.905837 E -0.137020 0.987424 NaN NaN NaN
pandas.concat(...)
方法通过将行连接在一起来组合 DataFrame:
pd.concat([df1, df2])
这会产生以下带有NaNs
的连接 DataFrame:
colA colB colC Index A 0.519105 -0.127284 NaN C -0.840984 -0.495306 NaN E -0.137020 0.987424 NaN A -0.718550 1.938035 0.220391 B -0.475095 0.238654 0.405642 C 0.299659 0.691165 -1.905837 D 0.282044 -2.287640 -0.551474
我们可以通过指定axis=
参数在列之间进行连接:
pd.concat([df1, df2], axis=1)
这会产生以下带有来自df2
的额外列的 DataFrame:
Columns colA colB colA colB colC A 0.519105 -0.127284 -0.718550 1.938035 0.220391 B NaN NaN -0.475095 0.238654 0.405642 C -0.840984 -0.495306 0.299659 0.691165 -1.905837 D NaN NaN 0.282044 -2.287640 -0.551474 E -0.137020 0.987424 NaN NaN NaN
现在我们将学习分层索引。
分层索引
到目前为止,我们一直在处理的索引对象都是一个简单的单个值。分层索引使用MultiIndex
对象,它是每个索引的多个值的元组。这使我们能够在单个 DataFrame 内创建子 DataFrame。
让我们创建一个MultiIndex
DataFrame:
df = pd.DataFrame(np.random.randn(10, 2), index=[list('aaabbbccdd'), [1, 2, 3, 1, 2, 3, 1, 2, 1, 2]], columns=['A', 'B']); df
这是使用分层索引的MultiIndex
DataFrame 的布局:
A B a 1 0.289379 -0.157919 2 -0.409463 -1.103412 3 0.812444 -1.950786 b 1 -1.549981 0.947575 2 0.344725 -0.709320 3 1.384979 -0.716733 c 1 -0.319983 0.887631 2 -1.763973 1.601361 d 1 0.171177 -1.285323 2 -0.143279 0.020981
我们可以使用pandas.MultiIndex.names
属性为MultiIndex
对象分配名称 - 它需要一个名称列表,其维度与MultiIndex
DataFrame 的维度相同(在本例中为两个元素):
df.index.names = ['alpha', 'numeric']; df
这会得到以下结果:
A B alpha numeric a 1 0.289379 -0.157919 2 -0.409463 -1.103412 3 0.812444 -1.950786 ...
pandas.DataFrame.reset_index(...)
方法默认情况下从MultiIndex
DataFrame 中移除所有索引级别,但可以用于移除一个或多个级别:
df.reset_index()
这导致以下整数索引 DataFrame 以及MultiIndex
值被添加为此 DataFrame 的列:
alpha numeric A B 0 a 1 0.289379 -0.157919 1 a 2 -0.409463 -1.103412 2 a 3 0.812444 -1.950786 ...
pandas.DataFrame.unstack(...)
方法的行为类似,并将内部索引的级别旋转并将其转换为列:
df.unstack()
让我们检查新的 DataFrame,其中最内层的索引级别[1, 2, 3]
变为列:
A B numeric 1 2 3 1 2 3 alpha a 0.289379 -0.409463 0.812444 -0.157919 -1.103412 -1.950786 b -1.549981 0.344725 1.384979 0.947575 -0.709320 -0.716733 c -0.319983 -1.763973 NaN 0.887631 1.601361 NaN d 0.171177 -0.143279 NaN -1.285323 0.020981 NaN
pandas.DataFrame.stack(...)
方法的作用与unstack(...)
相反:
df.stack()
输出 DataFrame 是具有分层索引的原始 DataFrame:
alpha numeric a 1 A 0.289379 B -0.157919 2 A -0.409463 B -1.103412 3 A 0.812444 B -1.950786 ... dtype: float64
让我们检查MultiIndex
DataFrame 的结构。请注意,我们首先调用pandas.DataFrame.stack(...)
将列[A, B]
转换为MultiIndex
DataFrame 中的第三个索引级别:
df.stack().index
这给我们一个具有三个索引级别的MultiIndex
对象:
MultiIndex(levels=[['a', 'b', 'c', 'd'], [1, 2, 3], ['A', 'B']], labels=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3], [0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 0, 0, 1, 1], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]], names=['alpha', 'numeric', None])
现在我们将学习如何在 DataFrames 中进行分组操作。
Python 金融交易实用指南(二)(3)https://developer.aliyun.com/article/1523758