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文件,参考资料如下两个:
- https://zhuanlan.zhihu.com/p/102274020?utm_source=qq&utm_medium=social&utm_oi=866047854202998784
- https://zhuanlan.zhihu.com/p/27917664
由此将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的语法知识。最最重要的是,我通过看各位大佬的博客,了解到了大佬的思考方式,遇到题目该如何着手去解决。
希望今后能够更多的运用自己掌握的知识去编写一个完完全全属于自己的程序!