在 Pandas 数据框中评估/排名
Evaluating / ranking in Pandas dataframe
我有 Pandas DataFrame,我在其中导入了 Excel 包含数百行的电子表格。每行是一个公司名称,每列中都有一些基本数据,例如比率等。
Symbol Name P/BV PE NCB
A AGT 4.382 42.59 0.0145
AAAP AdvAc 6.91 NaN -0.0003
AAME AtlAm 0.6205 29.55 0.0089
AAN Aaron 2.093 23.89 0.0213
等列多了,行多了,但我觉得这足以说明数据了。有时没有比率值,因此自动填充 NaN 值。
我想做的是评估每个公司:
每一列(例如 P/BV)是一个包含从最低到最高值的范围 - 创建 100% 的范围。每家公司都将在新列中进行评估:我想为每家公司分配 1 到 100 的百分位排名。如果公司的 P/BV 比率处于宇宙中最低的 1%,则它获得排名 100(因为最低的是最好在这里)。最高比率获得排名 1。
如果缺少一个值 - 存在 NaN - 分配排名 50
我需要像这样评估每一列,所以我需要为每个比率列创建新列并用排名值填充它。
某些比率在其值最高时是最佳的,例如 NCB 列。
稍后我会在最后一列中添加每个公司的所有排名值,我可以管理。我就是无法让这个排名发挥作用。有人可以帮助我吗?
提前谢谢你:-)
这是一个使用类似数据的示例。在这个例子中:
- 低 P/B & PE 获得高排名(逆排名)
- 缺失值占 50%(第 50 个百分位数)
- 高 MCV 获得高排名(直接排名)
示例数据帧:
Symbol P_BV PE NCB
0 A -0.59587 42.50 -1.42680
1 B 0.09875 NaN -0.82033
2 C 0.10987 29.55 0.73841
3 D 3.03278 23.89 -0.31283
4 E 0.70129 10.00 -1.00830
现在使用带有参数 pct=True
的 DataFrame.rank
。稍微耗时的部分是您需要将它分别应用于不同的列,因为您想要对一些升序和一些降序进行排名。
new_df = df.copy()
new_df.loc[:, ['P_BV', 'PE']] = (df[['P_BV', 'PE']]
.rank(pct=True, ascending=False) * 100)
new_df.loc[:, 'NCB'] = df['NCB'].rank(pct=True) * 100 # ascending=True
最后,用 50:
填充 NaN
个值
new_df.fillna(value=50., inplace=True)
您的结果如下所示:
Symbol P_BV PE NCB
0 A 100.0 25.0 20.0
1 B 80.0 50.0 60.0
2 C 60.0 50.0 100.0
3 D 20.0 75.0 80.0
4 E 40.0 100.0 40.0
您需要的组合代码:
new_df = df.copy()
new_df.loc[:, ['P_BV', 'PE']] = (df[['P_BV', 'PE']]
.rank(pct=True, ascending=False) * 100)
new_df.loc[:, 'NCB'] = df['NCB'].rank(pct=True) * 100 # ascending=True
new_df.fillna(value=50., inplace=True)
我有 Pandas DataFrame,我在其中导入了 Excel 包含数百行的电子表格。每行是一个公司名称,每列中都有一些基本数据,例如比率等。
Symbol Name P/BV PE NCB
A AGT 4.382 42.59 0.0145
AAAP AdvAc 6.91 NaN -0.0003
AAME AtlAm 0.6205 29.55 0.0089
AAN Aaron 2.093 23.89 0.0213
等列多了,行多了,但我觉得这足以说明数据了。有时没有比率值,因此自动填充 NaN 值。
我想做的是评估每个公司:
每一列(例如 P/BV)是一个包含从最低到最高值的范围 - 创建 100% 的范围。每家公司都将在新列中进行评估:我想为每家公司分配 1 到 100 的百分位排名。如果公司的 P/BV 比率处于宇宙中最低的 1%,则它获得排名 100(因为最低的是最好在这里)。最高比率获得排名 1。
如果缺少一个值 - 存在 NaN - 分配排名 50
我需要像这样评估每一列,所以我需要为每个比率列创建新列并用排名值填充它。
某些比率在其值最高时是最佳的,例如 NCB 列。
稍后我会在最后一列中添加每个公司的所有排名值,我可以管理。我就是无法让这个排名发挥作用。有人可以帮助我吗?
提前谢谢你:-)
这是一个使用类似数据的示例。在这个例子中:
- 低 P/B & PE 获得高排名(逆排名)
- 缺失值占 50%(第 50 个百分位数)
- 高 MCV 获得高排名(直接排名)
示例数据帧:
Symbol P_BV PE NCB
0 A -0.59587 42.50 -1.42680
1 B 0.09875 NaN -0.82033
2 C 0.10987 29.55 0.73841
3 D 3.03278 23.89 -0.31283
4 E 0.70129 10.00 -1.00830
现在使用带有参数 pct=True
的 DataFrame.rank
。稍微耗时的部分是您需要将它分别应用于不同的列,因为您想要对一些升序和一些降序进行排名。
new_df = df.copy()
new_df.loc[:, ['P_BV', 'PE']] = (df[['P_BV', 'PE']]
.rank(pct=True, ascending=False) * 100)
new_df.loc[:, 'NCB'] = df['NCB'].rank(pct=True) * 100 # ascending=True
最后,用 50:
填充NaN
个值
new_df.fillna(value=50., inplace=True)
您的结果如下所示:
Symbol P_BV PE NCB
0 A 100.0 25.0 20.0
1 B 80.0 50.0 60.0
2 C 60.0 50.0 100.0
3 D 20.0 75.0 80.0
4 E 40.0 100.0 40.0
您需要的组合代码:
new_df = df.copy()
new_df.loc[:, ['P_BV', 'PE']] = (df[['P_BV', 'PE']]
.rank(pct=True, ascending=False) * 100)
new_df.loc[:, 'NCB'] = df['NCB'].rank(pct=True) * 100 # ascending=True
new_df.fillna(value=50., inplace=True)