Como principiante en Python, tengo problemas para tratar de resolver una tarea específica sobre una función que tengo, y esperaba que alguien me echara una mano, ya que no puedo encontrar una manera de hacerlo, realmente lo agradecería. . Entonces, sin más preámbulos, este es mi problema:

Tengo una función que hice que toma dos entradas. Es bastante grande, pero por el bien de la investigación, digamos que podría ser algo como esto:

def trd(SPREAD,STOP):
    money = SPREAD * STOP - 10 * STOP
    return(money)

Los valores de ambas entradas serían rangos de flotadores con una diferencia de 0.01 entre sí, por lo que sus posibles valores podrían ser estos, por ejemplo:

SPREAD: 2.50, 2.51, 2.52 ... hasta 3.50

PARADA: 1.00, 1.01, 1.02 ... hasta 1.50

Y el resultado, denominado aquí "dinero", podría ser cualquier cantidad, como -10054.55 EUR o 8763.20 EUR.

La cuestión es que necesitaría obtener todas las salidas posibles de trd () para todas las combinaciones de esas dos entradas en un marco de datos Pandas (por lo que las columnas serían los valores SPREAD y las filas las STOP u otras) ) o tal vez una matriz de Numpy, lo que sea mejor para representar más tarde en una gráfica de densidad o una gráfica de contorno (donde el hacha horizontal sería SPREAD, la vertical STOP y esas "salidas de dinero" serían colores).

¿Cómo podría llegar allí?

¡Muchas gracias por adelantado!

1
Newbie_2006 17 sep. 2018 a las 14:41

3 respuestas

La mejor respuesta

Las respuestas anteriores son correctas. Sin embargo, si de todos modos va a empacar los resultados en un marco de datos de matriz / pandas numpy, sugeriría ir con una comprensión de lista doble y funciones numpy:

import numpy as np
import pandas as pd

def trd(SPREAD,STOP):
    money = SPREAD * STOP - 10 * STOP
    return(money)

def build_matrix(spread_lo, spread_hi, spread_range, 
                 stop_lo, stop_hi, stop_range):

    spread_list = np.arange(spread_lo, spread_hi, spread_range)
    stop_list = np.arange(stop_lo, stop_hi, stop_range)

    wannabe_matrix = [[trd(spread, stop) 
                       for spread in spread_list]
                      for stop in stop_list]

    # Transpose it as you wish. Note that wannabe_matrix is list of numpy arrays, 
    # so transposition is easier after you build pandas dataframe
    df = pd.DataFrame(wannabe_matrix, columns=spread_list, index=stop_list).T

    return df


build_matrix(1.50, 2.00, 0.05, 1.0, 1.25, 0.05)
0
Revaz 17 sep. 2018 a las 12:39

Mi respuesta no es muy diferente de la de Jesse, pero como lo he escrito, pensé que también podría incluirlo. He usado un diccionario de comprensión para mostrar los resultados para el rango de posibles entradas. Las posibles entradas se crean a partir de una comprensión de la lista:

def trd(SPREAD,STOP):
    money = SPREAD * STOP - 10 * STOP
    return(money)

max_spread = 0.2
max_stop = 0.2
step = 0.01

spread_values = [i*step for i in range(0, int(max_spread / step))]
stop_values = [i*step for i in range(0, int(max_stop / step))]

results = {
  spread_value: {
    stop_value: trd(spread_value, stop_value)
    for stop_value in
    stop_values
  }
  for spread_value in
  spread_values
}

print(results)
1
OliverRadini 17 sep. 2018 a las 12:02

Bueno entonces:

En primer lugar, ya que se trata de flotadores, puede crear una función de paso personalizada para usar que toma un límite inferior, un límite superior y un paso.

Luego, desea iterar para cada valor SPREAD, desea completar un ciclo del rango STOP. Esto se puede lograr con un bucle anidado. A continuación, solo estoy imprimiendo los valores, puede buscar cómo ingresar estos valores en la estructura de datos que desee.

def trd(SPREAD,STOP):
    money = SPREAD * STOP - 10 * STOP
    return(money)

def irange(start, stop, step):
    x = start
    while x < stop:
        yield x
        x += step

def jrange(start, stop, step):
    x = start
    while x < stop:
        yield x
        x += step

for i in irange(2.50,3.50,0.01):
    for j in jrange(1.00,1.50,0.01):
        print(i) #current value of SPREAD
        print(j) #current value of STOP
        z = trd(i,j) #current value of trd(SPREAD,STOP)
        print(z)
1
Jesse 17 sep. 2018 a las 12:10