2013-07-06 45 views
0

我是Python和Pandas的新手。現在,我也遇到過:Gobal變量但在while循環內而不在函數中

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 
+0

爲什麼你有'pass'?使用'pass'的唯一原因是如果您想稍後編寫該代碼。如果在你的循環中,你只想在'not c [1] =='bid''時執行'else'代碼塊,那麼*這樣做*:'if c [1]!='bid':該代碼,你具備的,在最else'。 – Bakuriu

回答

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在這裏。

5

正如其他人所說,如果while條件從未如此,則會發生這種情況。他們錯過的是不能爲真,因爲NaN表現怪異== - 具體來說,np.nan == np.nan is 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值?

+0

爲什麼代碼提出:「類型錯誤:未針對此類型實現」for「while np.isnan(df [c] [i]):」?但我測試了「np.isnan(df [df.columns [1]] [ - 1])」在iPython中沒有問題。 –

+0

@TerenceNg大概是因爲'df'包含了一些非浮點事物。這也可以在最後解釋'float()'調用。也許最好在一開始就強迫所有東西浮起來,所以你以後不必擔心。 – delnan