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 <stvz...@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]['
> values'])):
> 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@python.org
> https://mail.python.org/mailman/listinfo/python-es
>
>
_______________________________________________
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es

Responder a