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

Why am I getting a recursive error when I generate dataframe with an argument from another dataframe?

我生成数据帧 get_your_holdings,并使用 dataframe.apply 将每一行发送到 get_fund_holdings。 我什至不确定这是正确的方法,但在我解决我在此处的测试文件中注意到的问题之前,我在尝试生成数据帧时遇到了递归错误——见下文。

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.

有什么方法可以调用它吗?我也不确定如何解析我从 lamda x 返回的数据,但是当这里的语法实际上正确时我打算提出一个单独的问题。

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

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):
...

在这里,你得到一个新的错误,基于后续的结构问题。那将由您自己弄清楚,或者单独的 Stack Overflow post.