从头开始vue创建项目

本系列涵盖了两个问题:如何使用数据科学来调查围绕软件工程的项目管理,以及如何将数据科学工具发布到Python Package Index。

数据科学作为一门学科正在蓬勃发展,许多文章讨论了使用哪种算法等主题的来龙去脉。 但是,只有少数人解释了如何收集数据,创建项目结构以及最终将软件发布到Python软件包索引。 本教程提供有关这两个主题的详细动手说明。 该系列的源代码可在GitHub上获得 。

软件项目管理问题

尽管已经存在了数十年,但软件行业仍然因延迟交付和质量差的问题而困扰。 其他问题在于评估团队和单个开发人员的绩效。 此外,软件行业的当前趋势是雇用自由职业者和承包商,这又带来了另一个问题:组织如何评估此类非雇员的才能? 此外,有动力的专业软件开发人员希望找到一种方法来变得更好。 他们可以从世界上最好的软件开发人员那里模仿什么模式?

幸运的是,开发人员创建了行为日志,这些日志创建了可用于帮助回答这些问题的信号。 每次开发人员对存储库进行提交时,都会创建一个信号。 然后,管理人员可以使用数据科学探索这些信号。

重要的是要注意,除非正确评估,否则此类信号可能会产生误导。 与聪明但狡猾的开发人员讨论源代码元数据只需要几分钟,便可以听到他或她说:“哦,这没有任何意义。我可以玩系统。” 例如,考虑一个开发人员,其GitHub资料在一年中显示3,000次提交,相当于每天大约10次提交。 这看起来确实很英勇,但是请考虑这些提交可能是由自动脚本创建的,或者它们可能是仅在README文件中添加一行的“假”提交。 这些是您必须注意的虚假信号。

需要考虑的探索性问题

在评估项目及其开发人员团队时,以下是要考虑的部分初始问题列表:

  • 优秀(或劣质)软件开发人员或团队的特征是什么?
  • 是否存在可以预测软件故障的信号?
  • 软件项目经理如何发现信号,使他能够采取行动来解决问题项目?
  • 看开源项目和闭源项目之间有区别吗?
  • 是否有信号可以识别正在“游戏系统”的开发人员?
  • 例如,您是否有不可靠的开发人员,他们的提交有很大差距?
  • 您开会太多会破坏团队的生产力吗?

在这里和随后的第2部分中,我建议一些可以帮助您回答这些问题和其他问题的技术。

创建初始数据科学项目框架

开发新的数据科学解决方案经常被忽略的部分是项目的初始结构。 在开始工作之前,最佳实践是创建一个布局,以促进高质量的工作和合理的组织。 布局项目结构的方法有很多,但这是一项建议(有关实际输出,请参阅此列表后的清单):

  • .circleci目录:目录包含使用CircleCI SaaS构建服务构建项目所需的配置。 (有许多与开源软件一起使用的类似服务。例如,您可以使用诸如Jenkins之类的开源工具。)
  • .gitignore:确保忽略不属于项目的文件。 这是常见的失误。
  • CODE_OF_CONDUCT.md :在项目中添加一些有关您希望贡献者的行为的信息是一个好主意。
  • MD。CONTRIBUTING.MD :关于您将如何接受捐款的明确说明有助于招募帮助。
  • 许可证:拥有许可证,例如MIT或BSD会有所帮助。 在某些情况下,如果您没有许可证,潜在的贡献者可能无法参与。
  • Makefile: Makefile是用于运行测试以及部署和设置环境的好工具。
  • README.md :一个不错的README.md回答了一些基本问题,例如用户如何构建项目以及项目做什么。 此外,README.md可能包含显示项目质量的“标志”,例如传递的构建。
  • 命令行工具 :在我的示例中,我有一个dml命令行工具。 拥有cli界面有助于浏览库和创建测试界面。
  • 带有__init__.py的库目录 :在项目的根目录,您应该创建一个带有__init__.py的库目录,以表明它是可导入的。 在此示例中,该库称为devml
  • ext目录 :此目录是诸如config.json或config.yml文件之类的好地方。 最好将非代码放在可以集中引用的地方。 数据子目录对于创建一些本地的,被截断的样本也可能是必需的。
  • notebooks目录:用于存放Jupyter Notebooks的特定文件夹,可以轻松地集中开发与笔记本相关的代码。 此外,它使设置笔记本电脑的自动化测试变得更加容易。
  • requirements.txt :一个文件,其中包含项目所需的软件包列表。
  • setup.py :一个配置文件,用于设置Python软件包的部署方式。 您也可以使用它来部署到Python Package Index。
  • 测试目录 :放置测试的目录。

这是ls命令的输出,列出了上面讨论的特定组件。

(.devml) ➜ devml git:(master) ✗ ls -la
drwxr-xr-x  3 noahgift staff   96 Oct 14 15:22 .circleci
-rw-r--r--  1 noahgift staff  1241 Oct 21 13:38 .gitignore
-rw-r--r--  1 noahgift staff  3216 Oct 15 11:44 CODE_OF_CONDUCT.md
-rw-r--r--  1 noahgift staff  357 Oct 15 11:44 CONTRIBUTING.md
-rw-r--r--  1 noahgift staff  1066 Oct 14 14:10 LICENSE
-rw-r--r--  1 noahgift staff  464 Oct 21 14:17 Makefile
-rw-r--r--  1 noahgift staff 13015 Oct 21 19:59 README.md
-rwxr-xr-x  1 noahgift staff  9326 Oct 21 11:53 dml
drwxr-xr-x  4 noahgift staff  128 Oct 20 15:20 ext
drwxr-xr-x  7 noahgift staff  224 Oct 22 11:25 notebooks
-rw-r--r--  1 noahgift staff  117 Oct 18 19:16 requirements.txt
-rw-r--r--  1 noahgift staff  1197 Oct 21 14:07 setup.py
drwxr-xr-x 12 noahgift staff  384 Oct 18 10:46 tests

“像这样的指标有趣的事情之一是它显示了参与度。 在拥有最好的开源开发人员的情况下,有一些有趣的相似之处。 ”

收集和转换数据

像往常一样,问题的最糟糕部分是弄清楚如何收集数据并将其转换为有用的数据。 此问题有几个部分要解决。 第一个是如何收集单个存储库并从中创建一个熊猫DataFrame。 为此,您需要在devml目录中创建一个名为mkdata.py的新模块。 该模块解决了将git仓库的元数据转换为pandas Dataframe的问题。

这是我的mkdata.py模块的一部分 。 log_to_dict函数采用磁盘上单个git checkout的路径,然后转换git命令的输出。

def log_to_dict(path):"""Converts Git Log To A Python Dict"""os.chdir(path) #change directory to process git logrepo_name = generate_repo_name()p = Popen(GIT_LOG_CMD, shell=True, stdout=PIPE)(git_log, _) = p.communicate()try:git_log = git_log.decode('utf8').strip('\n\x1e').split("\x1e")except UnicodeDecodeError:log.exception("utf8 encoding is incorrect, trying ISO-8859-1")git_log = git_log.decode('ISO-8859-1').strip('\n\x1e').split("\x1e")git_log = [row.strip().split("\x1f") for row in git_log]git_log = [dict(list(zip(GIT_COMMIT_FIELDS, row))) for row in git_log]for dictionary in git_log:dictionary["repo"]=repo_namerepo_msg = "Found %s Messages For Repo: %s" % (len(git_log), repo_name)log.info(repo_msg)return git_log

在接下来的两个函数中,磁盘上的路径用于调用上面的函数。 请注意,日志作为项目存储在列表中,并且此列表用于在pandas中创建DataFrame:

def create_org_df(path):"""Returns a Pandas Dataframe of an Org"""original_cwd = os.getcwd()logs = create_org_logs(path)org_df = pd.DataFrame.from_dict(logs)#convert date to datetime formatdatetime_converted_df = convert_datetime(org_df)#Add A Date Indexconverted_df = date_index(datetime_converted_df)new_cwd = os.getcwd()cd_msg = "Changing back to original cwd: %s from %s" % (original_cwd, new_cwd)log.info(cd_msg)os.chdir(original_cwd)return converted_df
def create_org_logs(path):"""Iterate through all paths in current working directory,make log dict"""combined_log = []for sdir in subdirs(path):repo_msg = "Processing Repo: %s" % sdirlog.info(repo_msg)combined_log += log_to_dict(sdir)log_entry_msg = "Found a total log entries: %s" % len(combined_log)log.info(log_entry_msg)return combined_log

实际上,此代码在不收集到DataFrame中的情况下运行时看起来像这样。

In [5]: res = create_org_logs("/Users/noahgift/src/flask")
2017-10-22 17:36:02,380 - devml.mkdata - INFO - Found repo: /Users/noahgift/src/flask/flask
In [11]: res[0]
Out[11]:
{'author_email': 'rgerganov@gmail.com','author_name': 'Radoslav Gerganov','date': 'Fri Oct 13 04:53:50 2017','id': '9291ead32e2fc8b13cef825186c968944e9ff344','message': 'Fix typo in logging.rst (#2492)','repo': b'flask'}

第二部分,即DataFrame,看起来像下面的清单。

res = create_org_df("/Users/noahgift/src/flask")
In [14]: res.describe()
Out[14]:commits
count  9552.0
mean    1.0
std    0.0
min    1.0
25%    1.0
50%    1.0
75%    1.0
max    1.0

从高层次上讲,这是一种从第三方获取临时数据的模式,例如Git日志。 要更深入地研究这一点,请完整查看源代码。

与整个GitHub组织交谈

有了将磁盘上的Git存储库转换为DataFrames的代码之后,自然而然的下一步就是为组织收集所有存储库。 仅分析一个存储库的一个关键问题是,它是在组织环境中分析的数据的不完整部分。 解决此问题的一种方法是与GitHub API对话并以编程方式删除所有存储库。 我使用fetch_repo.py来做到这一点,其重点如下所示。

def clone_org_repos(oath_token, org, dest, branch="master"):"""Clone All Organizations Repositories and Return Instances of Repos."""if not validate_checkout_root(dest):return Falserepo_instances = []repos = org_repo_names(oath_token, org)count = 0for name, url in list(repos.items()):count += 1log_msg = "Cloning Repo # %s REPO NAME: %s , URL: %s " %\(count, name, url)log.info(log_msg)try:repo = clone_remote_repo(name, url, dest, branch=branch)repo_instances.append(repo)except GitCommandError:log.exception("NO MASTER BRANCH...SKIPPING")return repo_instances

PyGithub和GitPython软件包都用于完成许多繁重的工作。 运行此代码时,它将迭代地从API查找每个存储repo并对其进行克隆。 然后可以使用之前的代码来创建组合的DataFrame。

创建特定于域的统计信息

所有这些工作之所以完成是出于一个原因:探索收集的数据并创建特定于域的统计信息。 为此,您创建一个stats.py文件 。 要显示的最相关部分是一个称为author_unique_active_days的函数。 此函数显示给定的开发人员对于DataFrame中的记录处于活动状态的天数。 这是特定于域的独特统计信息,在涉及源代码存储库的统计信息的讨论中很少提及。

主要功能如下所示。

def author_unique_active_days(df, sort_by="active_days"):"""DataFrame of Unique Active Days by Author With Descending Orderauthor_name unique_days46   Armin Ronacher  271260  Markus Unterwaditzer    145"""author_list = []count_list = []duration_active_list = []ad = author_active_days(df)for author in ad.index:author_list.append(author)vals = ad.loc[author]vals.dropna(inplace=True)vals.drop_duplicates(inplace=True)vals.sort_values(axis=0,inplace=True)vals.reset_index(drop=True, inplace=True)count_list.append(vals.count())duration_active_list.append(vals[len(vals)-1]-vals[0])df_author_ud = DataFrame()  df_author_ud["author_name"] = author_listdf_author_ud["active_days"] = count_listdf_author_ud["active_duration"] = duration_active_listdf_author_ud["active_ratio"] = \round(df_author_ud["active_days"]/df_author_ud["active_duration"].dt.days, 2)df_author_ud = df_author_ud.iloc[1:] #first row is =df_author_ud = df_author_ud.sort_values(by=sort_by, ascending=False)return df_author_ud

当从IPython使用时,此代码将生成以下输出。

In [18]: from devml.stats import author_unique_active_days
In [19]: active_days = author_unique_active_days(df)
In [20]: active_days.head()
Out[20]:author_name active_days active_duration active_ratio
46     Armin Ronacher     241    2490 days     0.10
260 Markus Unterwaditzer      71    1672 days     0.04
119      David Lord      58    710 days     0.08
352      Ron DuPlain      47    785 days     0.06
107   Daniel Neuhäuser      19    435 days     0.04

统计信息会创建一个比率,称为active_ratio ,该比率是从开发人员到项目开发人员开始到最终提交代码的时间百分比。 像这样的指标有趣的是,它显示了参与度。 在拥有最好的开源开发人员的情况下,有一些有趣的相似之处。 在下一节中,这些核心组件将挂接到命令行工具中,并且我将使用创建的代码来比较两个开源项目。

将数据科学项目连接到CLI

在本部分的前面,我展示了如何创建组件以达到可以运行分析的目的。 在本节中,我将展示如何将它们连接到使用Click框架的灵活命令行工具中。 您可以查看dml的整个源代码 。 否则,重要的部分如下所示。

首先,将库与Click框架一起导入。

#!/usr/bin/env python
import os
import click
from devml import state
from devml import fetch_repo
from devml import __version__
from devml import mkdata
from devml import stats
from devml import org_stats
from devml import post_processing

然后连接上一个代码。

@gstats.command("activity")
@click.option("--path", default=CHECKOUT_DIR, help="path to org")
@click.option("--sort", default="active_days", help="can sorty by: active_days, active_ratio, active_duration")
def activity(path, sort):"""Creates Activity StatsExample is run after checkout:python dml.py gstats activity --path /Users/noah/src/wulio/checkout"""org_df = mkdata.create_org_df(path)activity_counts = stats.author_unique_active_days(org_df, sort_by=sort)click.echo(activity_counts)

要使用此工具,在命令行中看起来像这样。

# Linux Development Active Ratiodml gstats activity --path /Users/noahgift/src/linux --sort active_daysauthor_name             active_days active_duration active_ratio
14541      Takashi Iwai            1677    4590 days           0.370000
4382       Eric Dumazet            1460    4504 days           0.320000
3641       David S. Miller         1428    4513 days           0.320000
7216       Johannes Berg           1329    4328 days           0.310000
8717       Linus Torvalds          1281    4565 days           0.280000
275        Al Viro                 1249    4562 days           0.270000
9915       Mauro Carvalho Chehab   1227    4464 days           0.270000
9375       Mark Brown              1198    4187 days           0.290000
3172       Dan Carpenter           1158    3972 days           0.290000
12979      Russell King            1141    4602 days           0.250000
1683       Axel Lin                1040    2720 days           0.380000
400        Alex Deucher            1036    3497 days           0.300000# CPython Development Active Ratioauthor_name             active_days active_duration active_ratio
146        Guido van Rossum        2256    9673 days           0.230000
301        Raymond Hettinger       1361    5635 days           0.240000
128        Fred Drake              1239    5335 days           0.230000
47         Benjamin Peterson       1234    3494 days           0.350000
132        Georg Brandl            1080    4091 days           0.260000
375        Victor Stinner          980     2818 days           0.350000
235        Martin v. Löwis         958     5266 days           0.180000
36         Antoine Pitrou          883     3376 days           0.260000
362        Tim Peters              869     5060 days           0.170000
164        Jack Jansen             800     4998 days           0.160000
24         Andrew M. Kuchling      743     4632 days           0.160000
330        Serhiy Storchaka        720     1759 days           0.410000
44         Barry Warsaw            696     8485 days           0.080000
52         Brett Cannon            681     5278 days           0.130000
262        Neal Norwitz            559     2573 days           0.220000

在此分析中,Python的Guido在给定的一天工作的概率为23%,Linux的Linus的概率为28%。 这种特殊形式的分析令人着迷的是,它可以显示长时间的行为。 就CPython而言,其中许多作者还从事全职工作,因此输出结果令人难以置信。 另一个有趣的分析是查看组织中开发人员的历史记录(结合所有可用存储库)。 我已经注意到,在某些情况下,如果高级开发人员被完全雇用,他们可以以大约85%的有效比率输出代码。

结论

在本系列的第1部分中,我展示了如何创建基本的数据科学框架并解释了这些部分。 这些组件是一个一个地构建的,以从第三方位置提取数据,对其进行转换,对其进行分析,然后使用命令行界面以灵活的方式运行它们。 在第2部分中,我将使用第1部分中构建的代码,使用Jupyter Notebook进行深入的数据探索。最后,我将展示如何将项目部署到Python Package Index。


翻译自: https://www.ibm.com/developerworks/opensource/library/ba-github-analytics-1/index.html

从头开始vue创建项目

从头开始vue创建项目_从头开始创建数据科学项目相关推荐

  1. 分步式数据库_创建真实数据科学项目的分步指南

    分步式数据库 As an inspiring data scientist, building interesting portfolio projects is key to showcase yo ...

  2. 数据科学生命周期_数据科学项目生命周期第1部分

    数据科学生命周期 This is series of how to developed data science project. 这是如何开发数据科学项目的系列. This is part 1. 这 ...

  3. 护理方面关于人工智能的构想_如何提出惊人的AI,ML或数据科学项目构想。

    护理方面关于人工智能的构想 No Matter What People Tell You, Words And Ideas Can Change The World. - Robin Williams ...

  4. 美团脱颖而出的经验_使数据科学项目脱颖而出的6种方法

    美团脱颖而出的经验 The global COVID-19 pandemic has left many with a lot of time on their hands to work on th ...

  5. 大数据数据量估算_如何估算数据科学项目的数据收集成本

    大数据数据量估算 (Notes: All opinions are my own) (注:所有观点均为我自己) 介绍 (Introduction) Data collection is the ini ...

  6. 数据多重共线性_多重共线性对您的数据科学项目的影响比您所知道的要多

    数据多重共线性 Multicollinearity is likely far down on a mental list of things to check for, if it is on a ...

  7. 数据科学项目_完整的数据科学组合项目

    数据科学项目 In this article, I would like to showcase what might be my simplest data science project ever ...

  8. 品达物流TMS项目_第6章 数据聚合服务开发(pd-aggregation)

    品达物流TMS项目_第6章 数据聚合服务开发(pd-aggregation) 文章目录 品达物流TMS项目_第6章 数据聚合服务开发(pd-aggregation) 第6章 数据聚合服务开发(pd-a ...

  9. 如何创建一个数据科学项目?

    摘要: 在一个新的数据科学项目,你应该如何组织你的项目流程?数据和代码要放在那里?应该使用什么工具?在对数据处理之前,需要考虑哪些方面?读完本文,会让你拥有一个更加科学的工作流程. 假如你想要开始一个 ...

  10. 如何创建一个数据科学项目? 1

    假如你想要开始一个新的数据科学项目,比如对数据集进行简单的分析,或者是一个复杂的项目.你应该如何组织你的项目流程?数据和代码要放在那里?应该使用什么工具?在对数据处理之前,需要考虑哪些方面? 数据科学 ...

最新文章

  1. R语言stringr包str_extract函数检查数据是否包含特定模式实战
  2. 360手机麦克风测试软件,【奇酷小技巧】教你无需ROOT增大话筒、听筒和外放声音!...
  3. Excel宏的易错点
  4. android平板 useragent,移动端适配 user-Agent
  5. 基于APMSSGA-LSTM的容器云资源预测
  6. cif判断字符串相等_leetcode 86 扰乱字符串(c++)
  7. 企业部署BI系统怎么能一直做下去,PDCA闭环是关键
  8. MDC功能软件-归控算法介绍
  9. Windows XP远程桌面控制图文教程
  10. 又是整数划分(poj1032)
  11. B站 汇编语言 视频 教程
  12. 《Windows程序设计》之剪贴板查看器
  13. 拖拽化、低代码、可视化布局学习资料搜集
  14. oracle 日志查看教程,Oracle 查看日志
  15. ESP8266制作创意时钟(DS1302+TM1637)
  16. Android应用接入微信分享,以及遇到的坑
  17. 选择4G工业路由器需要注意的细节
  18. 给你的App添加动画效果
  19. robocup3d仿真平台的安装
  20. 超市收银系统c语言程序用c 的,C语言 超市收银系统

热门文章

  1. python使用matplotlib可视化饼图(pie plot)、使用explode参数自定义设置每个扇形离开中心的距离
  2. 论文(1)——大家说SCI的一区二区和CCF中A类B类是什么意思?
  3. Docker容器操作
  4. 【信息汇总】中国人民大学计算机考研
  5. YOLO-Fastest 编译、测试
  6. 通过点击按钮,实现图片的切换。最简单的js方法!
  7. 13--微信小程序 修改班级名称(组件)按钮、input
  8. Taro小程序图片滑动验证
  9. 2.MyBatis+Web
  10. 实战演练Python数据分析[pandas]