如果给定条件,如何计算欧氏距离?

我有一些公司的样本,我想比较这些公司的财务数据。我的数据如下所示:



    Cusip9      Issuer                       IPO Year   Total Assets    Long-Term Debt  Sales      SIC-Code

1   783755101   Ryerson Tull Inc                1996    9322000.0        2632000.0      633000.0   3661

2   826170102   Siebel Sys Inc                  1996    995010.0         0.0            50250.0    2456

3   894363100   Travis Boats & Motors Inc       1996    313500.0         43340.0        23830.0    3661

4   159186105   Channell Commercial Corp        1996    426580.0         3380.0         111100.0   7483

5   742580103   Printware Inc                   1996    145750.0         0.0            23830.0    8473

我想为每家公司计算一个“相似度分数”。这个分数应该表明与其他公司的可比性。因此,我想用不同的财务数据来比较它们。可比性应表示为欧几里德距离,即财务数据与“最接近的公司”之间的平方差之和的平方根。所以我需要计算到符合这些条件的每家公司的距离,但只需要最接近的分数。公司 1 的资产减去公司 2 的资产加上债务公司 1 减去债务公司 2....


√((x_1-y_1 )^2+(x_2-y_2 )^2) 

这应该只针对具有相同 SIC 代码的公司进行计算,并且可比公司的 IPO 年份应该小于为其计算“相似度分数”的公司。我只想将这些公司与已经上市的公司进行比较。


希望我的观点得到明确。有人知道我可以从哪里开始吗?我刚开始编程,完全迷失了。


提前致谢。


拉丁的传说
浏览 122回答 3
3回答

慕的地8271018

我复制了您提供的数据,然后计算了距离。对于每个发行人,我找到最近的发行人及其距离。请参阅下面的修改代码。如果您需要更多详细信息,请告诉我。issuers = ["Ryerson Tull Inc", "Siebel Sys Inc", "Travis Boats & Motors Inc", "Channell Commercial Corp", "Printware Inc",           "AAA", "BBB", "ZZZ"]ttl_assets = [9322000.0, 995010.0, 313500.0, 426580.0, 145750.0, 299999.0, 399999.0, 123456.0]long_term_debt = [2632000.0, 0.0, 43340.0, 3380.0, 0.0, 11111.0, 22222.0, 87500.0]sic_code = [3661, 2456, 3661, 7483, 8473, 3661, 7483, 3661]ipo_year = [1996, 1996, 1996, 1996, 1996, 1996, 1996, 1997]data = pd.DataFrame({"issuer": issuers,                      "total assets": ttl_assets,                      "long term debt": long_term_debt,                     "SIC-Code": sic_code,                     "IPO Year": ipo_year                    })def get_distance(x1, x2):    """ computes euclidean distance between two points """    d = math.sqrt((x1[0] - x2[0])**2 + (x1[1] - x2[1])**2)    return round(d, 3)distMatrix = np.ndarray(shape=(len(data), len(data))) # creating an array to fill up the distancesdistMatrix[:, :] = np.inffor i in range(len(data)):    for j in range(len(data)):        if data.loc[i, "SIC-Code"] == data.loc[j, "SIC-Code"] and data.loc[i, "IPO Year"] == data.loc[j, "IPO Year"] and i != j:            issuer1 = data.loc[i, ["total assets", "long term debt"]].values            issuer2 = data.loc[j, ["total assets", "long term debt"]].values            distance = get_distance(issuer1, issuer2)            distMatrix[i, j] = distancelistIssuers = data["issuer"].tolist()arrMinDist = distMatrix.argmin(axis=0)dictMinDistIssuer = {} # dictionary that maps each issuer to its closest issuerdictMinDist = {} # maps each each issuer to the closest issuers distancedfDist = pd.DataFrame(distMatrix.tolist())dfDist.columns = listIssuersdfDist.insert(0, "issuer", listIssuers)dfDist.insert(1, "IPO Year", ipo_year)dfDist.insert(2, "SIC-Code", sic_code)for issuer_idx, min_idx in enumerate(arrMinDist):    distance_value_counts = np.where(distMatrix==np.inf, 0, 1).sum(axis=0) # this checks if there are any matches for each issuer    if distance_value_counts[issuer_idx] == 0:        dictMinDistIssuer[listIssuers[issuer_idx]] = np.nan        dictMinDist[listIssuers[issuer_idx]] = np.nan    else:        dictMinDistIssuer[listIssuers[issuer_idx]] = listIssuers[min_idx]        dictMinDist[listIssuers[issuer_idx]] = distMatrix[issuer_idx][min_idx]    dfDist["closest issuer"] = dfDist["issuer"].map(dictMinDistIssuer)dfDist["closest issuer dist"] = dfDist["issuer"].map(dictMinDist)dfDist.replace(to_replace=np.inf, value=np.nan, inplace=True)

红糖糍粑

SIC-Code考虑通过和 lesser对所有可能的配对将数据框与自身进行自连接IPO-Year。一定要避免反向重复。然后使用Numpy 数学和系列运算跨列运行简单的矢量化算术计算。不需要循环。

慕妹3242003

import numpy as npimport pandas as pd...# REMOVE SPACES AND HYPHENS IN COLUMNSdf.columns = df.columns.str.replace(r'[ -]', '_')&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# SELF JOIN AND AVOID REVERSE DUPLICATES WITH LESSER YEARdf = (df.merge(df, on=['SIC-Code'])&nbsp; &nbsp; &nbsp; &nbsp; .query("(Cusip9_x < Cusip9_y) & (Issuer_x < Issuer_y) & (IPO_Year_x < IPO_Year_y)")&nbsp; &nbsp; &nbsp;)# SIMILARITY SCORE CALCULATIONdf['similarity_score'] = np.sqrt((df['Total_Assets_x'] - df['Total_Assets_y']).pow(2) +&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(df['Long_Term_Debt_x'] - df['Long_Term_Debt_y']).pow(2))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python