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

2024-06-26 13:29:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在两个表之间进行查找。使用递归调用。但总是一无所获。原因是什么

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)

支票兑换率(1999,1,17,'usd') 返回None

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


Tags: ratedef原因eurusdretvalexchdags
1条回答
网友
1楼 · 发布于 2024-06-26 13:29:34

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

在代码中:

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

如果retVal为空,它将递归地调用自身。但是当它从递归中出来时,它对返回值不做任何处理,所以它不返回任何值

要解决这个问题,应该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

相关问题 更多 >