내 자신의 클래스를 정의하는 데 두 가지 문제가 있습니다. 첫째, 가장 기본적인 문제는 파이썬 스크립트를 작성하여 두 번째 스크립트로 가져 오려고 할 때 가져 오기가 실패합니다 (스크립트가 같은 디렉토리에 있음). 예를 들어, 내가 스크립트라고 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
(로 첫 번째 문제에서). 아무도 나에게 무슨 일이 일어나는지 말해 줄 수 있니?
업데이트
난 그냥 스크립트를 가져올 수있는 시작했다. 시작 경로에서 그 펑키 한 클린이 마침내 어떻게 든 삭제 된 것 같습니다. 그게 뭔지 전혀 모르겠다. 그러나, 나는 아직도 왜, 내 클래스 정의에서 필요한 모듈을 가져올 경우, 나는 다른 스크립트에서도 가져와야한다는 것을 이해하지 못한다. 내 수업이 모듈을 가져 오면 전 세계적으로 가져올 필요가 없어 보인다. 이 올바른지?
현재 스크립트와 같은 폴더에'first.py' 또는이'sys.path' 목록에서 경로는? – zhangxaochen
클래스 정의 이전에 스크립트의 맨 위에서'numpy'와'scipy' 만 가져 오면 어떻게 될까요? 또한, 왜 'del (np)'와 'del (leastsq)'문을 가지고 있는가? 그것은 정말로 이상하게 보인다. – Evert
질문의 첫 번째 부분은 다음과 같습니다. 표시하고있는 행은 테스트 스크립트에서 코드의 유일한 행입니다. – Evert