zoukankan      html  css  js  c++  java
  • 2020软件工程个人编程作业一:统计分析GitHub 的用户行为数据

    2020软件工程个人编程作业一:统计分析GitHub 的用户行为数据

    这个作业属于哪个课程 软件工程 https://edu.cnblogs.com/campus/fzu/SE2020
    这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167
    这个作业的目标 初步使用Python编写程序,熟悉GitHub的使用方法
    学号 031802419

    一、PSP表格

    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划
    Estimate 估计这个任务需要多少时间 250 200
    Development 开发
    Analysis 需求分析 (包括学习新技术) 150 120
    Design Spec 生成设计文档 5 5
    Design Review 设计复审 2 2
    Coding Standard 代码规范 (为目前的开发制定合适的规范) 0 0
    Design 具体设计 20 30
    Coding 具体编码 300 250
    Code Review 代码复审 20 30
    Test 测试(自我测试,修改代码,提交修改) 50 60
    Reporting 报告
    Test Report 测试报告
    Size Measurement 计算工作量
    Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划
    合计

    二、解题过程

    1.见题

    初见题目,便满头问号,不是吧阿sir?怎么这么难。这json是个啥,os和argparse又是个啥,不行不行,我这菜鸡还是得等大佬先交然后参考参考。
    但是直到现在,才有大佬提交代码。而且我发现我错了,为什么大佬的代码也看不懂啊。没办法,deadline要来了,自己整呗!

    2.学习相关知识

    首先,该庆幸的是,曾经学习过一段时间的Python,基本语法还是清楚的,再加上参考代码恰巧也是Python写的,因此我只需要先复习复习Python,便可参照代码动手操作了。
    首先学习的知识是Python如何读取json文件,参考资料如下两个:

    3.初始工作

    首先便是将裕哥GitHub上的文件fork到自己的GitHub上,且同时需要随便改动一下readme.md文件,然后Pull Request。

    4.初始思路

    人又菜,又要交作业,好的方法想不出来,怎么办?
    暴力解决一切问题
    很简单,既然要统计分析用户的行为数据,那就直接遍历所有数据,将需要的找出来嘛!虽然或许大概可能会出现爆内存,超时等一系列问题,但是至少得把初始程序给完成,后续再修改嘛。(写都写不出,还要啥自行车?)
    实验流程图如下:

    5.代码实现

    #读取json文件的实现过程
    #这里考虑到可能又多个json文件,因此用一个列表记录所有的json文件
    #之后再一个一个读取转换json文件
    #参考完大佬们的代码后,实现代码如下:
    def pretreatment(self,Address: str) -> bool:
            self.__User = {}
            self.__Repo = {}
            self.__UserAndRepo ={}
            findFile=False
            for root, dic, files in os.walk(Address): 
                for file in files:
                    if file[-5:] == '.json':
                        findFile=True
                        json_path = file
                        filedir = open(Address+'\'+json_path,
                                 'r', encoding='utf-8')
                        while True:
                            line = filedir.readline()
                            if line :
                                if line.strip() == '':
                                    continue
                                jsondata=json.loads(line)
                                if not jsondata["type"] in ['PushEvent', 'IssueCommentEvent', 'IssuesEvent', 'PullRequestEvent']:
                                    continue
                                self.addEvent(jsondata)
                            else:
                                break
                        filedir.close()
            self.saveToFile()  
            return  findFile
    
    #命令行初始化
    def initArgparse(self):
        self.parser = argparse.ArgumentParser()
        self.parser.add_argument('-i', '--init')
        self.parser.add_argument('-u', '--user')
        self.parser.add_argument('-r', '--repo')
        self.parser.add_argument('-e', '--event')
    
    
    #数据处理
    if not jsondata["actor"]["login"] in self.__User.keys():
                self.__User[jsondata["actor"]["login"]] = {'PushEvent': 0, 'IssueCommentEvent': 0, 'IssuesEvent': 0,
                          'PullRequestEvent': 0}
            if not jsondata["repo"]["name"] in self.__Repo.keys():
                self.__Repo[jsondata["repo"]["name"]] = {'PushEvent': 0, 'IssueCommentEvent': 0, 'IssuesEvent': 0,
                          'PullRequestEvent': 0}
            if not jsondata["actor"]["login"] in self.__UserAndRepo.keys():
                self.__UserAndRepo[jsondata["actor"]["login"]] = {}
                self.__UserAndRepo[jsondata["actor"]["login"]][jsondata["repo"]["name"]] ={'PushEvent': 0, 'IssueCommentEvent': 0, 'IssuesEvent': 0,
                          'PullRequestEvent': 0}
            elif not jsondata["repo"]["name"] in self.__UserAndRepo[jsondata["actor"]["login"]].keys():
                self.__UserAndRepo[jsondata["actor"]["login"]][jsondata["repo"]["name"]] = {'PushEvent': 0, 'IssueCommentEvent': 0, 'IssuesEvent': 0,
                          'PullRequestEvent': 0}
            self.__User[jsondata["actor"]["login"]][jsondata['type']] += 1
            self.__Repo[jsondata["repo"]["name"]][jsondata['type']] += 1
            self.__UserAndRepo[jsondata["actor"]["login"]][jsondata["repo"]["name"]][jsondata['type']] += 1
    
    #结果输出
     def dataResult(self):
            if self.parser.parse_args().init:
                self.data = DataProcessing( True,self.parser.parse_args().init)
                return 0
            else:
                self.data = DataProcessing(False)
                if self.parser.parse_args().event:
                    if self.parser.parse_args().user:
                        if self.parser.parse_args().repo:
                            result = self.data.getEventsByUsersAndRepos(
                                self.parser.parse_args().user, self.parser.parse_args().repo,
                                self.parser.parse_args().event)
                        else:
                            result = self.data.getEventsByUsers(
                                self.parser.parse_args().user, self.parser.parse_args().event)
                    elif self.parser.parse_args().repo:
                        result = self.data.getEventsByRepos(
                            self.parser.parse_args().repo, self.parser.parse_args().event)
                    else:
                        raise RuntimeError('error: argument -u or -r is required')
                else:
                    raise RuntimeError('error: argument -e is required')
            return result
    

    6.单元测试


    7.性能测试


    8.代码规范链接

    https://github.com/Fiyvv/2020-personal-python/blob/master/codestyle.md

    9.总结

    对咱这种啥都不懂的人,遇上这种题目,几乎是做不出来的。但是经过几天的在csdn和博客园中兜兜转转,还是学到了些许知识,
    首先是学会了GitHub的基本用法,然后还见识到了Python各种各样强大的库,且进一步熟悉了Python的语法知识。最最重要的是,我通过看各位大佬的博客,了解到了大佬的思考方式,遇到题目该如何着手去解决。
    希望今后能够更多的运用自己掌握的知识去编写一个完完全全属于自己的程序!

  • 相关阅读:
    求菲波那契数列的第n个数
    一个球,初始高度100,每次落下回弹一半高度,求第n次落下球走的距离
    MySQL优化
    linux常用命令2
    win7安装ANT
    win7配置java环境变量
    kvm虚拟机磁盘文件读取小结
    kvm linux虚拟机在线扩展磁盘
    binlog2sql
    linux上 查看mysql的binglog日志
  • 原文地址:https://www.cnblogs.com/whyweneedtocode/p/13676509.html
Copyright © 2011-2022 走看看