博士项目的一些“小数据”

10 minute read

现在比较流行“大数据”,我这个三年的博士只能做点小数据…当初在 Bitbucket 上为自己博士开个 repository 的时候,一方面是因为 EDF 用不了 Dropbox 无法同步资料(或者备份资料吧);一方面就是有个对每天工作的 suivi,知道每天干了什么,如果今后做错了可以回到之前的东西;最后就是想到最后可以对博士项目进行下统计..看自己是怎么工作的。

所以就用 Python 做了个简单的 script,主要是用到 Mercurial 的基本日志功能 hg log,然后是用的 pandas 做直方图的统计(因为数据不一定是数,而是字符串)。由于我第一年换过 repository,所以要把之前一个的 commits 算上。

首先要说一下,每个 commit 不是平等的…有些 commit 肯定比其他 commit 重要(比如修改文件数量很多,添加了很多新东西),而有些就是简单的 merge…这里就不区分了,把每次 commit 就看成是一次活,我们关心的是 commit 在时间上的分布,分析我的工作规律..

首先从2013年10月份博士开始到现在,一共有过 629 次 commit,统计的大数定律出现了,很巧每年(完整年)大致的 commit 数量都差不多(或者说每天平均?)。比如很巧的是2014年和15年几乎一样,都差不多250个 commit。今年差不多一半了,就差不多125个…

很有意思的是春天(3、4、5月)我的效率最高(重申这里效率的定义是 commits 数量…),而效率最低的是冬天(12、1、2月)…特别是2月到3月一个猛涨…个人推测是由于我好像几次2月份回国过春节而已…

星期

周三达到一个小高峰,不知为什么周四下降(憧憬周末了?),周五达到最高值,个人认为是固定思维要做一个 commit 为了可能周末可以工作…

小时

可以说两点:

  1. 主要集中在下班时间(17点-19点),记录今天工作结果
  2. 其次说明我下班后有时候还工作…睡觉前再来一个 commit 然后第二天继续工作…

最后给出源代码,去掉和 old-commits 相关的东西应该可以适用任何用 Mercurial 管理的 repository。

from homepylab import *
import pandas
from collections import Counter
import subprocess
import os

out = subprocess.check_output(["hg", "log"])

fold = open("old-commits", "r")
f = open("out", "w")
f.writelines(out)
for line in fold:
    f.write(line)
f.close()

f = open("out", "r")
weekday = []
month = []
year = []
hour = []
day = []
for line in f:
    if line.startswith("date"):
        data = line.split()
        weekday.append(data[1])
        month.append(data[2])
        year.append(data[5])
        hour.append(int(data[4].split(":")[0]))
        day.append(int(data[3]))

for item in ["weekday", "month", "year", "hour", "day"]:

    figure()
    letter_counts = Counter(eval(item))
    df = pandas.DataFrame.from_dict(letter_counts, orient="index")
    if item == "weekday":
        index = [u'Mon', u'Tue', u'Wed', u'Thu', u'Fri', u'Sat', u'Sun']
        df = df.reindex(index)
    elif item == "month":
        index = [u'Jan', u'Feb', u'Mar', u'Apr', u'May', u'Jun', u'Jul', u'Aug', u'Sep', u'Oct', u'Nov', u'Dec']
        df = df.reindex(index)
    elif item == "year":
        index = ["2013", "2014", "2015", "2016"]
        df = df.reindex(index)

    fig = df.plot(kind="bar", legend=False, alpha=0.5, rot=0)

    ylabel(r"\# of commits")
    xlabel(item.capitalize())
    title(r"Total \# of commits: %d" %(len(eval(item)))).set_y(1.04)
    savefig("nbcommits_%s.ipe" %(item))

os.remove("out")

Comments