使用python和pandas的分数计算器

使用python和pandas的分数计算器,python,excel,pandas,class,oop,Python,Excel,Pandas,Class,Oop,我正在尝试制作一个简单的应用程序,通过以下公式获得任何人在测试中的分数: 分数=(成绩平均值)/差异 例如,如果你在20分中的分数是18分,而全班的平均分是15分,那么这个公式可以帮助你了解你的成绩与其他人相比如何。 我的代码在“读取点”列中打开位于我电脑中的excel文件,将它们写入列表,然后获取平均值和方差,并使用公式。 . 顺便说一句,excel中的分数仅用于测试。 我尝试过使用这些代码(我不太擅长使用类,我试图利用它): 这是第一个 class taraz: def __init__

我正在尝试制作一个简单的应用程序,通过以下公式获得任何人在测试中的分数:

分数=(成绩平均值)/差异 例如,如果你在20分中的分数是18分,而全班的平均分是15分,那么这个公式可以帮助你了解你的成绩与其他人相比如何。 我的代码在“读取点”列中打开位于我电脑中的excel文件,将它们写入列表,然后获取平均值和方差,并使用公式。 . 顺便说一句,excel中的分数仅用于测试。 我尝试过使用这些代码(我不太擅长使用类,我试图利用它): 这是第一个

class taraz:
  def __init__(self,file_name,file_dir,your_point):
      self.file_name=file_name
      self.file_dir=file_dir
      self.your_point=your_point
  def sum_ave():
      f=pandas.read_excel(r (file_dir))
      point_list=f['point'].tolist()
      sum1=sum(point_list)
      ave1=sum1/len(point_list)
  def variance():
      for i in point_list:
        var1=sqrt(((i-ave1)**2)/len(point_list))
  def taraz1():
      taraz1=(your_point-ave1)/var1
      print(taraz1)
  print(taraz1)
这是第二个:

def taraz(file_name,file_dir,your_point):
  def sum_ave():
      f=pandas.read_excel(r (file_dir))
      point_list=f['point'].tolist()
      sum1=sum(point_list)
      ave1=sum1/len(point_list)
  def variance():
      for i in point_list:
          var1=sqrt(((i-ave1)**2)/len(point_list))
  def taraz1():
      taraz1=(your_point-ave1)/var1
      print(taraz1) 
从我刚得到的第一个代码开始,输出如下: 从第二个开始,我根本没有得到任何输出。
将很高兴使用您的提示,谢谢anywas。

首先,了解变量的范围。如果一个变量是在一个方法中声明的,除非它声明为全局变量,否则只能从该方法访问它

当涉及到代码时,请在类中使用variance方法

def variance():
    for i in point_list:
        var1=sqrt(((i-ave1)**2)/len(point_list))
方差
方法将如何理解
点位
变量。它既没有定义也没有声明为全局/类变量

Second,类的方法将采用通常定义为
self
的默认参数,除非它被修饰为classmethod。了解self关键字

第三个,类将具有对象,但函数不会。因此,您无法通过函数查看绑定对象

所以,添加self关键字后的代码如下所示

from os import path


class Taraz:
    def __init__(self, file_name, file_dir, your_point):
        self.file_name = file_name
        self.file_dir = file_dir
        self.your_point = your_point
        self.point_list = None
        self.ave1 = None

    def sum_ave(self):
        f = pandas.read_excel(path.join(self.file_dir, self.file_name))
        self.point_list = f['point'].tolist()
        sum1 = sum(self.point_list)
        self.ave1 = sum1 / len(self.point_list)

    def variance(self):
        if self.point_list is not None and self.ave1 is not None:
            for i in self.point_list:
                var1 = sqrt(((i-self.ave1)**2) / len(self.point_list))

    def taraz1(self):
        taraz1 = (self.your_point - self.ave1) / var1
        print(taraz1)
编辑:

>>def func():
...     通过
...
>>>类别cla:
...     通过
...
>>>func()
>>> 
>>>cla()
>>>func
>>>cla

()
用于调用方法或函数。这里,
func
是一个函数,
cla
是一个类。当您调用一个类时,它将返回类的对象,如您所见,但当您调用函数时,它将返回函数的响应。因为我的函数在这里没有任何内容,所以它没有返回任何内容。

没有理由使用pandas从excel文件中读取内容,然后将其转换为列表并重新执行基本的向量操作,如均值和方差

从操作系统导入路径
作为pd进口熊猫
塔拉兹级:
定义初始化(self,filepath):
分数=pd.read_excel(文件路径)[“点”]
self.mean=分数.mean()
self.var=scores.var()
def分数(自我,分数):
回报率(分数-自我平均值)/自我变量
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
taraz=taraz(path.join('path','to','the','file.xlsx'))
打印(塔拉兹分数(16))
输出:

-0.012571428571428395
     name  point    scores
0    tghi     15 -0.163429
1    nghi     16 -0.012571
2   asghr     15 -0.163429
3    sbhn     20  0.590857
4    tghi     12 -0.616000
5    nghi     20  0.590857
6   asghr     17  0.138286
7    sbhn     18  0.289143
8    tghi     17  0.138286
9    nghi     16 -0.012571
10  asghr     15 -0.163429
11            12 -0.616000
在你的例子中,你有几个错误,我想评论一下

  • 变量范围很重要。如果在函数中指定变量,则该变量将仅在该函数中指定。超出此范围将引发名称错误
  • 方法第一个参数(除了一些特殊的方法外,应该称为
    self
    )是实例本身,我们可以在其中分配将存储在实例中的值,然后检索它们。例如,在上面代码的构造函数(
    \uuuuu init\uuuuu
    )方法中,我们为self.mean
    赋值,该值将存储在实例中,以便以后在out
    score
    方法中使用它
  • OOP(面向对象编程)是一种非常成熟的编码模式,但试图强制使用类来表示并不真正表示类型的内容似乎有点不必要。这可以通过单个功能轻松实现:
  • 从操作系统导入路径
    作为pd进口熊猫
    def taraz(文件路径):
    分数=pd.read\u excel(文件路径)
    平均值=分数['point']。平均值()
    var=分数['point'].var()
    分数['scores']=(分数['point']-平均值)/var
    返回分数
    如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
    打印(taraz(path.join('path','to','the','file.xlsx'))
    
    输出:

    -0.012571428571428395
    
         name  point    scores
    0    tghi     15 -0.163429
    1    nghi     16 -0.012571
    2   asghr     15 -0.163429
    3    sbhn     20  0.590857
    4    tghi     12 -0.616000
    5    nghi     20  0.590857
    6   asghr     17  0.138286
    7    sbhn     18  0.289143
    8    tghi     17  0.138286
    9    nghi     16 -0.012571
    10  asghr     15 -0.163429
    11            12 -0.616000
    

    如您所见,熊猫数据帧实现了向量运算,因此
    (scores['point']-mean)/var
    被转换为一个整数向量减去一个浮点数除以一个浮点数,该运算的结果是一个浮点数向量,我们将其存储在“scores”列中。这样我们就可以计算每一行的分数。

    您无法理解每个变量的范围。例如,在第一个示例中,
    sum\u ave
    方法中的
    file\u dir
    是什么?您希望它如何理解该变量?此外,当您可以使用
    df.mean()
    df.var()时,为什么要使用pandas从excel中读取数据,并将该数据框转换为列表,然后定义自己的均值和方差函数
    ?非常感谢。我没有意识到,如果变量不是全局变量,我就不能在函数外部使用它。但是我对'df.mean'和'df.var'不太熟悉,请您进一步解释一下。
    df
    是数据帧常用的变量名,pandas使用的是这种类型的变量。下面我的回答显示了如何直接使用这两种方法,而不是重新实现它们。
    os.path.join(self.file\u dir,self.file\u name)
    会更好。我编辑了添加样式(类以大写开头,等号两边都有空格,…),但不想在没有您同意的情况下更改实际代码中的任何内容。现在编辑为使用
    os.path.join
    而不是分隔符。非常感谢@LMKR我完全理解你的前两个反对意见,但第三个反对意见我仍然不清楚。如果可能的话,请给我进一步的解释。我想他的意思是,在你的第二个例子中,你是在函数而不是类中定义函数。这本身并不是一个错误,函数可以在任何地方声明,但是对于这个用例来说,在另一个函数中声明一个函数是没有意义的,因为它只能从另一个函数调用