Я создаю модель, чтобы увидеть, как элемент кортежа перебирается на другие кортежи в списке.
Для примера
[(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
import pandas as pd import numpy как np из импортных комбинаций itertools из коллекций import Counter import numpy as np import scipy.sparse as ss np.seterr(divide = '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)
Вы могли бы сделать что-то вроде этого:
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",