获得二变量函数的所有可能结果-Python 3

时间:2018-09-17 11:41:13

标签: python python-3.x function

作为Python的初学者,我在尝试通过我拥有的功能解决特定任务时遇到了麻烦,并且我希望有人可以帮我忙,因为我找不到解决方法,我会非常感谢。因此,事不宜迟,这是我的问题:

我有一个函数需要两个输入。它很大,但是为了查询起见,它可能像这样:

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

两个输入的值都是浮动范围,彼此之间的差异为0.01,因此它们的可能值可以是例如:

传播:2.50、2.51、2.52 ...直到3.50

停止:1.00、1.01、1.02 ...直到1.50

并且输出(这里称为“ money”)可以是任何金额,例如--10054.55 EUR或8763.20 EUR。

问题是,我需要获得一个熊猫数据帧中这两个输入的所有组合的所有可能的trd()输出(因此列将是SPREAD值,行将是STOP值)或反之亦然)或一个Numpy矩阵,以稍后再用密度图或轮廓图表示(以水平轴为SPREAD,垂直一个STOP和“货币”输出为颜色)为佳。

我怎么到那里?

非常感谢!

3 个答案:

答案 0 :(得分:1)

好吧:

首先,由于您要处理浮点数,因此可以创建一个自定义的step函数以使用下限,上限和step。

然后,您要为每个SPREAD值进行迭代,则需要完成一个STOP范围的循环。这可以通过嵌套循环来实现。在下面,我只是打印出这些值,您可以查看如何将这些值输入到所需的任何数据结构中。

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 :(得分:1)

我的回答与Jesse的回答不太相似,但是当我写完它后,我认为我也可以包括它。我使用字典理解来显示可能输入范围内的结果。可能的输入是从列表理解中创建的:

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)

答案 2 :(得分:0)

以上答案是正确的。但是,如果您要将结果打包到numpy array / pandas数据框中,我建议使用双列表理解和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)