Buenos días, necesito realizar en Excel (a través de una macro, o como sea) los siguientes cálculos, de la manera en la que explico. A primera vista parecen muy complicados, pero son muy sencillos, es siempre el mismo proceso. Adjunto el Excel que actualmente utilizamos, ya tiene programados estos cálculos, pero tarda mucho tiempo. El objetivo es reducir el tiempo, de la manera en la que explico más abajo, y de manera que cumplan las condiciones que se exigen (también detalladas más abajo). Es un pequeño proyecto casero sencillo, y ofrecemos un presupuesto de 20-30€ (2-3 horas de trabajo) como explicamos más abajo.
Empiezo a explicar estos cálculos, lo más detalladamente posible:
Llamaremos “CADENA de caracteres” a una secuencia de siempre 14 caracteres, y tres posibles signos distintos (A, B o C, siempre). El orden importa, no sería lo mismo AAAAAAAAAAAAAB que AAAAAAAAAAAABA, por ejemplo.
En total, los cálculos se tendrán que realizar con en torno a 70.[eliminado] cadenas, aproximadamente. Para ver más sencillos los datos que hay calcular, voy a ir explicándolo como si tuviéramos solo 4 cadenas.
Imaginemos que sólo tuviéramos estas 4 cadenas:
AAAAAAAAAAAAAA
AAAAAAAAAAAAAB
AAAAAAAAAAABCA
AAAAAAAAABCCBB
El objetivo es: hallar cuantas cadenas tienen un signo diferente respecto de la primera, cuantas cadenas dos signos diferentes respecto de la primera, cuantas cadenas tres signos diferentes respecto de la primera, y cuantas cadenas cuatro signos diferente respecto de la primera. Hasta ahí, todo respecto de la primera.
Este proceso, posteriormente, se tendría que hacer no sólo respecto de la primera, sino respecto de cada una de las cadenas.
Explico cómo sería el proceso más detalladamente. Por ejemplo, respecto de la primera cadena quedaría así:
AAAAAAAAAAAAAA (Cadena analizada)
AAAAAAAAAAAAA<strong>B</strong> (Tiene un solo signo diferente)
AAAAAAAAAAA<strong>BC</strong>A (Tiene dos signos diferentes)
AAAAAAAAAAA<strong>CC</strong>A (Tiene dos signos diferentes)
Por tanto, finalmente quedaría así: (Supondremos que 1SD quiere decir un signo diferente, 2SD dos signos diferentes, 3SD tres signos diferentes, y 4SD, cuatro signos diferentes).
1SD 2SD 3SD 4SD
AAAAAAAAAAAAAA 1 2 0 0
Este proceso habría que realizarlo con las 4 cadenas, de manera que al final sólo nos quedaríamos con estos datos últimos por cada cadena (1SD, 2SD, 3SD, 4SD).
Posteriormente habría que seguir el mismo proceso con la segunda cadena, sería:
AAAAAAAAAAAAA<strong>A </strong>(Tiene un signo diferente)
AAAAAAAAAAAAAB (Cadena analizada)
AAAAAAAAAAA<strong>BCA</strong> (Tiene tres signos diferentes)
AAAAAAAAAAA<strong>CCA</strong> (Tiene tres signos diferentes)
Y finalmente, el resultado a mostrar, (mostramos también el resultado de la primera cadena calculado anteriormente) debería ser éste:
1SD 2SD 3SD 4SD
AAAAAAAAAAAAAA 1 2 0 0
AAAAAAAAAAAAAB 1 0 2 1
Así hasta analizar las dos cadenas que faltan, 4 en total en este caso.
Este proceso tendría que utilizarse hasta terminar de analizar en nuestro caso las en torno a 70.[eliminado] cadenas que el programilla obtiene al final, una vez calculados todos los datos.
El proceso es sencillo, pero al intervenir tantas cadenas, el principal problema que nos surge es el tiempo. Tenemos un Excel que ya realiza estos cálculos, pero sólo llega a analizar 30.000 cadenas (a partir de ahí da error, porque tarda demasiado), tardando en total 1h 30 min más o menos. Lo hemos adjuntado más abajo para que sirva de ayuda y de ejemplo.
El objetivo es lograr un Excel similar a éste en el que se puedan analizar en torno a las 70.[eliminado] cadenas en el menor tiempo posible. (Lo ideal sería 1h máx. en caso de las 120.000 cadenas, y en torno a 30-35 min. En caso de las 70.000, o algo más de tiempo si no fuera posible).
Hay que tener en cuenta que a medida que se aumenta el número de cadenas, el tiempo aumenta de manera exponencial, no linealmente (porque cada cadena que se añade tiene que compararse con cada vez más cadenas).
Sin embargo, es posible reducir al menos a la mitad el tiempo, haciendo la mitad de las comparaciones, de la manera que explico a continuación, por eso creo que es posible realizarlo en el tiempo que he comentado anteriormente.
Imaginemos que tenemos las siguientes cadenas que se ven en la imagen -dos párrafos más abajo- (tienen sólo 5 caracteres para simplificar y que se vea más fácil):
AAAAA
AAAAB
AACBB
AABBB
Los resultados finales serían los datos de 1SD, 2SD, 3SD y 4SD, pero si mostrásemos el análisis completo (que luego en los resultados finales como digo no se muestra), vemos que se forman dos triángulos iguales (lo he pintado de colores para que se vea claro). La parte de abajo es igual a la de arriba, cómo si lo mirásemos con un espejo.
(VER IMAGEN ADJUNTADA [login to view URL])
Esto sucede porque, imaginemos que tenemos tres cadenas:
Cadena 1
Cadena 2
Cadena 3
El programa analiza la cadena 1-2, 1-3, 2-1 y 2-3 y 3-1 y 3-2. Pero el análisis de la 1-2 y 2-1 es el mismo, el de la 1-3 y 3-1 también, y el de la 2-3 y 3-2 también, por eso se forma el triángulo. (Es decir, como digo se podrían calcular la mitad de las comparaciones).
Por si no se entienden bien los números de los dos triángulos, desarrollo el proceso como he explicado anteriormente. Los números del cuadro salen de aquí:
AAAAA (C: Cadena analizada)
AAAAB (Tiene 1 signo diferente)
AACBB (Tiene 3 signos diferentes)
AABBB (Tiene 3 signos diferentes)
AAAAA (Tiene 1 signo diferente)
AAAAB (C: Cadena analizada)
AACBB (Tiene 2 signos diferentes)
AABBB (Tiene 2 signos diferentes)
(Y lo mismo con las dos cadenas que siguen).
En definitiva, a primera vista parecen unos cálculos complicados, pero son muy sencillos, es siempre el mismo proceso. El objetivo es programarlo en Excel (a través de una macro, o como sea), de la manera que he explicado para evitar la mitad de las comparaciones, de manera que al analizar en torno a 70.[eliminado] cadenas, no lleve más de 1 hora.
Adjuntamos también el Excel que utilizamos actualmente (que realiza todas las comparaciones, y por eso lo máximo que permite es analizar 30.000 cadenas, tardando en torno a 1h y media aproximadamente), también realizado por un compañero que nos ayudó de esta plataforma. (En un primer momento muestra los datos calculados juntos, y sólo habría que darle a ‘Ejecutar dividir' para que los mostrase cada número en una cuadrícula, como debería ser. Mostrar los datos calculados juntos no es necesario, él lo realizó así para intentar ahorrar algo de tiempo.) Este Excel calcula también la 5SD, esa NO es necesaria. Sólo hace falta calcular la 1SD, 2SD, 3SD y 4SD, como he explicado anteriormente.
Adjuntamos este Excel que comentamos programado con los cálculos ya explicados, el objetivo, como digo, sería realizar en otro Excel, estos cálculos, pero programándolo de la forma que he explicado para evitarnos la mitad de las comparaciones y que al analizar en torno a 70.[eliminado] cadenas no lleve más de una hora.
Como ya damos el Excel y los cálculos realizados, que simplemente se limitan al mismo proceso una y otra vez, y el objetivo sería únicamente reprogramarlo para reducir el tiempo a la mitad, habíamos pensado en un presupuesto de 20-30€, pues no creemos que lleve más de 2-3 horas, la clave está en programarlo de la manera explicada para reducir el tiempo lo máximo posible. (La situación económica es la que es, nos gustaría, pero no podemos permitirnos pagar más).
El análisis tiene que cumplir el tiempo máximo (120.000 cadenas no pueden tardar más de 1h15min. o 1h30min. como muchísimo. Lo ideal sería algo menos. Si el Excel supera esos tiempos, no nos serviría, pues ya nos valdría con el que tenemos). Pagamos por Nubelo, o por Paypal, como se prefiera, al que nos comunique que ha logrado realizar este pequeño proyecto casero correctamente y dentro de los tiempos, no tenemos preferencia por nadie. Una vez efectuemos el pago, borraremos el anuncio. (Si lo desean, proporcionamos archivo .txt de 70.[eliminado] columnas para comprobar los tiempos). Muchas gracias.
(Adjuntado se muestra nuestro Excel, con los cálculos explicados, pero rcon el problema ya explicado de que realiza todas las comparaciones y no cumple la condición del tiempo -tarda mucho, y solo llega a analizar 30.000 cadenas-). Gracias, un saludo.