You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于双条件遍历DataFrame并计算企业相似度得分?

入门指导:计算企业相似度得分

需求梳理

你需要给每家企业计算相似度得分,核心规则如下:

  • 仅与相同SIC-Code的企业对比
  • 仅对比IPO Year更早的已上市企业
  • 得分取该企业与「最相似企业」的欧氏距离(基于总资产、长期债务、销售额三个指标,公式:$\sqrt{(x₁-y₁)²+(x₂-y₂)²+(x₃-y₃)²}$,距离越小代表相似度越高)

给定样本数据

先把你的数据整理成清晰的表格形式:

Cusip9IssuerIPO YearTotal AssetsLong-Term DebtSalesSIC-Code
783755101Ryerson Tull Inc19969322000.02632000.0633000.03661
826170102Siebel Sys Inc1996995010.00.050250.02456
894363100Travis Boats & Motors Inc1996313500.043340.023830.03661
159186105Channell Commercial Corp1996426580.03380.0111100.07483
742580103Printware Inc1996145750.00.023830.08473

注意:你的样本里所有企业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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:57:49