создать матрицу со ссылками - PullRequest
0 голосов
/ 15 октября 2018

Я создаю модель, чтобы увидеть, как элемент кортежа перебирает другие кортежи в списке.

Для экземпляра

EmployerEmployeeEdges = [(12,a), (12,c), (12,d), (14,e), (14,a), (13, a), (13,b), (13,d), (13,c), (16,b),(16,b) ]

Цель состоит в том, чтобы сопоставить, например, скажем, 12 в кортеже с 1 по 12 в кортеже 2 и, если они соответствуют числу.Матч считается «Ссылка».Мне нужно положить количество этих ссылок в матрицу.

Например:

   a  b  c  d  e 
a  0     1  2  2
b    0
c  1    0   0
d    0     0
e  1           0

У меня есть следующий код

from collections import defaultdict

импорт панд как pd импорт numpy как np из itertools импортные комбинации из коллекций import Counter import numpy asnp import scipy.sparse as ss np.seterr (split = 'ignore', invalid = 'ignore')

тестовые данные

year= [2001, 2002, 2002, 2005, 2002, 2004, 2001, 2001, 2002, 2003, 2003, 2002, 2004, 2005, 2003, 2004, 2005, 2004, 2004, 2002, 2001, 2001]
indviduals= [12, 23, 12, 24, 28,30, 15, 17, 18, 18, 19, 12, 15, 12, 12, 12, 15, 15, 15, 12, 12, 15, 200, 200]
employers= ['a', 'b', 'b','c', 'd', 'e', 'a', 'a', 'b', 'b', 'c', 'b', 'a', 'c', 'e', 'a', 'a', 'a', 'a', 'b', 'a', 'a', 'b']

employerEmployeeEdges=[]
for j in np.unique(year):
    """generates the count of employees per employer per year"""
    #print("year",j)
    d = dict.fromkeys(employers, ())
    cond_year = j
    for i,e,y in zip(indviduals, employers, year):
        if y == cond_year:
            d[e] = d[e] + (i,)

    #print(d, [len(v) for k, v in d.items()]) # if I want to print all the employers and employee per year 

    for k, v in d.items():
        if len(v)>1:
            """I am gonna have to ignore if there are no values for that specific employer. 
            Zero employees means nothing for that year"""
            #print(j,k)
            for item in v:
                #print(item, "item")
                #print(j, item, k)
                edges = (item, k)
                edges=edges
                #print(edges, type(edges))
                employerEmployeeEdges.append(edges) # create a list of employees employer edge for all years


print("employees employer edges", [i for i in employerEmployeeEdges]) # list of possible links between employee and employer 
employersNew=[i[1] for i in employerEmployeeEdges]
# print("dfd",employersNew)
n = len([i[1] for i in employerEmployeeEdges])
Q = np.zeros((n, n), dtype=int)

for firstLink in  employerEmployeeEdges:
    for secondLink in employerEmployeeEdges[1:]: #potential second link where the combination is possible. 
        if firstLink[0]==secondLink[0]:
            print(firstLink[1], secondLink[1])
# #             print(firstLink, secondLink)
# #             break
#         from_node, to_node=firstLink[1],secondLink[1] #check where did the employee go? 

#         indx, jdx= employersNew.index(from_node), employersNew[1:].index(to_node)

#         Q[indx, jdx]=0
#         print(Q)
# #print(len(employerEmployeeEdges))
# #print(Q)

Этот вывод не даст мне желаемого результата.Как бы я подсчитал количество ссылок на матрице?

Далее, я хочу использовать Матрицу Q для вычисления вероятности следующим образом:

# P=np.empty((n,n))
# #print(P)
# for i in range(n):
#     #print(i)
#     P[i, :] = Q[i, :] / Q[i, :].sum()

# #print(P)

1 Ответ

0 голосов
/ 15 октября 2018

Вы можете сделать что-то вроде этого:

employerEmployeeEdges= np.array([(12,'a'), (12,'c'), (12,'d'), (14,'e'), (14,'a'),
(13, 'a'), (13,'b'), (13,'d'), (13,'c'), (16,'b'),(16,'b') ])

unique_employee = np.unique(employerEmployeeEdges[:,1])
n_unique = len(unique_employee)

Q = np.zeros([n_unique,n_unique])

for n, employer_employee in enumerate(employerEmployeeEdges):
   #copy the array for the original o be intact
   eee = np.copy(employerEmployeeEdges)
   #sustitue the current tuple with a empty one to avoid self comparing
   eee[n] = (None,None)

   #get the index for the current employee, the one on the y axis
   employee_index = np.where(employer_employee[1] == unique_employee)

   #get the indexes where the the employees letter match
   eq_index = np.where(eee[:,0] == employer_employee[0])[0]
   eq_employee = eee[eq_index,1]

   #add at the final array Q by index
   for emp in eq_employee:

      emp_index = np.where(unique_employee == emp)
      Q[employee_index,emp_index]+= 1

print(Q)

Этот код дает следующий ответ:

[[0. 1. 2. 2. 1.]
 [1. 2. 1. 1. 0.]
 [2. 1. 0. 2. 0.]
 [2. 1. 2. 0. 0.]
 [1. 0. 0. 0. 0.]]

Имейте в виду, что Q [0,0] является 'a:a 'и Q [-1, -1] это' e: e '

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...