开发环境
- 开发语言:Python
- 框架:Django
- Python 版本:python3.8
- 数据库:MySQL 5.7
- 数据库工具:Navicat12
- 开发软件:PyCharm
系统展示
管理员登录

管理员功能界面

用户管理

学习数据

期末成绩预测

看板展示

摘要
系统基于 B/S 开发模式,采用 Python 语言进行开发,借助 Django 框架搭建系统架构,保证了系统的稳定性和可扩展性。同时,运用长短期记忆网络(LSTM)算法,对学生学习数据进行深入分析和挖掘。系统功能多样,管理员能够对用户信息进行全面管理,包括用户的注册、登录和权限设置等。可以对学生的学习数据进行收集、整理和分析,涵盖课堂表现、作业完成情况等。并且能够通过 LSTM 模型对学生的期末成绩进行科学预测,为教学决策提供有力支持。该系统的应用,对教育教学有着多方面的积极意义。它能帮助教师更精准地了解学生的学习状态,从而制定更具针对性的教学方案,提高教学质量。对于学生而言,能清晰认识自己的学习情况,合理调整学习计划。系统的自动化管理功能有效减轻了学校教学管理的负担,提高了管理效率,促进教育资源的优化配置,推动教育向智能化、个性化方向发展。
研究背景
长短期记忆网络(LSTM)作为一种特殊的循环神经网络,能够有效处理时间序列数据,在学习情况分析中具有独特的优势。它可以捕捉学生学习过程中的长期依赖关系,如学习习惯的养成和知识的积累过程,从而更准确地预测学生的学习成绩和发展趋势。基于浏览器/服务器(B/S)的开发模式具有部署方便、易于维护、跨平台性强等优点,使得系统可以在不同设备上方便地访问和使用。Python 语言以其简洁高效、丰富的库和框架,成为开发此类系统的理想选择。Django 框架作为 Python 的一个强大的 Web 开发框架,提供了完善的数据库管理、用户认证、路由等功能,能够大大提高系统的开发效率和稳定性。
关键技术
Python 是解释型的脚本语言,在运行过程中,把程序转换为字节码和机器语言,说明性语言的程序在运行之前不必进行编译,而是一个专用的解释器,当被执行时,它都会被翻译,与之对应的还有编译性语言。
同时,这也是一种用于电脑编程的跨平台语言,这是一门将编译、交互和面向对象相结合的脚本语言(script language)。
Django 用 Python 编写,属于开源 Web 应用程序框架。采用(模型 M、视图 V 和模板 T)的框架模式。该框架以比利时吉普赛爵士吉他手詹戈·莱因哈特命名。该架构的主要组件如下:
- 用于创建模型的对象关系映射。
- 最终目标是为用户设计一个完美的管理界面。
- 是目前最流行的 URL 设计解决方案。
- 模板语言对设计师来说是最友好的。
- 缓存系统。
Vue 是一款流行的开源 JavaScript 框架,用于构建用户界面和单页面应用程序。Vue 的核心库只关注视图层,易于上手并且可以与其他库或现有项目轻松整合。
MySQL 数据库运行速度快,安全性能也很高,而且对使用的平台没有任何的限制,所以被广泛应运到系统的开发中。MySQL 是一个开源和多线程的关系管理数据库系统,MySQL 是开放源代码的数据库,具有跨平台性。
B/S(浏览器/服务器)结构是目前主流的网络化的结构模式,它能够把系统核心功能集中在服务器上面,可以帮助系统开发人员简化操作,便于维护和使用。
系统分析
对系统的可行性分析以及对所有功能需求进行详细的分析,来查看该系统是否具有开发的可能。

系统设计
功能模块设计和数据库设计这两部分内容都有专门的表格和图片表示。

系统实现
后台管理员主要分为多个模块,分别是系统首页、个人中心、用户、学习数据、期末成绩预测、系统管理等。个人中心用于管理员管理自身账号信息,如修改密码、查看操作日志等,保障账号安全和操作可追溯。用户模块中,管理员可对系统内各类用户(如学生、教师等)进行全面管理,包括用户注册审核、权限分配、信息编辑与删除等操作,确保用户信息准确和权限合理。学习数据模块负责收集、整理和维护学生学习过程中的各类数据,为后续分析和预测提供数据基础。期末成绩预测模块运用 LSTM 等算法,基于学习数据对学生期末成绩进行预测,辅助教学决策。系统管理模块涵盖系统配置、服务器管理、数据备份与恢复等功能,保障系统稳定、安全运行。
代码实现
#coding:utf-8
import os
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout
from keras.optimizers import Adam
import matplotlib.pyplot as plt
import pymysql
from django.http import JsonResponse
from django.utils import timezone
from datetime import datetime, timedelta
def learningdataforecast_forecast(request):
if request.method in ["POST", "GET"]:
msg = {'code': normal_code, "msg": mes.normal_code}
# 1.获取数据集
connection = pymysql.connect(**mysql_config)
query = "SELECT date, student, subject, regulargrade, midtermresults, learningattitude, finalgrade FROM learningdata ORDER BY date ASC"
# 2.处理缺失值
data = pd.read_sql(query, connection).dropna()
# 转换日期格式为 datetime
date_format = data['date'].iloc[0]
if isinstance(date_format, (datetime.date, datetime.datetime)):
pass
elif "年" in date_format and "月" in date_format and "日" in date_format:
date_format='%Y年%m月%d日'
elif "年" in date_format and "月" in date_format:
date_format='%Y年%m月'
elif "年" in date_format:
date_format='%Y年'
else:
if date_format=="" or date_format==None:
data['date'] = pd.to_datetime(data['date'])
else:
data['date'] = pd.to_datetime(data['date'], format=date_format)
data.set_index('date', inplace=True)
student_encoder = LabelEncoder()
data['student'] = student_encoder.fit_transform(data['student'])
subject_encoder = LabelEncoder()
data['subject'] = subject_encoder.fit_transform(data['subject'])
learningattitude_encoder = LabelEncoder()
data['learningattitude'] = learningattitude_encoder.fit_transform(data['learningattitude'])
# 只选择需要的列
data = data[['student', 'subject', 'regulargrade', 'midtermresults', 'learningattitude', 'finalgrade']]
# 归一化处理(为了 LSTM 的训练)
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data)
# 设置时间步长
time_step = int(len(data)/10)
if time_step>30: time_step=30
if time_step<=0: time_step=1
X, y = create_dataset(scaled_data, time_step)
# 划分训练集和测试集
train_size = int(len(X) * 0.8)
X_train, X_test = X[:train_size], X[train_size:]
y_train, y_test = y[:train_size], y[train_size:]
print(f'X_train shape: {X_train.shape}, y_train shape: {y_train.shape}')
# 创建 LSTM 模型
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(Dropout(0.2))
model.add(LSTM(50, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(len(data.columns), activation='relu'))
# 编译模型
model.compile(optimizer='adam', loss='mean_squared_error')
# 训练模型
model.fit(X_train, y_train, epochs=100, batch_size=32, verbose=1)
# 进行预测
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)
# 将预测结果反归一化
train_predict = scaler.inverse_transform(train_predict)
test_predict = scaler.inverse_transform(test_predict)
# 绘制预测结果
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(12, 6), dpi=80)
plt.plot(data.index[:len(train_predict)], train_predict[:, 1 - 1], label='训练 student 预测', color='blue')
plt.plot(data.index[len(train_predict) + time_step + 1:], test_predict[:, 1 - 1], label='测试 student 预测', color='red')
plt.plot(data.index, data['student'], label='实际 student', color='green')
plt.title('student 预测')
plt.xlabel('Date')
plt.ylabel('student')
plt.legend()
directory = os.path.join(parent_directory, "templates", "upload", "learningdataforecast", "student_prediction.png")
os.makedirs(os.path.dirname(directory), exist_ok=True)
plt.savefig(directory)
plt.clf()
plt.close()
# ... (其他图表绘制逻辑类似,此处省略部分重复代码以保持简洁)
# 准备未来 3 的输入数据
last_data_days = scaled_data[-time_step:]
future_predictions = []
for _ in range(3):
last_data_days = last_data_days.reshape((1, time_step, len(data.columns)))
prediction = model.predict(last_data_days)
future_predictions.append(prediction[0])
last_data_days = np.append(last_data_days[:, 1:, :], [prediction], axis=1)
future_predictions = scaler.inverse_transform(future_predictions)
# 获取当前日期
last_date = data.index[-1]
future_dates = [last_date + timedelta(days=31*i) for i in range(1, 3+1)]
df = pd.DataFrame(columns=['date', 'student', 'subject', 'regulargrade', 'midtermresults', 'learningattitude', 'finalgrade'])
df['date'] = [str(date.year)+"-"+str(date.month) for date in future_dates]
df['student'] = future_predictions[:, 1 - 1]
df['subject'] = future_predictions[:, 2 - 1]
df['regulargrade'] = future_predictions[:, 3 - 1]
df['midtermresults'] = future_predictions[:, 4 - 1]
df['learningattitude'] = future_predictions[:, 5 - 1]
df['finalgrade'] = future_predictions[:, 6 - 1]
df['student']=df['student'].astype(int)
df['student'] = student_encoder.inverse_transform(df['student'])
df['subject']=df['subject'].astype(int)
df['subject'] = subject_encoder.inverse_transform(df['subject'])
df['regulargrade']=df['regulargrade'].astype(int)
df['midtermresults']=df['midtermresults'].astype(int)
df['finalgrade']=df['finalgrade'].astype(int)
df['learningattitude']=df['learningattitude'].astype(int)
df['learningattitude'] = learningattitude_encoder.inverse_transform(df['learningattitude'])
# 创建数据库连接,将 DataFrame 插入数据库
connection_string = f"mysql+pymysql://{mysql_config['user']}:{mysql_config['password']}@{mysql_config['host']}:{mysql_config['port']}/{mysql_config['database']}"
engine = create_engine(connection_string)
try:
df.to_sql('learningdataforecast', con=engine, if_exists='append', index=False)
print("数据更新成功!")
except Exception as e:
print(f"发生错误:{e}")
finally:
engine.dispose()
return JsonResponse(msg, encoder=CustomJsonEncoder)
系统测试
软件测试是一个至关重要的环节,旨在核实系统是否圆满达成了项目初期所规划的各项功能目标。本章内容聚焦于依据系统功能性需求,对用户端与管理员端两大核心界面展开详尽的测试活动。这一过程不仅要求全面覆盖系统设计的每一个功能点,还强调了对这些功能点的用例进行深入细致的分析。在用户端测试方面,我们着重检验了用户界面的友好性、交互逻辑的流畅性以及各项功能的实用性,确保用户能够轻松上手并高效利用系统完成各项操作。同时,管理员端测试则更加侧重于权限管理、数据监控以及后台配置等高级功能的验证,以保障系统管理的便捷性和安全性。
结论
在教育信息化浪潮的推动下,我们完成了基于神经网络的学生学习情况分析系统的相关研究与开发工作。从系统构建来看,我们借助 Python 语言的灵活性与丰富库资源,结合 Django 框架高效搭建 Web 架构,利用 MySQL 数据库实现数据的有序存储与管理。LSTM 算法在挖掘学生学习时间序列数据规律、预测期末成绩等方面发挥关键作用,Echarts 则让数据以直观可视化形式呈现。这些技术的有机融合,赋予了系统强大的功能。


