编写两个类的代码以查找最小二乘回归数据

时间:2017-12-01 08:10:53

标签: python

我正在为分配编写代码,要求您从.txt文件导入数据并创建两个类类型以查找最小二乘回归和其他相关值的值。数据为BMI与收缩压,将被读入两个不同的列表,即x值和y值。

当我的shell窗口突然关闭时,我试图对类的不同函数运行测试。重新打开它后,我发现我无法运行其中一个类的代码以及用于将数据读入列表的部分代码。这是错误消息:ModuleNotFoundError:没有名为' data'

的模块

这是.py文件中用于将代码读入列表的代码。我不认为这是问题所在的列表,但我不确定是什么:

from data import Data
from linear_regression import SLR

def read_data(input_file_name):
    """ (str) -> list, list

    Read data from the path specified by the string input_file.
    Data looks like:

    18  120
    20  110
    22  120
    25  135

    Output two lists, one for each column of data.

    """
    list1 = []
    list2 = []
    read = open(input_file_name, 'r')
    read2 = read.readlines()
    lines = [line.strip() for line in read2]
    for new_line in lines:
        list1.append(float(new_line.split('  ')[0]))
        list2.append(float(new_line.split('  ')[1]))
    return list1, list2

filename = 'bmi_vs_sbp.txt'
x, y = read_data(filename)
dat = Data(x,y)
lm = SLR(dat)
print(lm)

对于没有运行的课程,我不认为实际的功能本身存在问题,但是在定义类和函数之前,最重要的是:

from data import Data

class SLR:
    def __init__(self, data):
        """ (SLR, Data) -> NoneType

        Create a new simple linear regression object from data,
        with three attributes: data, beta0, and beta1.
        """
        self.data = data
        self.beta0, self.beta1 = data.compute_least_squares_fit()

    def predict(self, x):
        """ (SLR, number) -> number

        Return predicted value at x.
        """
        x_new = self.x = x
        y_new = self.beta0 + self.beta1*x_new
        return y_new

    def compute_residuals(self):
        """ (SLR) -> list

        Return the residuals in a list of numbers.
        """
        residuals = []
        for i in range(len(self.data.x)):
            residuals.append(self.data.y[i] - self.beta0 - self.beta1*self.data.x[i])
        return residuals

    def compute_SSResid(self):
        """ (SLR) -> number

        Return the sum of square residuals (SSResid).
        """
        residuals = self.compute_residuals()
        SSResid = 0
        for i in range(len(self.data.x)):
            SSResid += pow(residuals[i],2)
        return SSResid

    def compute_residual_sd(self):
        """ (SLR) -> number

        Return the residual standard deviation.
        """
        residuals = self.compute_residuals()
        residual_sd = pow(self.compute_SSResid()/(len(self.data.x)-2), 1/2)
        return residual_sd

    def compute_rsquared(self):
        """ (SLR) -> number

        Return the R-squared of the SLR fit.
        """
        rsquared = 1 - (self.compute_SSResid()/self.data.compute_SST())
        return rsquared

    def __str__(self):
        """ (SLR) -> str

        Return a string representation of an SLR in this format:

        Least squares fit on 10 data points.
        Intercept = 45.584331
        Slope = 3.465523
        Residual standard deviation = 13.051139
        R-squared = 0.731364
        """
        return print('Least squares fit on {} data points.''\n'
            'Intercept = {:.6f}''\n'
            'Slope = {:.6f}''\n'
            'Residual standard deviation = {:.6f}''\n'
            'R-squared = {:.6f}'.format(self.data.num_obs(), self.beta0, self.beta1, self.compute_residual_sd(), self.compute_rsquared()))

导入模块代码属于赋值中的给定代码。需要导入第一个类Data,以便可以在SLR中使用Data中定义的函数。数据函数仍然运行,我已经尝试重新启动,但我仍然收到错误消息,没有模块称为数据。对此有任何帮助将非常感激。

1 个答案:

答案 0 :(得分:0)

当在代码的第一行中创建import语句时,python解释器会查找该名称的文件/类。说这是你的文件夹结构:

workspace
  |
  +- other_stuff
  +- python
       |
       +- data.py
       +- SLR.py

如果您的shell位于您的工作区中并且您运行$ python python/SLR.py,则python将首先查看您的PYTHONPATH,然后查看您当前所在文件/类的任何位置。在这种情况下,这将是workspace - 没有名为data.py的文件,因此它会导致导入错误。如果你从python文件夹中调用$ python SLR.py,那么data.py就会在那里执行,并且没有问题。

可能发生的事情是,上次执行程序时,您与保存data.py的文件位于同一文件夹中,当它崩溃时,您从其他地方调用了代码。

解决此问题的最佳方法可能是将保存data内容的文件夹的位置添加到PYTHONPATH中,如链接中所述。