当我使用另一个数据帧的参数生成数据帧时,为什么会出现递归错误?

2024-04-24 16:56:33 发布

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

我生成dataframe获取您的持有量,并使用dataframe.apply发送每一行以获取基金持有量。 我甚至不确定这是否是正确的方法,但在我解决我在测试文件中注意到的问题之前,我在尝试生成数据帧时遇到了一个递归错误——见下文

import pandas as pd


def get_your_holdings():
    your_holdings = [['foo', 100], ['bar', 200]]
    df = pd.DataFrame(your_holdings, columns=['Symbol', 'Equity'])
    return df


def get_fund_holdings(symbol, equity):

    # IRL, foo and bar are scraped, instead of being kept as lists in the code...
    foo = [['aapl', 0.6], ['amzn', 0.3], ['msft', 0.2]]
    bar = [['tsla', 0.4], ['amzn', 0.5], ['goog', 0.2]]

    df = pd.DataFrame(symbol, columns=['Symbol', '% Holding'])
    total_equity = equity * 100
    df['% Holding'] = total_equity * df['% Holding']

    df.rename(columns={'% Holding': 'Equity'}, inplace=True)

    return df


def main():
    df = get_your_holdings()

    # certainly not sure if this is right.
    # was originally going to ask about this
    # but want to make sure get_fund_holding works
    results = (df.apply(lambda x: get_fund_holdings(x['Symbol'], x['Equity']), axis=1, result_type='expand'))
    breakpoint()

if __name__ == "__main__":
    main()

不确定完全回溯是否有用,因为它相当长。亮点包括:

  File "C:/Users/jajam/PycharmProjects/heatmap/test.py", line 31, in <lambda>
    results = (df.apply(lambda x: get_fund_holdings(x['Symbol'], x['Equity']), axis=1, result_type='expand'))
  File "C:/Users/jajam/PycharmProjects/heatmap/test.py", line 16, in get_fund_holdings
    df = pd.DataFrame(symbol, columns=['Symbol', '% Holding'])
  File "C:\Users\jajam\anaconda3\envs\finance\lib\site-packages\pandas\core\frame.py", line 590, in __init__
    raise ValueError("DataFrame constructor not properly called!")
ValueError: DataFrame constructor not properly called!

RecursionError: maximum recursion depth exceeded while calling a Python object
Unexpected error, recovered safely.

我该怎么称呼这个呢?我也不确定如何解析从lamdax返回的数据,但我想问一个单独的问题,这里的语法是否正确


Tags: columnsindataframedfyourgetdefsymbol
1条回答
网友
1楼 · 发布于 2024-04-24 16:56:33

请至少对您的程序进行最低限度的跟踪:

def get_fund_holdings(symbol, equity):
    print("ENTER get_fund_holdings", symbol, equity)
    
    # IRL, foo and bar are scraped, instead of being kept as lists in the code...
    foo = [['aapl', 0.6], ['amzn', 0.3], ['msft', 0.2]]
    bar = [['tsla', 0.4], ['amzn', 0.5], ['goog', 0.2]]

    df = pd.DataFrame(symbol, columns=['Symbol', '% Holding'])

这给出了输出

ENTER get_fund_holdings foo 100
Traceback (most recent call last):
...

这使得问题变得显而易见:DataFrame构造函数要求第一个参数是data,即以某种公认的2D格式放入数据帧的内容。你给它的只是一个字符串,"foo"。这就是建筑失败的原因

您似乎期望字符串"foo"将神奇地理解为变量foo的引用。变量不是这样工作的:数据值和变量名作为不同的实体

相反,您必须明确地设置对应关系;我添加了更多跟踪功能,向您展示了以下功能:

def get_fund_holdings(symbol, equity):
    print("ENTER get_fund_holdings", symbol, equity)
    
    # IRL, foo and bar are scraped, instead of being kept as lists in the code...
    ticker = {
        "foo": [['aapl', 0.6], ['amzn', 0.3], ['msft', 0.2]],
        "bar": [['tsla', 0.4], ['amzn', 0.5], ['goog', 0.2]]
    }

    df = pd.DataFrame(ticker[symbol], columns=['Symbol', '% Holding'])
    print("TRACE\n", df)
    total_equity = equity * 100
    df['% Holding'] = total_equity * df['% Holding']

    df.rename(columns={'% Holding': 'Equity'}, inplace=True)
    print("GFH TRACE\n", df)

    return df

输出:

ENTER get_fund_holdings foo 100
TRACE
   Symbol  % Holding
0   aapl        0.6
1   amzn        0.3
2   msft        0.2
GFH TRACE
   Symbol  Equity
0   aapl  6000.0
1   amzn  3000.0
2   msft  2000.0
ENTER get_fund_holdings bar 200
TRACE
   Symbol  % Holding
0   tsla        0.4
1   amzn        0.5
2   goog        0.2
GFH TRACE
   Symbol   Equity
0   tsla   8000.0
1   amzn  10000.0
2   goog   4000.0
Traceback (most recent call last):
...

在这里,您得到了一个新的错误,它基于一个后续的结构问题。这将由您自己来解决,或者是一个单独的堆栈溢出帖子

相关问题 更多 >