2014-01-15 2 views
0

내 자신의 클래스를 정의하는 데 두 가지 문제가 있습니다. 첫째, 가장 기본적인 문제는 파이썬 스크립트를 작성하여 두 번째 스크립트로 가져 오려고 할 때 가져 오기가 실패합니다 (스크립트가 같은 디렉토리에 있음). 예를 들어, 내가 스크립트라고 first.py 썼다 : 나는 두 번째 스크립트로이 문제를 가져 오려고하면Python에서 스크립트 내에서 모듈 가져 오기 클래스

def foo(): print("foo") 

, 나는

import first 

first.foo() 

ImportError: No module named first 

둘째 '을 (를) 찾을 수없는 모듈'을 얻을를, 나는 스크립트를 썼다 비선형 회귀에 대한 클래스를 정의합니다. 스크립트는 클래스 내의 모듈을 가져옵니다. 그러나 클래스의 외부 모듈도 가져와야합니다. 모듈은 클래스 정의의 내부와 외부 모두 가져 오지 않은 경우 스크립트가 작동하지 않습니다

내가 다른 스크립트에이 클래스를 가져 오려고 내가 할 수 없기 때문에 이러한 문제가 관련되어
class NLS: 
    ''' This provides a wrapper for scipy.optimize.leastsq to get the relevant output for nonlinear least squares. 
    Although scipy provides curve_fit for that reason, curve_fit only returns parameter estimates and covariances. 
    This wrapper returns numerous statistics and diagnostics''' 
    # IMPORT THE MODULES THE FIRST TIME - WILL NOT RUN WITHOUT THESE 
    import numpy as np 
    from scipy.optimize import leastsq 
    import scipy.stats as spst 


    def __init__(self, func, p0, xdata, ydata): 

     # Check the data 
     if len(xdata) != len(ydata): 
      msg = 'The number of observations does not match the number of rows for the predictors' 
      raise ValueError(msg) 

     # Check parameter estimates 
     if type(p0) != dict: 
      msg = "Initial parameter estimates (p0) must be a dictionry of form p0={'a':1, 'b':2, etc}" 
      raise ValueError(msg) 

     self.func = func 
     self.inits = p0.values() 
     self.xdata = xdata 
     self.ydata = ydata 
     self.nobs = len(ydata) 
     self.nparm= len(self.inits) 

     self.parmNames = p0.keys() 

     for i in range(len(self.parmNames)): 
      if len(self.parmNames[i]) > 5: 
       self.parmNames[i] = self.parmNames[i][0:4] 

     # Run the model 
     self.mod1 = leastsq(self.func, self.inits, args = (self.xdata, self.ydata), full_output=1) 

     # Get the parameters 
     self.parmEsts = np.round(self.mod1[0], 4) 

     # Get the Error variance and standard deviation 
     self.RSS = np.sum(self.mod1[2]['fvec']**2) 
     self.df = self.nobs - self.nparm 
     self.MSE = self.RSS/self.df 
     self.RMSE = np.sqrt(self.MSE) 

     # Get the covariance matrix 
     self.cov = self.MSE * self.mod1[1] 

     # Get parameter standard errors 
     self.parmSE = np.diag(np.sqrt(self.cov)) 

     # Calculate the t-values 
     self.tvals = self.parmEsts/self.parmSE 

     # Get p-values 
     self.pvals = (1 - spst.t.cdf(np.abs(self.tvals), self.df))*2 

     # Get biased variance (MLE) and calculate log-likehood 
     self.s2b = self.RSS/self.nobs 
     self.logLik = -self.nobs/2 * np.log(2*np.pi) - self.nobs/2 * np.log(self.s2b) - 1/(2*self.s2b) * self.RSS 

     del(self.mod1) 
     del(self.s2b) 
     del(self.inits)   

    # Get AIC. Add 1 to the df to account for estimation of standard error 
    def AIC(self, k=2): 
     return -2*self.logLik + k*(self.nparm + 1) 

    del(np) 
    del(leastsq) 

    # Print the summary 
    def summary(self): 
     print 
     print 'Non-linear least squares' 
     print 'Model: ' + self.func.func_name 
     print 'Parameters:' 
     print "    Estimate  Std. Error  t-value  P(>|t|)" 
     for i in range(len(self.parmNames)): 
      print "% -5s   % 5.4f  % 5.4f   % 5.4f  % 5.4f" % tuple([self.parmNames[i], self.parmEsts[i], self.parmSE[i], self.tvals[i], self.pvals[i]])     
     print 
     print 'Residual Standard Error: % 5.4f' % self.RMSE 
     print 'Df: %i' % self.df 


## EXAMPLE USAGE 
import pandas as pd 
# IMPORT THE MODULES A SECOND TIME. WILL NOT RUN WITHOUT THESE 
import numpy as np 
from scipy.optimize import leastsq 
import scipy.stats as spst 

# Import data into dataframe 
respData = pd.read_csv('/Users/Nate/Documents/FIU/Research/MTE_Urchins/Data/respiration.csv') 

# Standardize to 24 h 
respData['respDaily'] = respData['C_Resp_Mass'] * 24 

# Create the Arrhenius temperature 
respData['Ar'] = -1/(8.617 * 10**-5 * (respData['Temp']+273)) 

# Define the likelihood null model 
def nullMod(params, mass, yObs): 
    a = params[0] 
    c = params[1]  
    yHat = a*mass**c 
    err = yObs - yHat 
    return(err) 


p0 = {'a':1, 'b':1} 

tMod = NLS(nullMod, p0, respData['UrchinMass'], respData['respDaily']) 

tMod.summary() 

tMod.AIC() 

tMod.logLik 

(로 첫 번째 문제에서). 아무도 나에게 무슨 일이 일어나는지 말해 줄 수 있니?

업데이트

난 그냥 스크립트를 가져올 수있는 시작했다. 시작 경로에서 그 펑키 한 클린이 마침내 어떻게 든 삭제 된 것 같습니다. 그게 뭔지 전혀 모르겠다. 그러나, 나는 아직도 왜, 내 클래스 정의에서 필요한 모듈을 가져올 경우, 나는 다른 스크립트에서도 가져와야한다는 것을 이해하지 못한다. 내 수업이 모듈을 가져 오면 전 세계적으로 가져올 필요가 없어 보인다. 이 올바른지?

+2

현재 스크립트와 같은 폴더에'first.py' 또는이'sys.path' 목록에서 경로는? – zhangxaochen

+0

클래스 정의 이전에 스크립트의 맨 위에서'numpy'와'scipy' 만 가져 오면 어떻게 될까요? 또한, 왜 'del (np)'와 'del (leastsq)'문을 가지고 있는가? 그것은 정말로 이상하게 보인다. – Evert

+0

질문의 첫 번째 부분은 다음과 같습니다. 표시하고있는 행은 테스트 스크립트에서 코드의 유일한 행입니다. – Evert

답변

1

zhangxaochen의 첫 번째 의견은 문제 번호 1의 가장 좋은 시작 지점이라고 생각합니다. sys.path는 모듈을 가져올 때 파이썬이 검색하는 모든 경로를 포함해야합니다. '() os.path.dirname (sys.argv에 [0])

다음으로 같은 디렉토리를 반환

확인 os.getcwd :이이 일을 해결하기 위해 내가 통과하려는 단계입니다 d 해당 경로가 sys.path 목록에 있는지 확인하십시오.

모두 그 확인해보세요 ....

+0

OK os.getswd()가 os.path.dirname()과 동일한 디렉토리인지 확인하는 첫 번째 진단을 시도했습니다. 그렇지 않습니다. os.getcwd()는 os.path.dirname (sys.argv [0])이/private/var/folders/zl/yxc7hlld61b6y2n5ghnn_q4h0000gn/T/Cleanup At Cleanup을 반환하는 동안/Users/Nate/Desktop을 반환합니다. 두 번째 폴더는 전 세계에서 무엇입니까? 첫 번째 스크립트는 (둘 다) 스크립트의 디렉토리입니다. sys.path를 시도하면 두 번째 이상한 파일 경로가 목록에 있지만 내 바탕 화면은 아닙니다. – Nate

+0

@ 네테, 이상 하네. 당신은 당신의 터미널 cmdline에서 다음과 같은 명령을 확인할 수있을 것입니다 :'which python' 그리고 나서'ls -l \'어떤 python \''? 실행중인 파이썬이 정말 이상한 파일에 대한 심볼릭 링크를 가지고 있다고 느낄 것입니다. Btw,'sys.path'는 첫 번째 요소로 빈 문자열'' '을 포함 할 수 있습니다.이 문자열은 현재 디렉토리, 즉 데스크탑을 나타냅니다. 따라서 Desktop이 목록에 없으면 여전히있을 수 있습니다. – Evert

+0

흠 실제로 이상하게! 왜 당신이 그것을 sys.argv [0]로 사용하는지 모르겠다. ide 또는 명령 줄에서 스크립트를 실행하고 있습니까? sys.path를 인쇄 할 때/Users/Nate/Desktop이 디렉토리 목록에 있습니까? 그 다음 아니라면 그것을 추가하고 가져 오기를 시도하십시오. – Lafleur

관련 문제