Completamente de acuerdo, en este momento no le podre meter mucho tiempo a
mejorar el performance pero lo haré en un futuro y les comunico mis
resultados. Es extraño que nadie más este en la discusión. ¿Será pandas y
numpy poco usado por esta comunidad?


2014-05-14 1:36 GMT-05:00 Kiko <[email protected]>:

>
>
>
> El 14 de mayo de 2014, 1:50, AGTUGO <[email protected]> escribió:
>
> Sí lo unico que me causa un poco de ruido es usar el ciclo for para crear
>> los renglones, siempre trato de evitarlos y usar streaming, indexing,
>> slicing. Pero pues ya cambie mi forma de las combinaciones por tu método.
>>
>>
> Sigo considerando que deberías usar numpy arrays y una vez tengas los
> datos crear el DataFrame final. Modificar un DataFrame puede ser costoso,
> computacionalmente hablando, sobretodo insertar cosas línea a línea (aunque
> usando el método 'loc' remedie en parte eso).
>
> Saludos.
>
>
>>
>> 2014-05-13 14:49 GMT-05:00 Kiko <[email protected]>:
>>
>>
>>>
>>>
>>> El 13 de mayo de 2014, 20:52, AGTUGO <[email protected]> escribió:
>>>
>>> Pues aqui  tengo el siguiente codigo donde no necesito crear un array
>>>> intermedio.
>>>>
>>>> Creo que la mejor opcion es simplemente usar ix para tener indexing
>>>> tipo numpy,
>>>> ¿Que opinas Kiko?
>>>>
>>>> import numpy as np
>>>> import itertools
>>>> ## tamaño de los renglones y columnas de los datos tabulados
>>>>
>>>> rows = 10
>>>> columns =5
>>>> ## informacion proporcionada en forma tabulada aqui estoy simulando el
>>>> csv
>>>> data = np.arange(rows*columns).reshape(rows,columns)
>>>> data_pa = pd.DataFrame(data, columns = ('A','B','C','D','E'))
>>>> display(data_pa)
>>>>
>>>> ## lo siguiente crea los indices de las combinaciones
>>>>
>>>> to_mix = np.arange(rows)
>>>> mixed = list(itertools.product(to_mix,to_mix))
>>>> combination = [x for x in mixed if (x[0]< x[1])]
>>>> combination = np.array(combination)
>>>>
>>>>
>>>> # separo los indices en dos variables
>>>> index1_comb = combination[:,0]
>>>> index2_comb = combination[:,1]
>>>>
>>>> #creo dos dataframes con los indices y despues los junto
>>>>
>>>> first_c=data_pa.iloc[index1_comb].reset_index(drop=True)
>>>> second_c=data_pa.iloc[index2_comb].reset_index(drop=True)
>>>> final_data_pandas = pd.concat((first_c,second_c),axis=1)
>>>> display(final_data_pandas )
>>>>
>>>>
>>> En las versiones que te he dejado no uso en ningún momento numpy. ¿No te
>>> valen como opción?
>>>
>>>>
>>>>
>>>>
>>>>
>>>> 2014-05-13 13:09 GMT-05:00 Kiko <[email protected]>:
>>>>
>>>>
>>>>>
>>>>>
>>>>> El 13 de mayo de 2014, 20:05, AGTUGO <[email protected]> escribió:
>>>>>
>>>>>
>>>>>> Muchas gracias, no es para clase. Es un programa para calcular la
>>>>>> vida minima de un componente mecánico, entonces debo buscar la vida 
>>>>>> minima
>>>>>> buscando todas las posibles combinaciones y despues hacer calculos. Esta
>>>>>> rutina la hago varias veces con algunas variaciones, y con el dataframe 
>>>>>> es
>>>>>> mas facil visualizar.
>>>>>>
>>>>>> Cuando paso a un array pierdo un poco de informacion de los headers,
>>>>>> y la tengo que extraer y volver a meter. En mi opinion estar cambiando de
>>>>>> tipos de datos aumenta la probabilidad de errores y la lectura posterior.
>>>>>> Es más o menos el ya discutido problema de evitar el tipo matrix en 
>>>>>> numpy y
>>>>>> solamente usar arrays aunque sea no tan transparente las operaciones
>>>>>> matriciales.
>>>>>>
>>>>>>
>>>>>>
>>>>> Pues si te ha funcionado, perfecto, y si no es lo que buscabas
>>>>> seguimos iterando.
>>>>>
>>>>> Saludos.
>>>>>
>>>>>
>>>>>> 2014-05-13 12:16 GMT-05:00 Kiko <[email protected]>:
>>>>>>
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> El 13 de mayo de 2014, 18:31, AGTUGO <[email protected]> escribió:
>>>>>>>
>>>>>>>  Entiendo el punto pero tengo que pasar por un array intermedio. La
>>>>>>>> idea es agarrar un archivo csv direcatamente a un dataframe y de ahi 
>>>>>>>> sacar
>>>>>>>> el dataframe con las combinaciones, el método actual sería:
>>>>>>>>
>>>>>>>> 1.- Importar csv en dataframe
>>>>>>>> 2.- Crear un array del dataframe
>>>>>>>> 3.- Crear los indices de las combinaciones
>>>>>>>> 4.- Usar la notacion de indices para crear el array
>>>>>>>> 5.- Crear el dataset a partir del array
>>>>>>>>
>>>>>>>> Método buscado:
>>>>>>>>
>>>>>>>> 1.- Importar csv en dataframe
>>>>>>>> 2.- Crear indices de las combinaciones
>>>>>>>> 3.- Usar "algo" usando los indices para crear el dataframe nuevo a
>>>>>>>> partir del dataframe viejo
>>>>>>>>
>>>>>>>>
>>>>>>>> import pandas as pd
>>>>>>> from itertools import combinations
>>>>>>>
>>>>>>> #Suponemos que este dataframe viene de leerlo con un pd.read_csv()
>>>>>>> #Lo dejo así por simplificar
>>>>>>> df0 = pd.DataFrame([list(range(i,i+5)) for i in range(0,50,5)],
>>>>>>> columns = range(5))
>>>>>>>
>>>>>>> #creamos el dataframe de destino con 10 columnas
>>>>>>> df1 = pd.DataFrame(columns = range(10))
>>>>>>>
>>>>>>> # De esta forma estás usando los índices del dataframe df0 para
>>>>>>> hacer las combinaciones
>>>>>>> for i,j in enumerate(combinations(df0.index,2)):
>>>>>>>     df1.loc[i] = np.append(df0.ix[j[0]], df0.ix[j[1]])
>>>>>>>
>>>>>>> El dataframe df1 tendría todas las combinaciones. Me sigue
>>>>>>> pareciendo complicado e innecesario lo que quieres hacer (a no ser que 
>>>>>>> sea
>>>>>>> un ejercicio para clase y entonces podría entender lo rebuscado del 
>>>>>>> asunto).
>>>>>>>
>>>>>>> Saludos.
>>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>> 2014-05-13 2:12 GMT-05:00 Kiko <[email protected]>:
>>>>>>>>
>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> El 13 de mayo de 2014, 7:23, AGTUGO <[email protected]> escribió:
>>>>>>>>>
>>>>>>>>> Hola,
>>>>>>>>>>
>>>>>>>>>> He estado tratando de hacer implementacion solamente con panda de
>>>>>>>>>> lo siguiente que ya tengo con numpy, pero no me ha salido nada bien. 
>>>>>>>>>> Para
>>>>>>>>>> los mas entradillos con pandas espero que lo siguiente sea trivial.
>>>>>>>>>>
>>>>>>>>>> La entrada son datos tabulados de dos dimensiones o una matrix,
>>>>>>>>>> la idea es formar todas las combinaciones, sin repetir y sin 
>>>>>>>>>> sustitución,
>>>>>>>>>> de los renglones. La pareja de renglones se ponen en un solo renglon.
>>>>>>>>>>
>>>>>>>>>> Mi algoritmo actual es crear los indices de las combinaciones
>>>>>>>>>> posibles, y despues crear la mezcla usando los indices. En codigo 
>>>>>>>>>> sería lo
>>>>>>>>>> siguiente.
>>>>>>>>>>
>>>>>>>>>> #### combinaciones.py
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> import numpy as np
>>>>>>>>>> import itertools
>>>>>>>>>> rows = 10
>>>>>>>>>> columns =5
>>>>>>>>>> data = np.arange(rows*columns).reshape(rows,columns)
>>>>>>>>>> print('\n===Data===\n')
>>>>>>>>>> print(data)
>>>>>>>>>> to_mix = np.arange(rows)
>>>>>>>>>> mixed = list(itertools.product(to_mix,to_mix))
>>>>>>>>>> combination = [x for x in mixed if (x[0]< x[1])]
>>>>>>>>>> combination = np.array(combination)
>>>>>>>>>> print('\n===Combination===\n')
>>>>>>>>>> print(combination)
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> final_data =
>>>>>>>>>> np.hstack((data[combination[:,0],:],data[combination[:,1],:]))
>>>>>>>>>> print('\n===Final Data===\n')
>>>>>>>>>> print(final_data)
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>> No entiendo muy bien qué quieres hacer. Si tienes Pandas, tienes
>>>>>>>>> Numpy.¿Por qué no simplemente haces un DataFrame usando el numpy array
>>>>>>>>> final que has obtenido?
>>>>>>>>>
>>>>>>>>> Sin usar numpy (que deberías tener instalado porque tienes Pandas
>>>>>>>>> instalado, repito):
>>>>>>>>>
>>>>>>>>> from itertools import combinations
>>>>>>>>>
>>>>>>>>> lista = [list(range(i,i+5)) for i in range(0,50,5)]
>>>>>>>>> final = []
>>>>>>>>> for i in combinations(range(10),2):
>>>>>>>>>     final.append(lista[i[0]]+lista[i[1]])
>>>>>>>>> df = pd.DataFrame(final, columns = range(10))
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Resultado:
>>>>>>>>>>
>>>>>>>>>> ===Data===
>>>>>>>>>>
>>>>>>>>>> [[ 0  1  2  3  4]
>>>>>>>>>>  [ 5  6  7  8  9]
>>>>>>>>>>  [10 11 12 13 14]
>>>>>>>>>>  ...,
>>>>>>>>>>  [35 36 37 38 39]
>>>>>>>>>>  [40 41 42 43 44]
>>>>>>>>>>  [45 46 47 48 49]]
>>>>>>>>>>
>>>>>>>>>> ===Combination===
>>>>>>>>>>
>>>>>>>>>> [[0 1]
>>>>>>>>>>  [0 2]
>>>>>>>>>>  [0 3]
>>>>>>>>>>  ...,
>>>>>>>>>>  [7 8]
>>>>>>>>>>  [7 9]
>>>>>>>>>>  [8 9]]
>>>>>>>>>>
>>>>>>>>>> ===Final Data===
>>>>>>>>>>
>>>>>>>>>> [[ 0  1  2 ...,  7  8  9]
>>>>>>>>>>  [ 0  1  2 ..., 12 13 14]
>>>>>>>>>>  [ 0  1  2 ..., 17 18 19]
>>>>>>>>>>  ...,
>>>>>>>>>>  [35 36 37 ..., 42 43 44]
>>>>>>>>>>  [35 36 37 ..., 47 48 49]
>>>>>>>>>>  [40 41 42 ..., 47 48 49]]
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Al parecer no es tan sencillo crear un nuevo dataframe usando los
>>>>>>>>>> indices en panda. Espero que me puedan dar una orientación saludos.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> Arturo Muñoz Tolosa
>>>>>>>>>>
>>>>>>>>>> _______________________________________________
>>>>>>>>>> Python-es mailing list
>>>>>>>>>> [email protected]
>>>>>>>>>> https://mail.python.org/mailman/listinfo/python-es
>>>>>>>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> Python-es mailing list
>>>>>>>>> [email protected]
>>>>>>>>> https://mail.python.org/mailman/listinfo/python-es
>>>>>>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Arturo Muñoz Tolosa
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> Python-es mailing list
>>>>>>>> [email protected]
>>>>>>>> https://mail.python.org/mailman/listinfo/python-es
>>>>>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> Python-es mailing list
>>>>>>> [email protected]
>>>>>>> https://mail.python.org/mailman/listinfo/python-es
>>>>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Arturo Muñoz Tolosa
>>>>>>
>>>>>> _______________________________________________
>>>>>> Python-es mailing list
>>>>>> [email protected]
>>>>>> https://mail.python.org/mailman/listinfo/python-es
>>>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>>>
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Python-es mailing list
>>>>> [email protected]
>>>>> https://mail.python.org/mailman/listinfo/python-es
>>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Arturo Muñoz Tolosa
>>>>
>>>> _______________________________________________
>>>> Python-es mailing list
>>>> [email protected]
>>>> https://mail.python.org/mailman/listinfo/python-es
>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>
>>>>
>>>
>>> _______________________________________________
>>> Python-es mailing list
>>> [email protected]
>>> https://mail.python.org/mailman/listinfo/python-es
>>> FAQ: http://python-es-faq.wikidot.com/
>>>
>>>
>>
>>
>> --
>> Arturo Muñoz Tolosa
>>
>> _______________________________________________
>> Python-es mailing list
>> [email protected]
>> https://mail.python.org/mailman/listinfo/python-es
>> FAQ: http://python-es-faq.wikidot.com/
>>
>>
>
> _______________________________________________
> Python-es mailing list
> [email protected]
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>


-- 
Arturo Muñoz Tolosa
_______________________________________________
Python-es mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a