2020春季學期信號與系統課堂參與信息處理

 

■ 簡介


這部分信息來自於學生通過公衆號TSINGHUAZHUOQING參與信號與系統課程教學活動,部分內容可以參見博文“ 上課玩手機 ”中的介紹。

由於今年 Coronavirus-19 疫情的影響, 信號與系統分析課程 今年就比較多的依賴於基於公衆號的課堂交互。其中包括三部分內容:

  1. 學生動態提問;
  2. 課堂討論
  3. 課件作業小測試

因此,分析公衆號課堂參與數據,可以在一定程度反映學生平時學習的基本數據。

 

01公衆號記錄數據格式


記錄文件包括:

  • PHONENAME.CFG: 微信端顯示的一些配置文件。詳細參見TEASOFT軟件說明。

  • PHONENAME.TXT:記錄公衆號等級信息,具體格式如下:

  • PHONENAME_DATA.TXT:具體格式如下:

數據記錄共有20項,這些項的定義爲:
前10項是固定的定義,在下面查詢後給出了前十項的定義:

▲ 在公衆號輸入 m 1445(查詢學生的學號後四位)顯示的內容

▲ 在公衆號輸入 m 1445(查詢學生的學號後四位)顯示的內容

後10項的定義,是由PHONENAME.CFG給出定義。在TITLE中給出了定義的部分,會顯示,否則不會顯示。

 

02數據處理


1.形成中間格式數據

結合PHONENAME.TXT, PHONENAME_DATA.TXT兩個文件,形成如下格式的中間文件:
學號 姓名 問題(3) 正確(4) 分數(5) 獎勵(7) 時間(8)的記錄文件

□ 遇到的問題

(1) TEXT中的文字錯誤:
在PHONENAME.TXT文件存在着異常字符,如下,使得在PYTHON在讀取文字時出現錯誤報告。

查詢學生原始文件修改對應的金XX文字。

(2)原始PHONENAME格式錯誤:
(‘謝司南’, ‘自82’, ‘08768682118’) :沒有輸入學號
(‘劉澤源’, ‘自85’, ‘08148740305’) :學號與班級顛倒
(‘牛一涵’, ‘自83’, ‘02414128722’)
(‘李申奧’, ‘自83’, ‘02350336881’)

2.統計結果

處理後對於分值的統計結果

▲ 回答問題個數

▲ 回答問題個數

▲ 回答問題正確數量

▲ 回答問題正確數量

▲ 得到分數

▲ 得到分數

▲ 獎勵分數

▲ 獎勵分數

▲ 回答所使用時間

▲ 回答所使用時間

3.分數綜合

下面將 回答問題次數+得分+獎勵進行統計如下:

▲ 回答問題+得分+獎勵分數分佈

▲ 回答問題+得分+獎勵分數分佈

通過以上觀察,可以看到絕大部分的得分處在150~290分之間。通過線性仿射變換,將得分映射到(50,100)\left( {50,100} \right)。計r=r[0]+r[1]+r[3]r = r\left[ 0 \right] + r\left[ 1 \right] + r\left[ 3 \right]分別是問題次數,得分,獎勵的累加和,最終的得分由下公式求得:

rec = [((d[0] + d[1] + d[3]) - 150)/(285-150)*50+50 for d in rec]
rect = [min(max(x,50),100) for x in rec]
plt.hist(rect, 50, alpha=0.75)
plt.grid(True)

▲ 經過映射後的得分統計情況

▲ 經過映射後的得分統計情況

 

03生成課堂交互EXCEL


生成兩個EXCEL文件:

SSXY-WECHAT, SSAU_WECHAT。具有Wechat表單。結構如下:

▲ 記錄課堂交互的EXCEL文件結構

▲ 記錄課堂交互的EXCEL文件結構

 

※ 相關子程序


1.課堂成績統計子程序

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# WCCOMB.PY                    -- by Dr. ZhuoQing 2020-06-23
#
# Note:
#============================================================

from head import *

pnid = 24
pndata = 25

idfile = tspgetdopfile(pnid)
datafile = tspgetdopfile(pndata)

printf(idfile, datafile)

#------------------------------------------------------------

iddim = []
namedim = []
wcdim = []
recdim = []

with open(idfile, 'r', encoding='gbk') as f:
    for l in (f.readlines()):
        l.rstrip('\n')
        lsect = l.split()
        if len(lsect) < 3: continue

        iddim.append(lsect[2])
        namedim.append(lsect[1])
        wcdim.append(lsect[0])
        recdim.append((0,0,0,0,0))

for d in zip(namedim, iddim, wcdim):
    if len(d[1]) < 5:
        printf(d)

#printf(iddim, namedim, wcdim)
#printf(len(iddim))

#------------------------------------------------------------

with open(datafile, 'r', encoding='gbk') as f:
    for l in (f.readlines()):
        l.rstrip('\n')
        lsect = l.split()

        if len(lsect) < 20:
            printf(l)
            continue

        id = namedim.index(lsect[0])
        if id < 0:
            printf(l)
            continue

        recdim[id] = (int(lsect[4]), int(lsect[5]), int(lsect[6]), int(lsect[8]), int(lsect[9]))

tspsave('normalrect', name=namedim, id=iddim, rec=recdim)

printf('\a')

#------------------------------------------------------------
#        END OF FILE : WCCOMB.PY
#============================================================

(2)生成EXCEL程序:

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# WC2EXCEL.PY                  -- by Dr. ZhuoQing 2020-06-23
#
# Note:
#============================================================

from headm import *
from inforsub               import *

name, id, rec = tspload('normalrect', 'name', 'id', 'rec')
rec = [((d[0] + d[1] + d[3]) - 150)/(285-150)*50+50 for d in rec]
rect = [min(max(x,50),100) for x in rec]

wcau = tspstring2text('wcau')
wcxy = tspstring2text('wcxy')

excelfile = pd.read_excel(wcau, sheet_name='Wechat')
listdata = excelfile.values.tolist()

id = list(id)

#------------------------------------------------------------
for n,l in enumerate(listdata):

    if str(l[0]) not in id:
        printf('%s not in record.'%l)
        continue

    index = id.index(str(l[0]))
    if index >= 0:
        excelfile.iat[n, 2] = rect[index]
    else:
        excelfile.iat[n, 2] = 0
        printf(l)

excelfile.to_excel(wcau, sheet_name='Wechat', index=False)

#------------------------------------------------------------
excelfile = pd.read_excel(wcxy, sheet_name='Wechat')
listdata = excelfile.values.tolist()

id = list(id)

#------------------------------------------------------------
for n,l in enumerate(listdata):

    if str(l[0]) not in id:
        printf('%s not in record.'%l)
        continue

    index = id.index(str(l[0]))
    if index >= 0:
        excelfile.iat[n, 2] = rect[index]
    else:
        excelfile.iat[n, 2] = 0
        printf(l)

excelfile.to_excel(wcxy, sheet_name='Wechat', index=False)

printf('\a')

#------------------------------------------------------------
#        END OF FILE : WC2EXCEL.PY
#============================================================
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章