使用python和pandas的分数计算器

2024-10-01 09:41:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

分数=(成绩平均值)/差异 例如,如果你在20分中的分数是18分,而全班的平均分是15分,那么这个公式可以帮助你了解你的成绩与其他人相比如何。 我的代码在“读取点”列中打开位于我电脑中的excel文件,将它们写入列表,然后获取平均值和方差,并使用公式。 this is my excel file。 顺便说一句,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) 

从我刚得到的第一个代码开始,输出如下: <main.taraz对象位于0x02528130>; 从第二个开始,我根本没有得到任何输出。 我很乐意使用您的提示谢谢anywas


Tags: nameselfyourlendefdirexcel分数
2条回答

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

from os import path

import pandas as pd


class Taraz:
    def __init__(self, filepath):
        scores = pd.read_excel(filepath)['point']
        self.mean = scores.mean()
        self.var = scores.var()

    def score(self, score):
        return (score - self.mean) / self.var


if __name__ == '__main__':
    taraz = Taraz(path.join('path', 'to', 'the', 'file.xlsx'))
    print(taraz.score(16))

输出:

-0.012571428571428395

在你的例子中,你有几个错误,我想评论一下

  1. 变量范围很重要。如果在函数中指定变量,则该变量将仅在该函数中指定。超出此范围将引发名称错误
  2. 方法第一个参数(除了一些特殊的方法外,它应该被称为self)是实例本身,我们可以在其中分配将存储在实例中的值,然后检索它们。例如,在上面代码的构造函数(__init__)方法中,我们将一些内容分配给self.mean,该值将存储在实例中,以便稍后在outscore方法中使用它
  3. OOP(面向对象编程)是一种非常成熟的编码模式,但试图强制使用类来表示并不真正表示类型的内容似乎有点不必要。这可以通过单个功能轻松实现:
from os import path

import pandas as pd


def taraz(filepath):
    scores = pd.read_excel(filepath)
    mean = scores['point'].mean()
    var = scores['point'].var()
    scores['scores'] = (scores['point'] - mean) / var
    return scores


if __name__ == '__main__':
    print(taraz(path.join('path', 'to', 'the', 'file.xlsx')))

输出:

     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”列中。这样我们计算每一行的分数

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

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

def variance():
    for i in point_list:
        var1=sqrt(((i-ave1)**2)/len(point_list))

variance方法将如何理解point_lits变量。它既没有定义也没有声明为全局/类变量

其次,类的方法将采用通常定义为self的默认参数,除非它被修饰为classmethodcheck here了解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():
...     pass
...
>>> class cla:
...     pass
...
>>> func()
>>> 
>>> cla()
<__main__.cla object at 0x0000019A55944550>
>>> func
<function func at 0x0000019A552D2EA0>
>>> cla
<class '__main__.cla'>

()用于调用方法或函数。这里func是一个函数cla是一个类。当您调用一个类时,它将返回该类的对象,因此您可以看到<main.cla对象位于0x0000019A5594450>;,但当您调用函数时,它将返回函数的响应。因为我的函数在这里没有任何内容,所以它没有返回任何内容

相关问题 更多 >