Foros del Web » Programando para Internet » Python »

Diccionarios Dentro de Diccionarios

Estas en el tema de Diccionarios Dentro de Diccionarios en el foro de Python en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 21/06/2010, 18:15
 
Fecha de Ingreso: abril-2009
Mensajes: 26
Antigüedad: 14 años, 11 meses
Puntos: 1
Diccionarios Dentro de Diccionarios

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.
  #2 (permalink)  
Antiguo 22/06/2010, 22:22
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Diccionarios Dentro de Diccionarios

????? Tratando de leer el código, corrigiendole errores, identanlodo correctamente, creo que lo mejor sera preguntarte.

1.- Cual es el problema en el código?
2.- Que problema estas tratando de resolver? (a la mejor existe otra manera es mas fácil de resolverlo que usando varios diccionarios anidados en listas)
3.- Si fueras mas concreto en las preguntas te resolvería mas rápido el problema.

Aquí dejo el código algo corregido:
Código Python:
Ver original
  1. def entropy(self, column, values ):
  2.         entropyValue = 0.0
  3.         frequency = {}
  4.         index = 0
  5.         data = self.mixColumn(column,values)
  6.         namesClass = self.getTargetNames(values)
  7.         for i in data.values():
  8.             for dat,val in zip( i.keys(), i.values() ):
  9.                 # Build the first array  contrullo mi array
  10.                 if not frequency :
  11.                     frequency[index] = { dat : {val:0.0} }
  12.                 elif not frequency[index].has_key(dat):
  13.                     #if index <= self.objetiveNumberClass :
  14.                     index += 1
  15.                     frequency[index] = { dat : {val:0.0} }
  16.                 elif not frequency[index][dat].has_key(val):
  17.                     frequency[index] = { dat : {val:0.0} }
  18.                 # creo que aqui viene mi problema
  19.                 if (dat in frequency[index].keys()) and (val in frequency[index][dat].keys()) and (index in frequency.keys()) :
  20.                     frequency[index][dat][val] += 1.0
  21.                        
  22.         print frequency    
  23.         return entropyValue
  #3 (permalink)  
Antiguo 23/06/2010, 15:28
 
Fecha de Ingreso: abril-2009
Mensajes: 26
Antigüedad: 14 años, 11 meses
Puntos: 1
Respuesta: Diccionarios Dentro de Diccionarios

Hola razpeitia, lo que quiere hacer concretamente es un algoritmo ID3, que es generar arboles, con nodos, y hojas, para hacer esto se necesita calcular la entropia, y para obtener está entropía debo calcular la sumatoria de los valores que se repiten ejemplo

si tengo mi tabla 1 :
Código:
Alta : si
Alta : no
Alta : si
Baja : no
Media : si
Baja : si
Alta : si
deberia estar obteniendo algo así tabla 2:
Código:
Alta : si => 3.0
Alta : no => 1.0
Media : si => 1.0. 
Baja : si => 1.0
Baja : no => 1.0
Entonces de aqui ya podria calcular la entropia

que seria la suma de Alta en si, Alta en no, Media en si, Baja en si, y Baja en noy cada una sobre el número que tiene. ejemplo:
Tabla 3
Código:
Alta              si                                no 
   = -  ( (3/4 * log2 (3/4 ) + ( 1/4 * log2 (1/4) )
Media          si
   = -  ( 1/1 * log2 (1/1) )
Baja            si                                 no 
   = -  ( 1/2 * log2 (1/2) ) + ( 1/2 * log2 (1/2) )
y ya posteriormente sacaria mi ganancia
mi problema básicamente si has corrido mi ejemplo es que me quede la como la tabla 2
y mi pregunta es, estoy haciendolo de manera correcta o dentro de python puedo utilizar otro mecanismo creo que es por q llevo una semana leyendo de el y por tanto mi experiencía es muy nula en el tema, y crei que sería la manera más simple el usar diccionarios dentro de diccionarios, no se que me recomiendas, creo que donde tengo dudas de como buscar los elementos de mis diccionarios

osea en mi código cuando creo los nuevos nodos pregunto si existe en el la llave del elemento anterior creo y ahi debo de preguntar en todo el diccionarios anterior no sólo en la posición anterior, esto por que cuando los elementos
Alta : no , Alta no <-- están juntos los incrementa pero si estubiera si se mete otro elemento ya no lo cuenta y le crea un nuevo nodo. espero darme a entender!!, y aclaro no quiero que me hagas el código simplemente quiero saber que funciones me pueden ayudar para solucionar estas condiciones escritas anteriormente, como nota: disculpa la identación como sólo hice copy paste creo q resulto no productivo
también tengo mucho código comentado que es el q me ayuda a entender como está trabajando python....

Un saludo !!! y gracias por el apoyo.
  #4 (permalink)  
Antiguo 23/06/2010, 16:57
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Diccionarios Dentro de Diccionarios

En la wikipedia en ingles esta un link para una implementación en python.

Anexo un ejemplo de como sacar la frecuencia de los elementos:
Código Python:
Ver original
  1. d = {0: {'Alta': 'no'},
  2.      1: {'Normal': 'si'},
  3.      2: {'Baja': 'no'},
  4.      3: {'Normal': 'si'},
  5.      4: {'Alta': 'si'},
  6.      5: {'Baja': 'si'},
  7.      6: {'Alta': 'si'},
  8.      7: {'Normal': 'si'},
  9.      8: {'Baja': 'no'}
  10.      }
  11.  
  12. freq = {}
  13. for k1 in d.keys():
  14.     for k, v in d[k1].iteritems():
  15.         if freq.has_key(k):
  16.             if freq[k].has_key(v):
  17.                 freq[k][v] += 1.00
  18.             else:
  19.                 freq[k][v] = 1.00
  20.         else:
  21.             freq[k] = {v: 1.00}
  22. print freq
  #5 (permalink)  
Antiguo 23/06/2010, 19:14
 
Fecha de Ingreso: abril-2009
Mensajes: 26
Antigüedad: 14 años, 11 meses
Puntos: 1
Respuesta: Diccionarios Dentro de Diccionarios

Hola, razpeitia gracias si ya quedo así como lo queria y ya habia visto esas lecturas pero cuando intente correr para probar este código me causo error
Código PHP:
def entropy(datatarget_attr):
    
"""
    Calculates the entropy of the given data set for the target attribute.
    """
    
val_freq     = {}
    
data_entropy 0.0

    
# Calculate the frequency of each of the values in the target attr
    
for record in data:
        if (
val_freq.has_key(record[target_attr])): 
""" Aqui en este if me marca el error, el por que no lo se, espero me puedas ayudar con esto realmente 
eres mi unico contacto con python, y google pero google no me ah podido ayudar con cosas de este tipo,
 creo q por q no se, pero no entiendo tal vez sea la versión en la que se realizo este algoritmo por que yo 
use 2.6 y ahora 3.1 para hacer este código """
            
val_freq[record[target_attr]] += 1.0
        
else:
            
val_freq[record[target_attr]]  = 1.0

    
# Calculate the entropy of the data for the target attribute
    
for freq in val_freq.values():
        
data_entropy += (-freq/len(data)) * math.log(freq/len(data), 2
        
    return 
data_entropy 
gracias ahorita trato de entender el código que me has proporcionado, pues no sabia que se podia hacer eso :) me has sacado de un gran apuro :)

Última edición por paridin; 23/06/2010 a las 19:19
  #6 (permalink)  
Antiguo 23/06/2010, 20:16
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Diccionarios Dentro de Diccionarios

En la ultima parte hay un enlace con todo el código y un ejemplo con datos.

A mi me corrió de maravilla, pero tienes que usar los datos que están dando. Con algunas modificaciones y seguro que puedes ajustar a tu problema.
  #7 (permalink)  
Antiguo 23/06/2010, 22:06
 
Fecha de Ingreso: abril-2009
Mensajes: 26
Antigüedad: 14 años, 11 meses
Puntos: 1
Respuesta: Diccionarios Dentro de Diccionarios

orale gracias de nuevo, no había visto la última parte, de nuevo gracias!!!
ya lo estoy haciendo a mi lógica de rato subo cuando lo tenga terminado :P

Etiquetas: dentr, diccionario, diccionarios, id3-
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:36.