[Python-es] Obtención de Sumandos para un Target a partir de una colección de valores

Manuel A. Estevez Fernandez stvzito en gmail.com
Jue Feb 8 17:26:55 EST 2018


Hola gracias por tu sugerencia.

Lo que necesito es por ejemplo:

para el ID 1 el target es 100,

entonces ¿cuáles son los números del ID 1 que puedan sumar 100 ?
20, 30, 50, 15, 45, 60
20 + 30 + 50 = 100

Lo que tu sugieres es que sume primero todos los números para cierto ID y
luego valide si esa suma corresponde al target.

Saludos.




Manuel Alejandro Estévez Fernández



El 8 de febrero de 2018, 15:36, Javier Rovegno Campos <tatadeluxe en gmail.com>
escribió:

> Hola Manuel:
>
> No se si entendí bien tu pregunta, pero para lo que necesitas se me ocurre
> que puedes usar pandas:
>
> from io import StringIO
> import pandas as pd
>
>
> DATA="""id,target,valores
> 1,100,20
> 1,100,30
> 1,100,50
> 1,100,15
> 1,100,45
> 1,100,60
> 2,150,75
> 2,150,75
> 2,150,100
> 3,1500,900
> 3,1500,500
> 3,1500,600
> 3,1500,1000
> 3,1500,750
> 3,1500,200
> 3,1500,300
> 3,1500,10
> 3,1500,30
> 3,1500,50
> """
>
> df = pd.read_csv(StringIO(DATA))
> suma = df.groupby(['id','target'], as_index=False)['valores'].sum()
> print(suma)
> suma.query('valores-1 < target < valores+1')
>
>
> Te dejo el gist https://gist.github.com/jrovegno/
> e1eb651b58a4338bfe9eff203d6c1e1c
>
> Saludos
>
>
> 2018-01-12 17:35 GMT-03:00 Manuel A. Estevez Fernandez <stvzito en gmail.com>
> :
>
>> Hola a todos, tengo la siguiente necesidad:
>>
>> Encontrar una combinación de valores pertenecientes a una colección cuyo
>> resultado sea un numero determinado.
>>
>> Algo así:
>> id target valores
>> 1 100 20
>> 1 100 30
>> 1 100 50
>> 1 100 15
>> 1 100 45
>> 1 100 60
>> 2 150 75
>> 2 150 75
>> 2 150 100
>> 3 1500 900
>> 3 1500 500
>> 3 1500 600
>> 3 1500 1000
>> 3 1500 750
>> 3 1500 200
>> 3 1500 300
>> 3 1500 10
>> 3 1500 30
>> 3 1500 50
>>
>> Toda esta información la tengo en un archivo csv. El cual leo y genero un
>> diccionario:
>>
>>  {
>>    id : {  target : target , values : [ valores ] }
>>   ,  id : { target : target , values : [ valores ] }
>> }
>>
>> con el siguiente codigo realizo un matriz de verdad de la longitud de la
>> cantidad de los valores por ID, y realizo la suma si es lo del target +1-1
>> con ese vale.
>>
>> import numpy as np
>> import itertools
>>
>> for id in in diccionario :
>> for tup in itertools.product([0,1] , repeat=len(diccionario[id]['va
>> lues'])):
>> resultado = np.sum( np.dot(  np.array(list(tup)) , np.array(
>> diccionario[id]['valores'] ) ) )
>> if ( diccionario[id]['target'] - 1) <= resultado and resultado <=  (
>> diccionario[id]['target'] + 1) :
>> print 'ID : ', id, ' Combinacion : ' , tup , 'Valores ',
>> diccionario[id]['valores']
>> break
>>
>>
>>
>> La problematica que tengo es que obviamente entre mas grande sea la
>> cantida de valores la combinaciones serán muchas más.
>>
>> Tengo la idea de utilizar un poco de paralelizar, pero no tengo idea de
>> como empezar.
>>
>> No sé como hacerlo o si sea posible lo siguiente:
>> Lanzar un proceso por ID.
>> -Generar una segmentación de la matriz de verdad y asignarla un subproceso
>> -Cuando algún subproceso encuentre un resultado válido, lo devuelva y se
>> detengan los subprocesos
>> -Avanzar al siguiente ID.
>>
>> Saludos y gracias de antemano.
>>
>>
>>
>> Manuel Alejandro Estévez Fernández
>>
>>
>>
>> _______________________________________________
>> Python-es mailing list
>> Python-es en python.org
>> https://mail.python.org/mailman/listinfo/python-es
>>
>>
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20180208/dca751e1/attachment.html>


Más información sobre la lista de distribución Python-es