Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python中的矩阵格式计算我自己的相似性分数_Python_Matrix_Sum - Fatal编程技术网

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

使用Python中的矩阵格式计算我自己的相似性分数,python,matrix,sum,Python,Matrix,Sum,我有一个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 Countries Commodity1 Commodity2 Commodity45 Commod

我有一个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
Countries   Commodity1 Commodity2 Commodity45 Commodity85
 GER           200        300         45          0
 USA            0         100          0         500
 UK             0         240          0         900
我用这些数据创建了一个矩阵。在这个创建的矩阵中,行是国家,列是商品代码,每个元素显示贸易价值。商品的数量是97,我使用以下代码创建该矩阵:

rfile = open('file path','r')
rfile.next()
dic_c1_products = {}
for i in rfile :
    lns = i.strip().split(',')
    c1 = lns[0]
    p = lns[1]
    value= lns[2]
    if not dic_c1_products.has_key(c1):
        dic_c1_products[c1] = [(p,value),]
    else:
        dic_c1_products[c1].append((p,value))
 product_count  = 97
 c1_list = dic_c1_products.keys()
 matrix_c1_products = [[0 for col in range(int(product_count)+1)] for row     in range(len(c1_list))]
 for c1 in dic_c1_products:
      for p, v in dic_c1_products[c1]:
           matrix_c1_products[c1_list.index(c1)][int(p)] = int(v)
 print 'Matirix Done'
现在我想为每对国家计算一个指数分数(这对分数是:共同贸易总额超过每个国家的贸易总额)。 创建的矩阵具有如下形式:

Country  Comm  Value
 GER       1     200
 GER       2     300
 GER       45    354
 USA       2     100
 USA       85    500
 UK        2     240
 UK        85    900
Countries   Commodity1 Commodity2 Commodity45 Commodity85
 GER           200        300         45          0
 USA            0         100          0         500
 UK             0         240          0         900
首先我想把两国贸易的相同商品的总价值加起来,然后把这个数字除以两国的贸易总额。例如,如果我们考虑GEL -美国,他们都交易商品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列表存在一个问题。我打算从两行中删除零并添加存在值,但由于循环,相同的数字在列表中重复,结果不正确。
如果您有任何帮助,我们将不胜感激。

作为一种更具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创建配对。组合

capirs= list(combinations(next(z),2))
[(' GER', ' USA'), (' GER', ' UK'), (' USA', ' UK')]
然后计算商品的总和:

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

最后,我想得到所有对的分数,例如GER-USA、USA-UK和GER-UK,如果我想更好地澄清,GER-USA和USA-UK的SCOR将是:GER-USA=(300+100)/{(200+300+45)+(100+500)}=0.27,USA-UK=(100+500+240+900)/{(100+500)+(240+900)}=1@homayoun如果你想除以每个国家所有商品的总和,你可以在
hart\u dict
中除以每个键(国家名称)对应值的总和。谢谢你的帮助,但我认为这是一个误解。我想把自己限制在两个国家,计算他们的分数,然后对另外两个国家做同样的事情。这样,如果我们有3个国家,我们将有6个分数和3个不同的分数。我还更新了脚本的最后一部分,也许现在更清楚了。