厦门大学转专业数据分析(基于无向图)

数据结构综合实验报告—— 厦门大学转专业数据分析(基于无向图)

一、需求分析

将转专业学生看做图的顶点,如果是相同学院的则连成一条边。建立学生与学生之间的关系图,并分析转专业学生的转入院和转出院之间的关系。

二、概要设计

建立邻接矩阵的方法如下:

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()

四、测试结果

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值