Hola compañeros de este foro, vendo este día a pedir de su ayuda recien comienzo con python y se me vino la loquera de hacer un algoritmo un poco complicado en este lenguaje pero bueno la cuestión es, he usado varios lenguajes y por lo regular la lógica es similar en ellos sin embargo en python es un poco diferente esto en las iteraciones y la condiciones bien, concretamente necesito hacer un diccionarios con datos que tiene una llave auto incremental, y cada llave tiene un valor de tipo diccionario, y este a su vez contiene otra llave la cual es un nombre y de ahi su valor de este es de otro diccionario el cual su llave tiene es otro nombre, y al final su valor de esta ultima contiene un valor de punto flotante ,desde código se mira algo así:
Código:
variable = { 0 : { "nombre1" : { "subNombre1" : 0.0 } }, ... }
Y bien con esto pego mi código como lo estoy creando.
Código:
def entropy(self, column, values ):
entropyValue = 0.0
frequency = {}
index = 0
data = self.mixColumn(column,values)
namesClass = self.getTargetNames(values)
for i in data.values():
for dat,val in zip( i.keys(), i.values() ):
# Build the first array contrullo mi array
if not frequency :
frequency[index] = { dat : {val:0.0} }
elif not frequency[index].has_key(dat):
#if index <= self.objetiveNumberClass :
index += 1
frequency[index] = { dat : {val:0.0} }
elif not frequency[index][dat].has_key(val):
frequency[index] = { dat : {val:0.0} }
# creo que aqui viene mi problema
if (dat in frequency[index].keys()) and (val in frequency[index][dat].keys()) and (index in frequency.keys()) :
frequency[index][dat][val] += 1.0
print frequency
return entropyValue
La impresión me está dando lo siguiente
Código:
{0: {'Alta': {'no': 2.0}}, 1: {'Normal': {'si': 1.0}}, 2: {'Baja': {'no': 1.0}}, 3: {'Normal': {'si': 1.0}}, 4: {'Alta': {'si': 1.0}}, 5: {'Baja': {'si': 1.0}}, 6: {'Alta': {'si': 1.0}}, 7: {'Normal': {'si': 2.0}}, 8: {'Baja': {'no': 1.0}}}
pero lo que yo quiero es como el primer valor 0 : Alta : no : 2.0 , osea la suma de los valores repetidos
por ejemplo contar si "ALTA" , "no" existen 10 veces que me diera
Código:
{0: {'Alta': {'no': 10.0}}
Para esto se que debo buscar en el diccionario creado y si existe recuperar su id e incrementarlo en el ultimo paso, pero lamentablemente no encuentro el como, pues no entiendo aun la lógica de python, tengo 3 días usando python por eso me dirijo a ustedes si me pueden explicar como se debería encontrar en un diccionario como el que manejo.
dejo el código que uso para pruebas
Código:
class ID3:
def __init__(self):
return
def getTargetNames(self, column):
namesColumns = []
for name in set(column):
# i make a list with names of objetive column
namesColumns.append(name)
self.objetiveNameClass.append(name)
#
columnComplete={}
count = 0
for i in namesColumns:
columnComplete[i] = column.count(i)
#print columnComplete
self.objetiveNumberClass = len(self.objetiveNameClass)
#print(len(objetiveColumn))
#print(self.objetiveNumberClass)
return namesColumns
def mixColumn ( self, column, values):
j = 0
mix = {}
for i in column:
temp = values[j]
mix[j] = {i:temp}
j += 1
return mix
def main():
paColumn =
["Alta","Alta","Normal","Baja","Baja","Baja","Normal","Alta","Alta","Baja","Alta","Normal","Normal","Baja"]
objetiveColumn = ['no','no','si','si','si','no','si','no','si','si','si','si','si','no']
ID = ID3()
ID.entropy(paColumn,objetiveColumn)
if __name__ == '__main__':
main()
Sin necesitan más información se las brindare lo más rápido posible, gracias y espero me puedan apoyar.
Un Saludo.