围绕开发人员生产力、公司生产力和项目生产力的机器学习、统计和实用程序

devml的Python项目详细描述


Codacy BadgeCircleCI

devml

围绕开发人员生产力的机器学习、统计和实用程序

一些方便的功能:

  • 可以签出github中的所有存储库
  • 将磁盘上已签出存储库的树转换为熊猫 数据帧
  • 组合数据帧的统计信息

安装

pip install devml

这个pip安装安装了一个命令行工具:dml(它被引用 在下面的文档中)。以及引用的库devml 下面也是。

获取环境设置

编写代码是为了支持Python3.6或更高版本。你可以在这里得到: https://www.python.org/downloads/release/python-360/

在本地运行项目的一个简单方法是签出repo并在repo的根目录中运行:

make setup

这将在~/.devml中创建一个virtualenv

下一步,获取virtualenv:

source ~/.devml/bin/activate

运行make all(安装、绒布和测试)

make all

# #Example output
#(.devml) ➜  devml git:(master) make all
#pip install -r requirements.txt
#Requirement already satisfied: pytest in /Users/noahgift/.devml/lib/python3.6/site-packages (from -r requirements.txt (line #1)
---------- coverage: platform darwin, python 3.6.2-final-0 -----------
Name                       Stmts   Miss  Cover
----------------------------------------------
devml/__init__.py              1      0   100%
devml/author_stats.py          6      6     0%
devml/fetch_repo.py           54     42    22%
devml/mkdata.py               84     21    75%
devml/org_stats.py            76     55    28%
devml/post_processing.py      50     35    30%
devml/state.py                29      9    69%
devml/stats.py                55     43    22%
devml/ts.py                   29     14    52%
devml/util.py                 12      4    67%
dml.py                       111     66    41%
----------------------------------------------
TOTAL                        507    295    42%
....

你不使用virtualenv或者不想使用它。没问题,快跑 make all如果安装了python 3.6,它可能会工作。

make all

在GitHub组织中浏览Jupyter笔记本

在这里,您可以使用这个示例作为开始来探索组合数据集:

https://github.com/noahgift/devml/blob/master/notebooks/github_data_exploration.ipynb

Pallets Project

托盘项目

探索存储库流失上的jupyter笔记本

您可以在此处探索文件元数据探索示例:

https://github.com/noahgift/devml/blob/master/notebooks/repo_file_exploration.ipynb

按类型搅动的所有文件:

Pallets Project Relative Churn by file type

按文件类型排列的托盘项目相对变动

按类型列出的流失统计摘要:

Pallets Project by file type Churn statistics

按文件类型列出的托盘项目客户流失统计信息

预期配置

命令行工具希望您创建项目目录 使用config.json文件。在config.json文件中,您需要 提供誓词。你可以找到如何做到这一点的信息 在这里: https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/

或者,可以通过python api或 命令行作为选项。它们代表以下内容:

  • org:github组织(克隆整个回购树)
  • 签出目录:签出地点
  • 誓言:从github生成的个人誓言令牌
➜  devml git:(master) ✗ cat project/config.json
{
    "project" :
        {
            "org":"pallets",
            "checkout_dir": "/tmp/checkout",
            "oath": "<keygenerated from Github>"
        }

}

基本命令行用法

您可以查找签出或签出目录的统计信息 遵循

dml gstats author --path ~/src/mycompanyrepo(s)
Top Commits By Author:                     author_name  commits
0                     John Smith     30591                      Sally Joe     29952                   Greg Mathews     21943                 Jim Mayflower      1448

基本的api使用(将repo树转换为pandas数据帧)

In [1]: from devml import (mkdata, stats)

In [2]: org_df = mkdata.create_org_df(path=/src/mycompanyrepo(s)")
In [3]: author_counts = stats.author_commit_count(org_df)

In [4]: author_counts.head()
Out[4]:
      author_name  commits
0       John Smith     3059
1        Sally Joe     2995
2     Greg Mathews     2194
3    Jim Mayflower     1448
4   Truck Pritter      1441

使用api

克隆github中的所有repo
In [1]: from devml import (mkdata, stats, state, fetch_repo)

In [2]: dest, token, org = state.get_project_metadata("../project/config.json")
In [3]: fetch_repo.clone_org_repos(token, org,
        dest, branch="master")
017-10-14 17:11:36,590 - devml - INFO - Creating Checkout Root:  /tmp/checkout
2017-10-14 17:11:37,346 - devml - INFO - Found Repo # 1 REPO NAME: flask , URL: git@github.com:pallets/flask.git
2017-10-14 17:11:37,347 - devml - INFO - Found Repo # 2 REPO NAME: pallets-sphinx-themes , URL: git@github.com:pallets/pallets-sphinx-themes.git
2017-10-14 17:11:37,347 - devml - INFO - Found Repo # 3 REPO NAME: markupsafe , URL: git@github.com:pallets/markupsafe.git
2017-10-14 17:11:37,348 - devml - INFO - Found Repo # 4 REPO NAME: jinja , URL: git@github.com:pallets/jinja.git
2017-10-14 17:11:37,349 - devml - INFO - Found Repo # 5 REPO NAME: werkzeug , URL: git@githu
In [4]: !ls -l /tmp/checkout
total 0
drwxr-xr-x  21 noahgift  wheel  672 Oct 14 17:11 click
drwxr-xr-x  25 noahgift  wheel  800 Oct 14 17:11 flask
drwxr-xr-x  11 noahgift  wheel  352 Oct 14 17:11 flask-docs
drwxr-xr-x  12 noahgift  wheel  384 Oct 14 17:11 flask-ext-migrate
drwxr-xr-x   8 noahgift  wheel  256 Oct 14 17:11 flask-snippets
drwxr-xr-x  14 noahgift  wheel  448 Oct 14 17:11 flask-website
drwxr-xr-x  18 noahgift  wheel  576 Oct 14 17:11 itsdangerous
drwxr-xr-x  23 noahgift  wheel  736 Oct 14 17:11 jinja
drwxr-xr-x  18 noahgift  wheel  576 Oct 14 17:11 markupsafe
drwxr-xr-x   4 noahgift  wheel  128 Oct 14 17:11 meta
drwxr-xr-x  10 noahgift  wheel  320 Oct 14 17:11 pallets-sphinx-themes
drwxr-xr-x   9 noahgift  wheel  288 Oct 14 17:11 pocoo-sphinx-themes
drwxr-xr-x  15 noahgift  wheel  480 Oct 14 17:11 website
drwxr-xr-x  25 noahgift  wheel  800 Oct 14 17:11 werkzeug

高级cli作者:获取签出树或签出并排序

 ➜  devml git:(master) ✗ dml gstats activity --path /tmp/checkout --sort active_days

Top Unique Active Days:               author_name  active_days active_duration  active_ratio
86         Armin Ronacher          989       3817 days      0.260000
501  Markus Unterwaditzer          342       1820 days      0.190000
216            David Lord          129        712 days      0.180000
664           Ron DuPlain           78        854 days      0.090000
444         Kenneth Reitz           68       2566 days      0.030000
197      Daniel Neuhäuser           42       1457 days      0.030000
297          Georg Brandl           41       1337 days      0.030000
196     Daniel Neuhäuser           36        435 days      0.080000
450      Keyan Pishdadian           28        885 days      0.030000
169     Christopher Grebs           28       1515 days      0.020000
666    Ronny Pfannschmidt           27       3060 days      0.010000
712           Simon Sapin           22        793 days      0.030000
372           Jeff Widman           19        840 days      0.020000
427    Julen Ruiz Aizpuru           16         36 days      0.440000
21                 Adrian           16       1935 days      0.010000
569        Nicholas Wiles           14        197 days      0.070000
912                lord63           14        692 days      0.020000
756           ThiefMaster           12       1287 days      0.010000
763       Thomas Waldmann           11       1560 days      0.010000
628            Priit Laes           10       1567 days      0.010000
23        Adrian Moennich           10        521 days      0.020000
391  Jochen Kupperschmidt           10       3060 days      0.000000

高级cli搅动:按文件类型获取搅动

获取按流失计数排序的前十个文件,扩展名为.py:

✗ dml gstats churn --path /Users/noahgift/src/flask --limit 10 --ext .py
2017-10-15 12:10:55,783 - devml.post_processing - INFO - Running churn cmd: [git log --name-only --pretty=format:] at path [/Users/noahgift/src/flask]
                       files  churn_count  line_count extension  \
1            b'flask/app.py'          316      2183.0       .py
3        b'flask/helpers.py'          176      1019.0       .py
5    b'tests/flask_tests.py'          127         NaN       .py
7                b'flask.py'          104         NaN       .py
8                b'setup.py'           80       112.0       .py
10           b'flask/cli.py'           75       759.0       .py
11      b'flask/wrappers.py'           70       194.0       .py
12      b'flask/__init__.py'           65        49.0       .py
13           b'flask/ctx.py'           62       415.0       .py
14  b'tests/test_helpers.py'           62       888.0       .py

    relative_churn
1             0.14
3             0.17
5              NaN
7              NaN
8             0.71
10            0.10
11            0.36
12            1.33
13            0.15
14            0.07

获取extension.py的描述性统计信息并与另一个存储库进行比较

在这个例子中,flask、repo和cpython都被比较为 中位数的波动。

(.devml) ➜  devml git:(master) dml gstats metachurn --path /Users/noahgift/src/flask --ext .py --statistic median
2017-10-15 12:39:44,781 - devml.post_processing - INFO - Running churn cmd: [git log --name-only --pretty=format:] at path [/Users/noahgift/src/flask]
MEDIAN Statistics:

           churn_count  line_count  relative_churn
extension
.py                  2        85.0            0.13
(.devml) ➜  devml git:(master) dml gstats metachurn --path /Users/noahgift/src/devml --ext .py --statistic median
2017-10-15 12:40:10,999 - devml.post_processing - INFO - Running churn cmd: [git log --name-only --pretty=format:] at path [/Users/noahgift/src/devml]
MEDIAN Statistics:

           churn_count  line_count  relative_churn
extension
.py                  1        62.5            0.02

(.devml) ➜  devml git:(master) dml gstats metachurn --path /Users/noahgift/src/cpython --ext .py --statistic median
2017-10-15 12:42:19,260 - devml.post_processing - INFO - Running churn cmd: [git log --name-only --pretty=format:] at path [/Users/noahgift/src/cpython]
MEDIAN Statistics:

           churn_count  line_count  relative_churn
extension
.py                  7       169.5             0.1

获取作者的相对流失量
dml gstats authorchurnmeta --author "Armin Ronacher" --path /tmp/checkout/flask --ext .py

#He has 6.5% median relative churn...very good.

count    193.000000
mean       0.331860
std        0.625431
min        0.001000
25%        0.030000
50%        0.065000
75%        0.250000
max        3.000000
Name: author_rel_churn, dtype: float64

比较cpython活动比率和linux活动比率

# Linux Development Active Ratio
dml gstats activity --path /Users/noahgift/src/linux --sort active_days

                       author_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 Ratio

            author_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

In this analysis, Guido of Python has a 23% probability of working on a given day, and Linux has a 28% chance.

删除统计

从存储库中查找所有删除文件

dml gstats deleted --path /Users/noahgift/src/flask

DELETION STATISTICS

                                                 files          ext
0                        b'tests/test_deprecations.py'          .py
1                       b'scripts/flask-07-upgrade.py'          .py
2                             b'flask/ext/__init__.py'          .py
3                                  b'flask/exthook.py'          .py
4                        b'scripts/flaskext_compat.py'          .py
5                                 b'tests/test_ext.py'          .py

常见问题

什么是搅动,我为什么在乎?

代码搅动是文件被修改的次数。相对的 搅动是相对于 代码。对软件缺陷的研究表明,相关代码 客户流失对缺陷的预测能力很强,即相对的 搅动数越高的缺陷数量。

“相对代码流失量的增加伴随着 系统内缺陷密度;“

你可以在这里阅读整个研究: https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/icse05churn.pdf

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
由于java的原因,maven无法运行代码。lang.NoClassDefFoundError:com/fasterxml/jackson/annotation/JsonMerge   Android项目中的java Creative SDK图像编辑器UI   java如何在Android Studio中使用DataOutputStream上传文件并将其他参数传递到web服务器   java倒计时服务打开时崩溃   java将RubyonRails项目转换为JRubyonRails项目   java我的图库意图是不显示图像?为什么?   java如何在春季启动时跳过mongodb/   java@Autowired在Spring中是如何实现的   甲骨文Akka java。util。同时发生的timeoutexception线程池频繁超时   java maven依赖项对spring启动应用程序有何影响?   java Firestore执行复合查询,未截获事件“已修改”   java ItemStreamException:未能初始化读取器,原因是:IllegalStateException:流已初始化。重新开放前关闭   java将空标记解组到集合的新实例中   使用AspectJ的java新手:无法调用aspect   java查找棋类游戏的所有组合   你为什么要这样做and==与Java中的equals方法不一样吗?   如何对使用JavaUUID的代码进行单元测试?