Python 无法识别函数中的数据帧名称

Python 无法识别函数中的数据帧名称,python,function,dataframe,nameerror,Python,Function,Dataframe,Nameerror,我想问一下是否有人能帮我解决这个问题——我之前也看过类似的帖子,但真的找不到解决这个问题的方法。我对下面的代码有一个问题,特别是我得到了错误df_name.loc[ticker.time]=ticker.last 名称错误:未定义名称“df_name”。代码似乎无法识别我之前在函数中创建的数据帧的变量名,奇怪的是,如果我首先在函数外部创建数据帧,它似乎可以工作,但我真的需要它在函数中,因为它允许我调用几个变量来启动整个过程。如有任何帮助,将不胜感激,代码如下。出于某种原因,下面的代码片段似乎有点

我想问一下是否有人能帮我解决这个问题——我之前也看过类似的帖子,但真的找不到解决这个问题的方法。我对下面的代码有一个问题,特别是我得到了错误df_name.loc[ticker.time]=ticker.last 名称错误:未定义名称“df_name”。代码似乎无法识别我之前在函数中创建的数据帧的变量名,奇怪的是,如果我首先在函数外部创建数据帧,它似乎可以工作,但我真的需要它在函数中,因为它允许我调用几个变量来启动整个过程。如有任何帮助,将不胜感激,代码如下。出于某种原因,下面的代码片段似乎有点缩进,在真实的版本中,这一切都是正确的。谢谢你们,利奥


def five_min_momentum_stock(合约报价器,df_名称):
合同名称=股票(合同代码“SMART”、“USD”)
ib.qualifyContracts(合同名称)
ib.REQUMKTDATA(合同名称)
df_name=pd.DataFrame(列=['date','last'])
df_name.set_index('date',inplace=True)
def新_数据(报价器):
对于自动售检票机中的自动售检票机:
全局df_名称
df_name.loc[ticker.time]=ticker.last
打印(df_名称)
五分钟前=df\u name.index[-1]-pd.Timedelta(分钟=1)
如果df_name.index[0]<五分钟前:
df_name=df_name[五分钟前:]
price_min=df_name['last'].min()
price_max=df_name['last'].max()
如果df_name['last'].iloc[-1]>价格_min*1.001:
下订单(“购买”)
elif df_name['last'].iloc[-1]
正如上面Amit Vikram Singh所建议的,在位于不同函数中的变量前面使用非局部变量对我来说很有效

第一个函数代码需要缩进Hi抱歉是的,缩进是正确的,第一个函数包含其余的函数,只是由于某种原因无法在此处反映它
df\u name
是函数
five\u minum\u stock
中的局部变量,它不是一个全局变量,因此不能作为全局变量访问。谢谢,我没有办法使它成为全局变量吗?因此允许新的数据函数使用它?由于
新的数据
函数位于
五分钟动量股
内,因此您可以直接使用
df\u name
def five_min_momentum_stock(contract_ticker, df_name):
contract_name = Stock(contract_ticker, 'SMART', 'USD')
ib.qualifyContracts(contract_name)
ib.reqMktData(contract_name)

df_name = pd.DataFrame(columns=['date', 'last'])
df_name.set_index('date', inplace=True)

def new_data(tickers):
    for ticker in tickers:
        global df_name
        df_name.loc[ticker.time] = ticker.last
    print(df_name)
    five_mins_ago = df_name.index[-1] - pd.Timedelta(minutes=1)

    if df_name.index[0] < five_mins_ago:
        df_name = df_name[five_mins_ago:]

        price_min = df_name['last'].min()
        price_max = df_name['last'].max()

        if df_name['last'].iloc[-1] > price_min * 1.001:
            place_order('BUY')

        elif df_name['last'].iloc[-1] < price_max * 0.999:
            place_order('SELL')

def place_order(direction):
    contract_order = MarketOrder(direction, 1)
    trade = ib.placeOrder(contract_name, contract_order)
    time.sleep(3)
    #ib.sleep(3)
    if trade.orderStatus.status == 'PendingSubmit':
        ib.disconnect()
        quit(0)

ib.pendingTickersEvent += new_data

five_min_momentum_stock('GME', 'gme_frame')

ib.run()