如何使用数据框查询从递归调用中获取价值

时间:2019-03-05 16:09:05

标签: python pandas

我正在尝试在两个表之间进行此查找。带递归调用。但是它总是返回None。可能是什么原因?

def checkExchangerate(yearEc,monthEc,dayEc,currCode):
currCodes = {
    'gbp' : 'GBP/EUR',
    'usd' : 'USD/EUR'
}
retVal = exch_rate[currCodes[currCode]][exch_rate['DAGS']==dt(yearEc,monthEc,dayEc)]
print(retVal)
if retVal.empty:
    dayEc = dayEc-1
    checkExchangerate(yearEc,monthEc,dayEc,currCode)
else:
    return min(retVal)

checkExchangerate(1999,1,17,'usd') 返回无。

table exch_rate is pd.DataFrame: 
DAGS         USD/EUR   GRP/EUR 
1999-1-15      0,66    0,4 
1999-1-18      0,65    0,4

预期输出为0.66

1 个答案:

答案 0 :(得分:0)

请在您的问题中添加一些示例数据。

在您的代码中:

    if retVal.empty:
        dayEc = dayEc-1
        checkExchangerate(yearEc,monthEc,dayEc,currCode)
    else:
        return min(retVal)

如果retVal为空,它将递归调用自己。但是,当它来自递归时,它对返回值不执行任何操作,因此它返回None。

要解决此问题,您应该return递归返回的值:

    if retVal.empty:
        dayEc = dayEc-1
        return checkExchangerate(yearEc,monthEc,dayEc,currCode)
    else:
        return min(retVal)

此外,您可以替换:

        dayEc = dayEc-1
        return checkExchangerate(yearEc,monthEc,dayEc,currCode)

使用

        return checkExchangerate(yearEc,monthEc,dayEc-1,currCode)

但是,我建议使用循环:

def checkExchangerate(yearEc,monthEc,dayEc,currCode):
    currCodes = {...}
    retVal = False
    while not retVal or retVal.empty:
        retVal = exch_rate[currCodes[currCode]][exch_rate['DAGS']==dt(yearEc,monthEc,dayEc)]
        dayEc -= 1
        print(retVal)
    return min(retVal)

这可能会导致无限循环(就像您的代码可能导致无限递归一样),所以这是一个带有for循环的版本:

def checkExchangerate(yearEc,monthEc,dayEc,currCode):
    currCodes = {...}
    retVal = False
    for day in range(dayEc, dayEc-20, -1):
        retVal = exch_rate[currCodes[currCode]][exch_rate['DAGS']==dt(yearEc,monthEc,day)]
        if not retVal.empty:
           break;
        print(retVal)
    if retVal.empty:
        return some_error_code
    else:
        return min(retVal)

您可以将20更改为其他数字。或使用range(dayEc, 1, -1)-因为我怀疑这一天绝对不能少于1