数据结构综合实验报告—— 厦门大学转专业数据分析(基于无向图)
一、需求分析
将转专业学生看做图的顶点,如果是相同学院的则连成一条边。建立学生与学生之间的关系图,并分析转专业学生的转入院和转出院之间的关系。
二、概要设计
建立邻接矩阵的方法如下:
networkx库的基本用法(基本操作)
参考资料,先解决一些预备知识
https://blog.csdn.net/your_answer/article/details/79189660
https://networkx.github.io/documentation/networkx-1.9
建立图
import networkx as nx
G=nx.Graph()#创建空的简单图
G=nx.DiGraph()#创建空的简单有向图
加点、加边
G.add_node(1)#加1这个点
G.add_node(1,1)#用(1,1)这个坐标加点
G.add_nodes_from([2,3])#加列表中的点
G.add_edge(1,2)#加边,起点是1终点是2
G.add_weight_edge(1,2,3.0)#第三个是权值
G.add_edges_from(list)#添加列表中的边
G.add_weight_edges_from(list)
删除点和边的话
G.remove_node()
G.remove_nodes_from()
G.remove_edge()
G.remove_edges_from()
G.clear()
遍历点和边的话
G.add_nodes_from([1,2,3])
for n in G.nodes():
print(n)
G.add_edges_from([(1,2),(1,3)])
for e in G.edges():
print(e)
print(G.degree())
codes的读写参考
https://blog.csdn.net/HJY_Lilyth/article/details/81951209
任务正式开始哈哈哈
三、详细设计
源代码
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import codecs
import networkx as nx
import matplotlib.pyplot as plt
import matplotlib
data = pd.read_csv("da.csv", encoding="gbk")
'''建立无向图'''
def graph():
""" 第一步:读取数据并获取姓名 """
print(data[:4])
print(data[u'姓名']) # 获取某一列数据
print(type(data[u'姓名']))
name = []
for n in data[u'姓名']:
name.append(n)
print(name[0])
""" 第二步:计算共现矩阵 定义函数实现 """
"""计算各个学生的共现矩阵,比如A和B都是同一个学院的,则共现依次,权重加1。注意,这里的学生来自各个学院,分析他们学院之间的关系;"""
"""将共现矩阵存储至word_node.txt文件中,格式为"学生A 学生B 共现词频";"""
a = np.zeros([2, 3])
print(a)
print(len(name))
word_vector = np.zeros([len(name), len(name)]) # 共现矩阵
# 1.计算学院共线矩阵
i = 0
while i < len(name): # len(name)
academy1 = data[u'所在学院'][i]
j = i + 1
while j < len(name):
academy2 = data[u'所在学院'][j]
if academy1 == academy2: # 学院相同
word_vector[i][j] += 1
word_vector[j][i] += 1
j = j + 1
i = i + 1
print(word_vector)
np_data = np.array(word_vector) # 矩阵写入文件
pd_data = pd.DataFrame(np_data)
pd_data.to_csv('result.csv')
""" 第三步:共现矩阵计算(学生1 学生2 共现词频)文件 """
words = codecs.open("word_node.txt", "a+", "utf-8") # a+表示读写
i = 0
while i < len(name): # len(name)
student1 = name[i]
j = i + 1
while j < len(name):
student2 = name[j]
# 判断学生是否共现 共现词频不为0则加入
if word_vector[i][j] > 0:
words.write(student1 + " " + student2 + " "
+ str(word_vector[i][j]) + "\r\n")
j = j + 1
i = i + 1
words.close()
""" 第四步:图形生成 """
a = []
f = codecs.open('word_node.txt', 'r', 'utf-8')
line = f.readline()
print(line)
i = 0
A = []
B = []
while line != "":
a.append(line.split()) # 保存文件是以空格分离的
print(a[i][0], a[i][1])
A.append(a[i][0])
B.append(a[i][1])
i = i + 1
line = f.readline()
elem_dic = tuple(zip(A, B)) # 用zip合并两个列表
print(type(elem_dic))
print(list(elem_dic))
f.close()
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 保证字体输出
# matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['lines.color'] = 'blue' # 更改划线颜色的默认设置
colors = ["red", "green", "blue", "yellow"]
G = nx.Graph() # 建立无向图
G.add_edges_from(list(elem_dic))
pos = nx.random_layout(G)
nx.draw_networkx_edges(G, pos, node_color='b', alpha=0.3) # style='dashed'
nx.draw_networkx_labels(G, pos, font_family='sans-serif', alpha=0.5) # font_size=5
plt.show()
def analyse1():
college = []
A = []
B = []
for n in data[u'所在学院']:
college.append(n)
i = 0
'''统计各学院转出人数'''
while i < len(college):
if college[i] in A:
p = A.index(college[i])
B[p] = B[p] + 1
else:
A.append(college[i])
B.append(1)
i = i + 1
print(A)
print(B)
elem_dic = tuple(zip(A, B)) # 用zip合并两个列表
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 保证字体输出
plt.bar(range(len(B)), B, color ='b', tick_label = A)
plt.title("转出学院统计表")
plt.xlabel("转出学院")
plt.ylabel("转出学院人数")
plt.show()
plt.title("转出学院统计表")
plt.pie(B,labels = A)
plt.show()
def analyse2():
college = []
A = []
B = []
for n in data[u'拟转入学院']:
college.append(n)
i = 0
'''统计各学院转入人数'''
while i < len(college):
if college[i] in A:
p = A.index(college[i])
B[p] = B[p] + 1
else:
A.append(college[i])
B.append(1)
i = i + 1
print(A)
print(B)
elem_dic = tuple(zip(A, B)) # 用zip合并两个列表
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 保证字体输出
plt.bar(range(len(B)), B, color ='b', tick_label = A )
plt.title("转入学院统计表")
plt.xlabel("转入学院")
plt.ylabel("转入学院人数")
plt.show()
plt.title("转入学院统计表")
plt.pie(B, labels=A)
plt.show()
graph()
analyse1()
analyse2()