彩世界平台-彩世界时时app-彩世界开奖app苹果下载

热门关键词: 彩世界平台,彩世界时时app,彩世界开奖app苹果下载

您的位置:彩世界平台 > 彩世界平台 > Python分析学校四六级过关情况,python四六级

Python分析学校四六级过关情况,python四六级

发布时间:2019-08-31 17:05编辑:彩世界平台浏览(107)

    Python分析学校四六级过关情况,python四六级

    这段时间看了数据分析方面的内容,对Python中的numpy和pandas有了最基础的了解。我知道如果我不用这些技能做些什么的话,很快我就会忘记。想起之前群里发过一个学校的四六级成绩表,正好可以用来熟悉一下pandas中的一些用法。

    1.数据介绍。

    成绩表中包含的字段十分详细,里面有年级、性别、姓名、分数等等的一系列内容,我只想简单的分析一下我们学校的四六级过关率而已,所以去除了一些不必要的字段。留下的有如下几个字段:

    彩世界开奖app苹果下载 1

    第一列是自增的序号,没有什么实际意义。

    第二列就是代表着该学生参加的是四级还是六级。

    第三列是我们学校的院系名称。

    第四列是学校院系的各个专业。

    第五列是年级,13代表着2013年入学。

    第六列是性别。

    后面的三列分别是总分、听力、阅读、写作等。

    其中总分为0的都是缺考的。一共有接近9000条数据(没有报名的不在其中)。

    2.预期结果。

    我想利用这些数据最终通过图标的形式展示出以下几点:

    1.各个学院的四六级平均分。

    2.各个学院的四六级过关人数。

    3.各个学院的各个年级过关人数。

    4.各个年级的过关人数。

    5.男生女生分别过关人数。

    最终结果:

    各个学院的四六级过关人数:

    彩世界开奖app苹果下载 2

    3.实现过程。

    (1)导入依赖包。

    程序分别使用了pandas进行分组转换,和matplotlib提供的绘图功能。

    import pandas as pd
    import matplotlib.pylab as plt
    

    (2)加载数据。

    彩世界平台,想要分析数据自然要得到数据了,我将整理的数据存放在sj.xls中,是一个Excel类型的数据。
    这一步使用pandas的read_excel即可,生成一个DataFrame对象。

    #加载全部数据
    sj = pd.read_excel(r'F:DataAnalysissj.xls')
    

    加载完之后输出一下看看内容:

    彩世界开奖app苹果下载 3

    彩世界开奖app苹果下载,除了排版没有对齐之外其他都一样。

    (3)统计各个学院平均分。

    在这里就可以完成我们预期的第一个结果:

    各个学院的四六级平均分:

    想要各个学院的情况当然是要根据学院来进行分组了,同时也需要分出“CET4”和“CET6”两组。使用groupby即可,这样会生成一个SeriesGroupBy对象,然后再调用mean函数(默认是轴0计算,也就是我们想要的结果)即可统计出平均分情况。

    #按照各个学院进行分组
    xymean = sj['总分'].groupby([sj['院系名称'],sj['语言级别']])
    
    #计算各个学院的平均分数
    xymean = xymean.mean()
    

    这个时候将其输出的话会得到如下结果:

    彩世界开奖app苹果下载 4

    由于院系名称和语言级别是层次化索引的缘故,看起来并不是十分的友好,因此使用unstack将语言级别转从行转换为列。

    xymean = xymean.unstack(level='语言级别')
    

    再次输出的话结果就比较清晰了

    彩世界开奖app苹果下载 5

    使用pandas的绘图功能进行绘图:

    #使用横向柱状图显示
    xymean.plot(kind='barh')
    
    #在PyCharm中需要使用,在Ipython环境中如果以--pylab形式打开就不需要
    plt.show()
    

    运行一下看看结果:

    彩世界开奖app苹果下载 6

    可以看到这时候数据的结果都能够显示出来了,但是中文部分出现了问题,不过不要紧,科学上网一查就解决了:

    添加一下代码即可:

    import matplotlib as mpl
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    mpl.rcParams['font.serif'] = ['SimHei']
    

    再次运行就OK了。

    彩世界开奖app苹果下载 7

    接下来要分析过关的情况了。

    (4)筛选数据。

    既然已经有了所有的数据内容了,下一步就是筛选出所有过关的人数了。

    #过滤出过关人数
    sjpass = sj[sj['总分'] >= 425]
    

    这时候sjpass存放的就是所有的过关人数了。

    彩世界开奖app苹果下载 8

    在输出结果的最下面就可以看到一共有1507行数据,当然也可以使用len()或者shape[0]查看共有多少行。

    (5)各个学院的四六级过关人数。

    已经有了全部过关人的数据了,接下来根据预期结果进行分组即可。同样的根据“院系名称”和“语言级别”对总分进行分组,然后使用count函数进行求和最后再用unstack进行调整绘图展示。

    #按照各个学院进行分组
    xypass = sjpass['总分'].groupby([sjpass['院系名称'],sjpass['语言级别']])
    
    
    #计算各个学院的过关总人数
    xypass = xypass.count()
    
    #将语言级别作为columns
    xypass = xypass.unstack(level='语言级别')
    
    #进行绘图
    xypass.plot(kind='barh')
    plt.show()
    

    绘图结果:

    彩世界开奖app苹果下载 9

    (6)各个学院的各个年级过关人数。。

    这次分组的时候加上年级即可,并且为了绘图比较好看一点,这次可以将“年纪”转换为列,并且像12年这种的有些学员已经没有人参加了,所以需要将缺失值用0填充:

    #按照各个学院和年级进行分组
    xypass = sjpass['总分'].groupby([sjpass['院系名称'],sjpass['语言级别'],sjpass['年级']])
    
    #计算各个学院的过关总人数
    xypass = xypass.count()
    
    #将语言级别作为columns,并且将缺失值用0进行填充
    xypass = xypass.unstack(level='年级').fillna(0)
    
    xypass.plot(kind='barh')
    plt.show()
    

    绘图结果:

    彩世界开奖app苹果下载 10

    (7)各个年级的过关人数。

    使用groupby对年级进行分组即可:

    #-----------------各个年级过关人数------------------
    njpass = sjpass['总分'].groupby([sjpass['年级'],sjpass['语言级别']]).count().unstack(level='语言级别')
    njpass.plot(kind='barh')
    plt.show()
    

    绘图结果:

    彩世界开奖app苹果下载 11

    (8)男生女生分别过关人数。

    将性别和语言级别进行分组:

    #---------------男生女生过关情况----------------------
    nvpass = sjpass['总分'].groupby([sjpass['性别'],sjpass['语言级别']]).count().unstack(level='语言级别')
    nvpass.plot(kind='bar')
    plt.show()
    

    绘图结果:

    彩世界开奖app苹果下载 12

    4.结果分析。

    从绘图的结果上来看的话,各个学院之间音乐学院的平均分比较低,艺术设计和外国语学院的平均分都比较高,但是过关人数却没有那么的多,尤其是艺术设计的人数比较少,主要也是因为该学院的总人数比较少。

    四级的过关人数明显比六级的人数多的多,而且因为15级是大二年级,在我们学校大二才可以参加四六级考试,所以过关的人数里面15级占有比较大的比分。

    而且不得不承认,女生的过关率要比男生高的不止一点。

    源码以及数据:

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持帮客之家。

    这段时间看了数据分析方面的内容,对Python中的numpy和pandas有了最基础的了解。我知道如果我不...

    分析在Python中何种情况下需要使用断言,python何种情况

    这个问题是如何在一些场景下使用断言表达式,通常会有人误用它,所以我决定写一篇文章来说明何时使用断言,什么时候不用。

    为那些还不清楚它的人,Python的assert是用来检查一个条件,如果它为真,就不做任何事。如果它为假,则会抛出AssertError并且包含错误信息。例如:  

    py> x = 23
    py> assert x > 0, "x is not zero or negative"
    py> assert x%2 == 0, "x is not an even number"
    Traceback (most recent call last):
    File "", line 1, in
    AssertionError: x is not an even number
    

    很多人用assert作为一个很快和容易的方法来在参数错误的时候抛出异常。但这样做是错的,非常错误,有两个原因。首先AssertError不是在测试参数时应该抛出的错误。你不应该像这样写代码:  

    if not isinstance(x, int):
    raise AssertionError("not an int")
    

    你应该抛出TypeError的错误,assert会抛出错误的异常。

    但是,更危险的是,有一个关于assert的困扰:它可以被编译好然后从来不执行,如果你用 –O 或 –oo 选项运行Python,结果不保证assert表达式会运行到。当适当的使用assert时,这是未来,但是当assert不恰当的使用时,它会让代码用-O执行时出错。

    那什么时候应该使用assert?没有特定的规则,断言应该用于:

    •     防御型的编程
    •     运行时检查程序逻辑
    •     检查约定
    •     程序常量
    •     检查文档

    (在测试代码的时候使用断言也是可接受的,是一种很方便的单元测试方法,你接受这些测试在用-O标志运行时不会做任何事。我有时在代码里使用assert False来标记没有写完的代码分支,我希望这些代码运行失败。尽管抛出NotImplementedError可能会更好。)

    关于断言的意见有很多,因为它能确保代码的正确性。如果你确定代码是正确的,那么就没有用断言的必要了,因为他们从来不会运行失败,你可以直接移除这些断言。如果你确定检查会失败,那么如果你不用断言,代码就会通过编译并忽略你的检查。

    在以上两种情况下会很有意思,当你比较肯定代码但是不是绝对肯定时。可能你会错过一些非常古怪的情况。在这个情况下,额外的运行时检查能帮你确保任何错误都会尽早地被捕捉到。

    另一个好的使用断言的方式是检查程序的不变量。一个不变量是一些你需要依赖它为真的情况,除非一个bug导致它为假。如果有bug,最好能够尽早发现,所以我们为它进行一个测试,但是又不想减慢代码运行速度。所以就用断言,因为它能在开发时打开,在产品阶段关闭。

    一个非变量的例子可能是,如果你的函数希望在它开始时有数据库的连接,并且承诺在它返回的时候仍然保持连接,这就是函数的不变量:  

    def some_function(arg):
      assert not DB.closed()
      ... # code goes here
      assert not DB.closed()
      return result
    

    断言本身就是很好的注释,胜过你直接写注释:

    # when we reach here, we know that n > 2

    你可以通过添加断言来确保它:

    assert n > 2

    断言也是一种防御型编程。你不是让你的代码防御现在的错误,而是防止在代码修改后引发的错误。理想情况下,单元测试可以完成这样的工作,可是需要面对的现实是,它们通常是没有完成的。人们可能在提交代码前会忘了运行测试代码。有一个内部检查是另一个阻挡错误的防线,尤其是那些不明显的错误,却导致了代码出问题并且返回错误的结果。

    加入你有一些if…elif 的语句块,你知道在这之前一些需要有一些值:  

    # target is expected to be one of x, y, or z, and nothing else.
    if target == x:
      run_x_code()
    elif target == y:
      run_y_code()
    else:
      run_z_code()
    

    假设代码现在是完全正确的。但它会一直是正确的吗?依赖的修改,代码的修改。如果依赖修改成 target = w 会发生什么,会关系到run_w_code函数吗?如果我们改变了代码,但没有修改这里的代码,可能会导致错误的调用 run_z_code 函数并引发错误。用防御型的方法来写代码会很好,它能让代码运行正确,或者立马执行错误,即使你在未来对它进行了修改。

    在代码开头的注释很好的一步,但是人们经常懒得读或者更新注释。一旦发生这种情况,注释会变得没用。但有了断言,我可以同时对代码块的假设书写文档,并且在它们违反的时候触发一个干净的错误  

    assert target in (x, y, z)
    if target == x:
      run_x_code()
    elif target == y:
      run_y_code()
    else:
      assert target == z
      run_z_code()
    

    这样,断言是一种防御型编程,同时也是一种文档。我想到一个更好的方案:  

    if target == x:
      run_x_code()
    elif target == y:
      run_y_code()
    elif target == z:
      run_z_code()
    else:
      # This can never happen. But just in case it does...
      raise RuntimeError("an unexpected error occurred")
    

    按约定进行设计是断言的另一个好的用途。我们想象函数与调用者之间有个约定,比如下面的:

    “如果你传给我一个非空字符串,我保证传会字符串的第一个字母并将其大写。”

    如果约定被函数或调用这破坏,代码就会出问题。我们说函数有一些前置条件和后置条件,所以函数就会这么写:  

    def first_upper(astring):
      assert isinstance(astring, str) and len(astring) > 0
      result = astring[0].upper()
      assert isinstance(result, str) and len(result) == 1
      assert result == result.upper()
      return result
    

    按约定设计的目标是为了正确的编程,前置条件和后置条件是需要保持的。这是断言的典型应用场景,因为一旦我们发布了没有问题的代码到产品中,程序会是正确的,并且我们能安全的移除检查。

    下面是我建议的不要用断言的场景:

    •     不要用它测试用户提供的数据
    •     不要用断言来检查你觉得在你的程序的常规使用时会出错的地方。断言是用来检查非常罕见的问题。你的用户不应该看到任何断言错误,如果他们看到了,这是一个bug,修复它。
    •     有的情况下,不用断言是因为它比精确的检查要短,它不应该是懒码农的偷懒方式。
    •     不要用它来检查对公共库的输入参数,因为它不能控制调用者,所以不能保证调用者会不会打破双方的约定。
    •     不要为你觉得可以恢复的错误用断言。换句话说,不用改在产品代码里捕捉到断言错误。
    •     不要用太多断言以至于让代码很晦涩。

    这个问题是如何在一些场景下使用断言表达式,通常会有人误用它,所以我决定写一...

    本文由彩世界平台发布于彩世界平台,转载请注明出处:Python分析学校四六级过关情况,python四六级

    关键词:

上一篇:武道之路-炼体期六重天巅峰

下一篇:没有了