Cálculo de los valores de Python de bucle anidado en una lista -- python campo con list campo con pandas campo con nested-loops camp Relacionados El problema

Nested Loop Python calculation of values in a list


0
vote

problema

Español

Me gustaría calcular la siguiente función en un bucle anidado y manténgalo de esa manera :

  Calc_Value = value_a(2D) - (values_b(0D) + values_b(1D))/10000   

que resulta en el valor:

  1.1274875   

que se define como:

  value_a(2D) corresponds to type **a**, year **2D** and value **1.1275** value_b(0D) corresponds to type **b**, year **0D** and value **0** value_b(1D) corresponds to type **b**, year **1D** and value **0.125**   

De alguna manera, no estoy seguro de cómo definir la función a continuación para usar para el valor B los dos valores adecuados como se muestra arriba ???

Hay una manera de hacerlo directamente con Panda ( Versión de Pandas ), pero desea usar mi forma anidadada.

Actualización:

Causmé mi función y recibí el valor adecuado de la TRIP, pero aún así tenemos el problema que calculo el valor varias veces en lugar de una vez. Recibo por cada valor b el valor A hasta que se calcula el valor correcto, que es el último. Solo quiero mantener el último valor.

  1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1274875 --> **Only this value should be shown**   

El código se parece a lo siguiente:

  import pandas as pd  def CalcValue(year, a, b):       normalization = 0.0     value_0D = 0.0     value_1D = 0.0     Calc = 0.0     normalization = 10000.0     if year == "0D":             value_0D = b     elif year == "1D":         value_1D = b     Calc = a-(value_0D+value_1D)/normalization                 return Calc   data = pd.read_csv('C:/Users/mcm/Desktop/Book1.csv').fillna('')  pd_date = pd.DatetimeIndex(data['date'].values) data['date'] = pd_date index_data = data.set_index('date')  for current_date in index_data.index.unique():         print('calculating date: ' + str(current_date))      for index, row in index_data.iterrows():         if index == current_date:             for index2, row2 in index_data.iterrows():                  if index2 == current_date:                     if row['type'] in {'a', 'b'} and row2['type'] in {'a', 'b'}:                         if row['type'] != row2['type'] and row['type'] != 'a' and row2['type'] != 'b':                               test = CalcValue(row['year'], row2['value'],row['value'])                             print(test)   

Los datos se ven como los siguientes:

  date    type    year    value 2015-02-09  a   2D  1.1275 2015-02-09  b   10M 58.125 2015-02-09  b   11M 68.375 2015-02-09  b   1M  3.345 2015-02-09  b   1W  0.89 2015-02-09  b   1Y  79.375 2015-02-09  b   2M  7.535 2015-02-09  b   2W  1.8 2015-02-09  b   3M  11.61 2015-02-09  b   3W  2.48 2015-02-09  b   4M  16.2 2015-02-09  b   5M  21.65 2015-02-09  b   6M  27.1 2015-02-09  b   7M  33.625 2015-02-09  b   8M  41.375 2015-02-09  b   9M  49.5 2015-02-09  b   0D  0 2015-02-09  b   1D  0.125 2015-02-09  c   2Y  -28.5 2015-02-09  c   3Y  -28.75 2015-02-09  c   4Y  -28 2015-02-09  c   5Y  -27.5 2015-02-09  c   6Y  -27 2015-02-09  c   7Y  -26.75 2015-02-09  c   8Y  -26.25 2015-02-09  c   9Y  -25.5 2015-02-09  c   10Y -25 2015-02-10  a   2D  1.1297 2015-02-10  b   10M 60.5 2015-02-10  b   11M 70.375 2015-02-10  b   1M  3.32 2015-02-10  b   1W  0.84 2015-02-10  b   1Y  81.625 2015-02-10  b   2M  7.54 2015-02-10  b   2W  1.74 2015-02-10  b   3M  11.745 2015-02-10  b   3W  2.45 2015-02-10  b   4M  16.4 2015-02-10  b   5M  22.05 2015-02-10  b   6M  28.1 2015-02-10  b   7M  35.375 2015-02-10  b   8M  42.625 2015-02-10  b   9M  51 2015-02-10  b   0D  0.105 2015-02-10  b   1D  0.11 2015-02-10  c   2Y  -29.5 2015-02-10  c   3Y  -29.75 2015-02-10  c   4Y  -29.5 2015-02-10  c   5Y  -29 2015-02-10  c   6Y  -28.5 2015-02-10  c   7Y  -28 2015-02-10  c   8Y  -27.5 2015-02-10  c   9Y  -26.75 2015-02-10  c   10Y -26.25   
Original en ingles

I would like to calculate the following function in a nested loop and keep it that way:

Calc_Value = value_a(2D) - (values_b(0D) + values_b(1D))/10000 

which results in the value:

1.1274875 

which is defined as:

value_a(2D) corresponds to type **a**, year **2D** and value **1.1275** value_b(0D) corresponds to type **b**, year **0D** and value **0** value_b(1D) corresponds to type **b**, year **1D** and value **0.125** 

somehow I am not sure how to define the function below to use for value b the proper two values as shown above???

There is a way how to do it in directly with pandas (Pandas Version) but would like to use my nested way.

UPDATE:

I cahnged my function and receive thr proper value but still have the problem that I calculate the value several time instead of one time. I get for every value b the value a until the proper value is calculated which is the last one. I only want to keep the last value.

1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1275 1.1274875 --> **Only this value should be shown** 

The code looks like the following:

import pandas as pd  def CalcValue(year, a, b):       normalization = 0.0     value_0D = 0.0     value_1D = 0.0     Calc = 0.0     normalization = 10000.0     if year == "0D":             value_0D = b     elif year == "1D":         value_1D = b     Calc = a-(value_0D+value_1D)/normalization                 return Calc   data = pd.read_csv('C:/Users/mcm/Desktop/Book1.csv').fillna('')  pd_date = pd.DatetimeIndex(data['date'].values) data['date'] = pd_date index_data = data.set_index('date')  for current_date in index_data.index.unique():         print('calculating date: ' + str(current_date))      for index, row in index_data.iterrows():         if index == current_date:             for index2, row2 in index_data.iterrows():                  if index2 == current_date:                     if row['type'] in {'a', 'b'} and row2['type'] in {'a', 'b'}:                         if row['type'] != row2['type'] and row['type'] != 'a' and row2['type'] != 'b':                               test = CalcValue(row['year'], row2['value'],row['value'])                             print(test) 

The data looks like the following:

date    type    year    value 2015-02-09  a   2D  1.1275 2015-02-09  b   10M 58.125 2015-02-09  b   11M 68.375 2015-02-09  b   1M  3.345 2015-02-09  b   1W  0.89 2015-02-09  b   1Y  79.375 2015-02-09  b   2M  7.535 2015-02-09  b   2W  1.8 2015-02-09  b   3M  11.61 2015-02-09  b   3W  2.48 2015-02-09  b   4M  16.2 2015-02-09  b   5M  21.65 2015-02-09  b   6M  27.1 2015-02-09  b   7M  33.625 2015-02-09  b   8M  41.375 2015-02-09  b   9M  49.5 2015-02-09  b   0D  0 2015-02-09  b   1D  0.125 2015-02-09  c   2Y  -28.5 2015-02-09  c   3Y  -28.75 2015-02-09  c   4Y  -28 2015-02-09  c   5Y  -27.5 2015-02-09  c   6Y  -27 2015-02-09  c   7Y  -26.75 2015-02-09  c   8Y  -26.25 2015-02-09  c   9Y  -25.5 2015-02-09  c   10Y -25 2015-02-10  a   2D  1.1297 2015-02-10  b   10M 60.5 2015-02-10  b   11M 70.375 2015-02-10  b   1M  3.32 2015-02-10  b   1W  0.84 2015-02-10  b   1Y  81.625 2015-02-10  b   2M  7.54 2015-02-10  b   2W  1.74 2015-02-10  b   3M  11.745 2015-02-10  b   3W  2.45 2015-02-10  b   4M  16.4 2015-02-10  b   5M  22.05 2015-02-10  b   6M  28.1 2015-02-10  b   7M  35.375 2015-02-10  b   8M  42.625 2015-02-10  b   9M  51 2015-02-10  b   0D  0.105 2015-02-10  b   1D  0.11 2015-02-10  c   2Y  -29.5 2015-02-10  c   3Y  -29.75 2015-02-10  c   4Y  -29.5 2015-02-10  c   5Y  -29 2015-02-10  c   6Y  -28.5 2015-02-10  c   7Y  -28 2015-02-10  c   8Y  -27.5 2015-02-10  c   9Y  -26.75 2015-02-10  c   10Y -26.25 
           
         
         

Lista de respuestas

0
 
vote

Esto sería mínimo:

  for i in range(20):     print(i) #print(i)   

Esto incluye una condición:

  for i in range(20):     if True:         test = i         print(test) #print(test)   

Su problema es solo para obtener el último valor computado de un bucle : ya logró esto, pero está imprimiendo cada valor computado dentro el bucle, es decir, en cada iteración donde se cumplen las condiciones. La solución rápida es simplemente imprimirlo después de el bucle (cambie los comentarios en Imprimir () arriba).

Usted generalmente detendría el bucle una vez que haya encontrado lo que está buscando. De lo contrario, usaría otra variable para almacenar el resultado:

  keepitthatway = None for i in range(42):     if i==7:         keepitthatway = i         # keep on iterating if necessary or         #break print(i) print(keepitthatway)   

Hay muchos tutoriales de programación de Python por ahí, por ejemplo. https://wiki.python.org/moin/forloop . Echar un vistazo; -)


Responsable Ejemplo mínimo, completo y verificable también habría funcionado. Si bien no es exactamente mínimo, se parece a su estructura de código:

  for current_date in range(2):     print('calculating something...')     for index, row in enumerate(range(20)):         if index == current_date:             for index2, row2 in enumerate(range(20)):                 if True:                     if True:                         if True:                             test = index                             print(test)     #print(test)   

Sólo limitar su conjunto de datos ya habría sido una mejora:

  import pandas as pd  # pretend to be the csv file import io csv = io.StringIO("""date type year value 2015-02-09 a 2D 1.1275 2015-02-09 b 10M 58.125 2015-02-09 c 2Y -28.5 2015-02-10 a 2D 1.1297 2015-02-10 b 10M 60.5 2015-02-10 c 2Y -29.5 2015-02-10 c 10Y -26.25 """)  def CalcValue(year, a, b):     normalization = 0.0     value_0D = 0.0     value_1D = 0.0     Calc = 0.0     normalization = 10000.0     if year == "0D":         value_0D = b     elif year == "1D":         value_1D = b     Calc = a-(value_0D+value_1D)/normalization     return Calc  data = pd.read_csv(csv, sep=" ").fillna('')  #print(data) #import sys;sys.exit()  pd_date = pd.DatetimeIndex(data['date'].values) data['date'] = pd_date index_data = data.set_index('date')  for current_date in index_data.index.unique():     print('calculating date: ' + str(current_date))      for index, row in index_data.iterrows():         if index == current_date:             for index2, row2 in index_data.iterrows():                 if index2 == current_date:                     if row['type'] in {'a', 'b'} and row2['type'] in {'a', 'b'}:                         if row['type'] != row2['type'] and row['type'] != 'a' and row2['type'] != 'b':                             test = CalcValue(row['year'], row2['value'],row['value'])     print(test)   

imprime

  calculating date: 2015-02-09 00:00:00 1.1275 calculating date: 2015-02-10 00:00:00 1.1297   

(Por supuesto, estos valores son diferentes de la de su pregunta, porque se modifica el conjunto de datos)

 

This would be minimal:

for i in range(20):     print(i) #print(i) 

This includes a condition:

for i in range(20):     if True:         test = i         print(test) #print(test) 

Your problem is just to get the last computed value from a loop - you already achieved this, but you are printing every computed value inside the loop, i.e. on every iteration where the conditions are met. The quick solution is to just print it after the loop (swap the comments on print() above).

You would generally stop the loop once you found what your are looking for. Otherwise, you'd use another variable to store the result:

keepitthatway = None for i in range(42):     if i==7:         keepitthatway = i         # keep on iterating if necessary or         #break print(i) print(keepitthatway) 

There are lots of Python programming tutorials out there, e.g. https://wiki.python.org/moin/ForLoop. Have a look ;-)


Regarding Minimal, Complete, and Verifiable example, this would have worked too. While not exactly minimal, it resembles your code structure:

for current_date in range(2):     print('calculating something...')     for index, row in enumerate(range(20)):         if index == current_date:             for index2, row2 in enumerate(range(20)):                 if True:                     if True:                         if True:                             test = index                             print(test)     #print(test) 

Just limiting your dataset would have been an improvement already:

import pandas as pd  # pretend to be the csv file import io csv = io.StringIO("""date\ttype\tyear\tvalue 2015-02-09\ta\t2D\t1.1275 2015-02-09\tb\t10M\t58.125 2015-02-09\tc\t2Y\t-28.5 2015-02-10\ta\t2D\t1.1297 2015-02-10\tb\t10M\t60.5 2015-02-10\tc\t2Y\t-29.5 2015-02-10\tc\t10Y\t-26.25 """)  def CalcValue(year, a, b):     normalization = 0.0     value_0D = 0.0     value_1D = 0.0     Calc = 0.0     normalization = 10000.0     if year == "0D":         value_0D = b     elif year == "1D":         value_1D = b     Calc = a-(value_0D+value_1D)/normalization     return Calc  data = pd.read_csv(csv, sep="\t").fillna('')  #print(data) #import sys;sys.exit()  pd_date = pd.DatetimeIndex(data['date'].values) data['date'] = pd_date index_data = data.set_index('date')  for current_date in index_data.index.unique():     print('calculating date: ' + str(current_date))      for index, row in index_data.iterrows():         if index == current_date:             for index2, row2 in index_data.iterrows():                 if index2 == current_date:                     if row['type'] in {'a', 'b'} and row2['type'] in {'a', 'b'}:                         if row['type'] != row2['type'] and row['type'] != 'a' and row2['type'] != 'b':                             test = CalcValue(row['year'], row2['value'],row['value'])     print(test) 

Prints

calculating date: 2015-02-09 00:00:00 1.1275 calculating date: 2015-02-10 00:00:00 1.1297 

(of course these values are different from the one in your question, because the dataset is modified)

 
 

Relacionados problema

1  Extracción de duplicados de lado izquierdo de la matriz  ( Removing left sided duplicates from array ) 
Estoy tratando de encontrar errores en mi código y me pregunto si podría ayudarme. Mi tarea es escribir un método que tome una matriz como una entrada y devol...

0  ¿Alguien puede explicar cómo funcionan los bucles de Java con patrones de números?  ( Can someone explain how java nested loops work with number patterns ) 
Estoy teniendo problemas para comprender cómo funcionan los patrones de bucles y números anidados. He completado todos los patrones, excepto 3. ¿Puede alguien...

79  ITERATE ARRAY multidimensional con declaración anidadida de fideos  ( Iterate multi dimensional array with nested foreach statement ) 
Creo que esta podría ser una pregunta bastante simple, pero aún no he podido resolverlo. Si tengo una matriz de 2 dimensiones, así: int[,] array = new int[...

0  COMPILADOR DE CYGWIN Idioma C, no estoy seguro de por qué está sucediendo esto  ( C language cygwin compiler not sure why this is happening ) 
Mi trabajo es probar la teoría de Fermats incorrecta usando c. Entonces, lo que hice fue que hice los bucles anidados, es bastante fácil de leer. Aquí está ...

-1  Algoritmo de bucle anidado: ¿cómo los índices lo mejoran?  ( Nested loop algorithm how indexes improve it ) 
Estoy mirando cómo funciona el algoritmo de bucle anidado para las combinaciones en SQL, pero no puede comprender cómo los índices pueden mejorar su rendimien...

5  Implementación de "iterador" de varios niveles en PHP  ( Implementing multi level iterator in php ) 
Estoy tratando de crear un iterador como este , para un Lista de comentarios: // the iterator class, pretty much the same as the one from the php docs... ...

-3  Bucle anidado Python trabajando raro  ( Python nested loop working weirdly ) 
Tengo un pequeño problema en Python, escribí un bucle anidado, y cuando ejecuté mi script, mi segundo bucle ignoró totalmente el primer bucle ... while...

-3  ¿Alguien puede mirar mi código Java para el patrón de diamante numérico usando bucles anidados? [cerrado]  ( Can someone look at my java code for numeric diamond pattern using nested loops ) 
cerrado. Esta pregunta no cumple con pautas de desbordamiento de pila . Actualmente no está aceptando respuestas. ...

533  ¿Cómo romper con múltiples bucles?  ( How to break out of multiple loops ) 
Dado el siguiente código (que no funciona): while True: #snip: print out current state while True: ok = get_input("Is this ok? (y/n)") ...

0  ¿Es posible si (y (o ... Fórmula en Excel 2010?  ( Is ifandor formulas in excel 2010 possible ) 
Tengo la fórmula a continuación en función de algunos hilos de este hilo, pero estoy recibiendo un error. self.myMutableArray=myArray 4 ¿Alguna soluci...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos