如何基于双条件遍历DataFrame并计算企业相似度得分?
入门指导:计算企业相似度得分
需求梳理
你需要给每家企业计算相似度得分,核心规则如下:
- 仅与相同SIC-Code的企业对比
- 仅对比IPO Year更早的已上市企业
- 得分取该企业与「最相似企业」的欧氏距离(基于总资产、长期债务、销售额三个指标,公式:$\sqrt{(x₁-y₁)²+(x₂-y₂)²+(x₃-y₃)²}$,距离越小代表相似度越高)
给定样本数据
先把你的数据整理成清晰的表格形式:
| Cusip9 | Issuer | IPO Year | Total Assets | Long-Term Debt | Sales | SIC-Code |
|---|---|---|---|---|---|---|
| 783755101 | Ryerson Tull Inc | 1996 | 9322000.0 | 2632000.0 | 633000.0 | 3661 |
| 826170102 | Siebel Sys Inc | 1996 | 995010.0 | 0.0 | 50250.0 | 2456 |
| 894363100 | Travis Boats & Motors Inc | 1996 | 313500.0 | 43340.0 | 23830.0 | 3661 |
| 159186105 | Channell Commercial Corp | 1996 | 426580.0 | 3380.0 | 111100.0 | 7483 |
| 742580103 | Printware Inc | 1996 | 145750.0 | 0.0 | 23830.0 | 8473 |
注意:你的样本里所有企业IPO Year都是1996,按规则这些企业之间无法互相对比(没有更早上市的同SIC企业)。我会先基于这个数据写代码,再说明如何适配有不同IPO年份的真实数据。
入门级Python实现步骤
作为编程新手,我们用Python的pandas库处理表格数据(最适合新手的数据分析工具),搭配numpy计算欧氏距离。
步骤1:安装必要工具
打开终端(Windows用命令提示符,Mac/Linux用终端),输入以下命令安装依赖:
pip install pandas numpy
步骤2:编写代码(逐行注释)
新建一个名为similarity_score.py的文件,粘贴以下代码,每一步都有详细说明:
import pandas as pd import numpy as np # 1. 把你的数据转换成表格格式(DataFrame) data = { 'Cusip9': ['783755101', '826170102', '894363100', '159186105', '742580103'], 'Issuer': ['Ryerson Tull Inc', 'Siebel Sys Inc', 'Travis Boats & Motors Inc', 'Channell Commercial Corp', 'Printware Inc'], 'IPO Year': [1996, 1996, 1996, 1996, 1996], 'Total Assets': [9322000.0, 995010.0, 313500.0, 426580.0, 145750.0], 'Long-Term Debt': [2632000.0, 0.0, 43340.0, 3380.0, 0.0], 'Sales': [633000.0, 50250.0, 23830.0, 111100.0, 23830.0], 'SIC-Code': [3661, 2456, 3661, 7483, 8473] } df = pd.DataFrame(data) # 2. 定义计算欧氏距离的函数 def calculate_euclidean_distance(current, compare): # 提取三个财务指标值 current_values = np.array([current['Total Assets'], current['Long-Term Debt'], current['Sales']]) compare_values = np.array([compare['Total Assets'], compare['Long-Term Debt'], compare['Sales']]) # 用numpy自带函数计算欧氏距离,简洁高效 return np.linalg.norm(current_values - compare_values) # 3. 遍历每家企业,计算相似度得分 df['Similarity Score'] = None # 新增一列存储得分 for idx, current_row in df.iterrows(): # 筛选符合条件的对比企业:同SIC-Code,且IPO年份更早 eligible_companies = df[(df['SIC-Code'] == current_row['SIC-Code']) & (df['IPO Year'] < current_row['IPO Year'])] if eligible_companies.empty: # 没有符合条件的企业,得分设为None(也可以改成你需要的默认值,比如0) df.at[idx, 'Similarity Score'] = None else: # 计算当前企业与所有符合条件企业的距离 distances = [calculate_euclidean_distance(current_row, row) for _, row in eligible_companies.iterrows()] # 取最小距离作为相似度得分(距离越小,相似度越高) df.at[idx, 'Similarity Score'] = min(distances) # 4. 打印结果,只展示关键列 print("计算结果:") print(df[['Issuer', 'SIC-Code', 'IPO Year', 'Similarity Score']])
步骤3:运行代码
在终端进入代码所在文件夹,输入:
python similarity_score.py
结果说明
因为你的样本中所有企业IPO年份都是1996,所以所有企业的Similarity Score都是None。如果有企业IPO年份更早(比如某家企业是1995年上市),同SIC的1996年企业就会和它计算距离,取最小值作为得分。
新手实用小贴士
- 如果你的数据存在Excel/CSV文件中,可以用
pd.read_excel('你的文件路径.xlsx')或pd.read_csv('你的文件路径.csv')代替手动输入数据的部分,更高效。 - 如果你想让得分更直观(比如得分越高代表相似度越高),可以把得分改成
1/(1+最小距离),这样距离越小,得分越接近1,更容易理解。 - 后续如果需要处理大规模数据,可以把循环改成
pandas的向量化操作,速度会快很多,但作为入门,先掌握基础逻辑更重要。
内容的提问来源于stack exchange,提问作者user13924616
相关产品推荐
相关产品推荐

