使用Python中的矩阵格式计算我自己的相似度

2024-09-30 16:31:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv文件,它是国家之间交易的商品价值,类似这样:

Country  Comm  Value
 GER       1     200
 GER       2     300
 GER       45    354
 USA       2     100
 USA       85    500
 UK        2     240
 UK        85    900

我用这些数据创建了一个矩阵。在这个创建的矩阵中,行是国家,列是商品代码,每个元素都显示贸易价值。商品数量为97,我使用以下代码创建了该矩阵:

^{pr2}$

现在我要计算每对国家的指数得分(配对得分是:共同贸易总额超过每个国家的贸易总额)。 创建的矩阵具有如下形式:

Countries   Commodity1 Commodity2 Commodity45 Commodity85
 GER           200        300         45          0
 USA            0         100          0         500
 UK             0         240          0         900

首先,我想把两国正在进行贸易的同一种商品的总价值相加,然后除以这两个国家的贸易总额。例如,如果我们考虑GER-USA,他们都交易2号商品,所以我想把这些普通商品的总和(300+100) 德国和美国的贸易总额世界其他地区:200+300+354)+(第二排:100+500) 简而言之,如果我们考虑矩阵: 首先,我要计算GER和USA行的总值。 第二,计算所有正在交易的普通商品的价值 第三,将第二阶段的价值除以第一阶段的价值。 为此,我编写了以下代码:

for i in range(len(matrix_c1_products)):
    for j in range(i, len(matrix_c1_products)):
            dividend=sum([matrix_c1_products[i]])+sum([matrix_c1_products[j]])
        for k in matrix_c1_products[i]:
            for l in matrix_c1_products[j]:
              #  print k,l
                if int(k)==int(0):
                    pass
                if int(l)==int(0):
                    pass
                else:
                    commonone.append(k)
                    commontwo.append(l)
             divisor=sum(commonone)+sum(commontwo)
             shares=int(divisor/dividend)
             print shares, divisor, dividend

但是commonone列表有一个问题。我打算从两行中删除0并添加existence值,但由于循环的原因,相同的数字在列表中重复出现,结果不正确。 任何帮助都将不胜感激。在


Tags: infor矩阵交易国家matrix商品int
1条回答
网友
1楼 · 发布于 2024-09-30 16:31:35

作为一种更为python的方法,您可以首先创建一个行的字典,它可以通过以下dict理解来完成:

hart_dict={i[0]:map(int,i[1:]) for i in spamreader}
{' USA': [0, 100, 0, 500], ' GER': [200, 300, 45, 0], ' UK': [0, 240, 0, 900]}

然后使用itertools.combinations创建您的对:

^{pr2}$

然后计算商品的总和:

row_sums=[sum(map(int,i)) for i in z]
[200, 640, 45, 1400]

最后,你可以循环计算出你的预期结果。在

import csv
from itertools import combinations,izip

commodities=['Commodity1' ,'Commodity2', 'Commodity45' ,'Commodity85']
with open('ex.csv', 'rb') as csvfile:
    spamreader = list(csv.reader(csvfile, delimiter=','))
    chart_dict={i[0]:map(int,i[1:]) for i in spamreader}
    z=izip(*spamreader)
    capirs= list(combinations(next(z),2))
    row_sums=[sum(map(int,i)) for i in z]

    for i,j in capirs:
      for index,com in enumerate(commodities):
        print i,j,com,float(chart_dict[i][index]+chart_dict[j][index])/row_sums[index]

结果:

GER  USA Commodity1 1.0
 GER  USA Commodity2 0.625
 GER  USA Commodity45 1.0
 GER  USA Commodity85 0.357142857143
 GER  UK Commodity1 1.0
 GER  UK Commodity2 0.84375
 GER  UK Commodity45 1.0
 GER  UK Commodity85 0.642857142857
 USA  UK Commodity1 0.0
 USA  UK Commodity2 0.53125
 USA  UK Commodity45 0.0
 USA  UK Commodity85 1.0

相关问题 更多 >