基于Pandas分组操作分析Git仓库日志数据的技术问询
Git仓库日志分析:解决你的四个统计需求
Hey Andrew, 我来帮你一步步实现这四个统计需求,咱们基于你已经写好的Pandas代码来扩展,这样你能快速衔接上:
首先,先把基础的数据处理代码统一放这里(和你的代码保持一致,方便后续复用):
import pandas as pd # 显示所有列和行,方便查看结果 pd.set_option('display.max_columns', None) pd.set_option('display.max_rows', None) # 读取数据并转换日期格式 dataframe = pd.read_csv("git-log-2020.csv") dataframe['date'] = pd.to_datetime(dataframe['date']) # 先按月份和用户分组,计算每个用户每月的提交次数,这个是后续所有统计的基础 grouped_month_user = dataframe.groupby( [pd.Grouper(key='date', freq='M'), "email"] )[["subject"]].count().rename(columns={'subject': 'monthly_commits'})
1. 每月提交量排名前三的用户
我们可以在按月分组的结果里,对每个月份的用户提交数取前3名:
# 对每个月份的用户提交数排序,取前三 top3_per_month = grouped_month_user.groupby(level='date').apply( lambda x: x.nlargest(3, 'monthly_commits') ).reset_index(level=0, drop=True) print("每月提交量前三的用户:") print(top3_per_month)
这里用groupby(level='date')按月份分组,nlargest(3, 'monthly_commits')直接取出每个组里提交数最多的三个用户,最后重置索引让结果更易读。
2. 每月总提交次数
这个需求很直接,只需要按月份聚合所有用户的提交数总和:
monthly_total_commits = grouped_month_user.groupby(level='date')['monthly_commits'].sum().rename('total_monthly_commits') print("\n每月总提交次数:") print(monthly_total_commits)
基于之前的grouped_month_user,再次按月份分组,对monthly_commits求和,就能得到每个月的总提交量。
3. 每月每位用户的平均提交次数
这里的逻辑是:每月总提交数 ÷ 当月有提交的用户数量,我们可以先分别计算这两个值,再做除法:
# 计算每月的用户数量 monthly_user_count = grouped_month_user.groupby(level='date').size().rename('monthly_user_count') # 计算每月用户平均提交次数 monthly_avg_per_user = monthly_total_commits / monthly_user_count monthly_avg_per_user = monthly_avg_per_user.rename('avg_commits_per_user_per_month') print("\n每月每位用户的平均提交次数:") print(monthly_avg_per_user)
先通过size()得到每个月有提交的用户数,再用每月总提交数除以这个数值,就得到了当月用户的平均提交次数。
4. 用户的月度平均活跃度
这里的月度平均活跃度指的是:每个用户的总提交数 ÷ 该用户有提交记录的月份数,也就是用户平均每个参与月份的提交量:
# 先计算每个用户的总提交数和参与的月份数 user_stats = grouped_month_user.reset_index().groupby('email').agg( total_commits=('monthly_commits', 'sum'), active_months=('date', 'nunique') ) # 计算月度平均活跃度 user_monthly_avg_active = user_stats['total_commits'] / user_stats['active_months'] user_monthly_avg_active = user_monthly_avg_active.rename('monthly_avg_activity') print("\n用户的月度平均活跃度:") print(user_monthly_avg_active)
先重置索引,然后按用户分组,用agg()同时计算总提交数和参与的月份数,最后做除法得到每个用户的月度平均活跃度。
内容的提问来源于stack exchange,提问作者Andrew Holway
相关产品推荐
相关产品推荐

