0

我是 Python 和 Pandas 的新手。现在我遇到了:

NameError:名称“价格”未定义

我知道这是因为 while 循环。我是否需要将 while 循环放在函数容器中并使用 return/yield?还有其他选择可以达到价格变量吗?

附上我的程序的一部分:

fundspercentb = {}
for c in df.columns:
    if c[1] == 'bid':
        pass
    else:
        i = -1
        while df[c][i] == np.nan:
            i-=1
            if df[c][i] != np.nan: continue
            price=float(df[c][i])       # <----------------------------

        ma20=df[c].tail(20).astype(float).mean()
        movstd=df[c].tail(20).std()
        upperband=ma20+(2*movstd)
        lowerband=ma20-(2*movstd)
        percentb=(price-lowerband)/(upperband-lowerband)*100  # <------
        fundspercentb[c] = percentb

print fundspercent
4

2 回答 2

5

正如其他人所说,如果while条件永远不正确,就会发生这种情况。他们错过的是这不可能是真的,因为NaN行为很奇怪==- 具体来说,np.nan == np.nan是 false。改为使用np.isnan

循环的其余部分也有问题。该if ...: continue部分没有意义,它也应该使用np.isnan,或者可能完全丢弃。

如果您只想要最右边的值df[c]不是 NaN,那么可能还有一种更惯用的方式,可能是使用单个 numpy 函数(我不知道,因为我不使用 numpy)。如果做不到这一点,像这样的显式循环也可以:

i = -1
while np.isnan(df[c][i]):
    i -= 1
price = float(df[c][i])

您可能还想考虑如果df[c]只包含 NaN 会发生什么。当你在做的时候,问问自己:为什么数据中包含 NaN 值?

于 2013-07-06T16:36:34.480 回答
1

只需在循环外给它一个None00最好是,因为您稍后会对其执行算术运算)值while,因为如果您的循环永远不会运行,则price永远不会有一个值,就像这样

fundspercentb = {}
for c in df.columns:
    if c[1] == 'bid':
        pass
    else:
        i = -1
        price = 0 # Desired value here
        while df[c][i] == np.nan:
            i-=1
            if df[c][i] != np.nan: continue
            price=float(df[c][i])       # <----------------------------

        ma20=df[c].tail(20).astype(float).mean()
        movstd=df[c].tail(20).std()
        upperband=ma20+(2*movstd)
        lowerband=ma20-(2*movstd)
        percentb=(price-lowerband)/(upperband-lowerband)*100  # <------
        fundspercentb[c] = percentb

print fundspercent

请参阅math.isnan检查 NaN 的函数。(在delnan的回答中给出)

此外,您的 while 循环似乎有点可疑,

while df[c][i] == np.nan:
      i-=1
      if df[c][i] != np.nan: continue  # This Line
      price=float(df[c][i]

为什么continue它,什么时候它会break在下一次迭代中,就break在这里。

于 2013-07-06T16:25:07.367 回答