0

0

使用 Pandas 进行 JIRA 分析

王林

王林

发布时间:2024-08-23 21:26:35

|

482人浏览过

|

来源于dev.to

转载

问题

很难说 atlassian jira 是最受欢迎的问题跟踪器和项目管理解决方案之一。你可以喜欢它,也可以讨厌它,但如果你被某家公司聘用为软件工程师,那么很有可能会遇到 jira。

如果您正在从事的项目非常活跃,可能会有数千个各种类型的 jira 问题。如果您领导着一个工程师团队,您可能会对分析工具感兴趣,这些工具可以帮助您根据 jira 中存储的数据了解项目中发生的情况。 jira 集成了一些报告工具以及第三方插件。但其中大多数都是非常基本的。例如,很难找到相当灵活的“预测”工具。

项目越大,您对集成报告工具的满意度就越低。在某些时候,您最终将使用 api 来提取、操作和可视化数据。在过去 15 年的 jira 使用过程中,我看到了围绕该领域的数十个采用各种编程语言的此类脚本和服务。

许多日常任务可能需要一次性数据分析,因此每次都编写服务并没有什么回报。您可以将 jira 视为数据源并使用典型的数据分析工具带。例如,您可以使用 jupyter,获取项目中最近的错误列表,准备“特征”列表(对分析有价值的属性),利用 pandas 计算统计数据,并尝试使用 scikit-learn 预测趋势。在这篇文章中,我想解释一下如何做到这一点。

准备

jira api 访问

这里我们要说的是云版jira。但如果您使用的是自托管版本,主要概念几乎是相同的。

首先,我们需要创建一个密钥来通过 rest api 访问 jira。为此,请转到配置文件管理 - https://id.atlassian.com/manage-profile/profile-and-visibility 如果选择“安全”选项卡,您将找到“创建和管理 api 令牌”链接:

使用 Pandas 进行 JIRA 分析

在此处创建一个新的 api 令牌并安全地存储它。我们稍后会使用这个令牌。

使用 Pandas 进行 JIRA 分析

jupyter 笔记本

处理数据集最方便的方法之一是使用 jupyter。如果您不熟悉这个工具,请不要担心。我将展示如何使用它来解决我们的问题。对于本地实验,我喜欢使用 jetbrains 的 dataspell,但也有免费的在线服务。 kaggle 是数据科学家中最知名的服务之一。但是,他们的笔记本不允许您建立外部连接以通过 api 访问 jira。另一项非常受欢迎的服务是 google 的 colab。它允许您进行远程连接并安装额外的 python 模块。

jira 有一个非常易于使用的 rest api。您可以使用您最喜欢的 http 请求方式进行 api 调用并手动解析响应。然而,我们将利用一个优秀且非常流行的 jira 模块来实现此目的。

实际使用的工具

数据分析

让我们结合所有部分来提出解决方案。

进入google colab界面并创建一个新笔记本。创建笔记本后,我们需要将之前获得的 jira 凭据存储为“秘密”。单击左侧工具栏中的“密钥”图标打开相应的对话框并添加两个具有以下名称的“秘密”:jira_user 和 jira_password。在屏幕底部,您可以看到如何访问这些“秘密”:

使用 Pandas 进行 JIRA 分析

接下来是安装额外的 python 模块以进行 jira 集成。我们可以通过在笔记本单元范围内执行 shell 命令来做到这一点:

!pip install jira

输出应如下所示:

collecting jira
  downloading jira-3.8.0-py3-none-any.whl (77 kb)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 77.5/77.5 kb 1.3 mb/s eta 0:00:00
requirement already satisfied: defusedxml in /usr/local/lib/python3.10/dist-packages (from jira) (0.7.1)
...
installing collected packages: requests-toolbelt, jira
successfully installed jira-3.8.0 requests-toolbelt-1.0.0

我们需要获取“秘密”/凭证:

from google.colab import userdata

jira_url = 'https://******.atlassian.net'
jira_user = userdata.get('jira_user')
jira_password = userdata.get('jira_password')

并验证与 jira cloud 的连接:

from jira import jira

jira = jira(jira_url, basic_auth=(jira_user, jira_password))
projects = jira.projects()
projects

如果连接正常并且凭据有效,您应该会看到一个非空的项目列表:

[<jira project: key='proj1', name='name here..', id='10234'>,
 <jira project: key='proj2', name='friendly name..', id='10020'>,
 <jira project: key='proj3', name='one more project', id='10045'>,
...

这样我们就可以从 jira 连接并获取数据了。下一步是获取一些数据以使用 pandas 进行分析。让我们尝试获取某个项目在过去几周内已解决问题的列表:

jira_filter = 19762

issues = jira.search_issues(
    f'filter={jira_filter}',
    maxresults=false,
    fields='summary,issuetype,assignee,reporter,aggregatetimespent',
)

我们需要将数据集转换为pandas数据框:

import pandas as pd

df = pd.dataframe([{
    'key': issue.key,
    'assignee': issue.fields.assignee and issue.fields.assignee.displayname or issue.fields.reporter.displayname,
    'time': issue.fields.aggregatetimespent,
    'summary': issue.fields.summary,
} for issue in issues])

df.set_index('key', inplace=true)

df

输出可能如下所示:

使用 Pandas 进行 JIRA 分析

DreamStudio
DreamStudio

SD兄弟产品!AI 图像生成器

下载

我们想分析一下解决问题通常需要多长时间。人都是不理想的,所以有时他们会忘记记录工作。如果您尝试使用 jira 内置工具分析此类数据,则会带来麻烦。但我们用pandas做一些调整并不是问题。例如,我们可以将“时间”字段从秒转换为小时,并用中值替换缺失的值(注意,如果有很多间隙,dropna 可能更合适):

df['time'].fillna(df['time'].median(), inplace=true)
df['time'] = df['time'] / 3600

我们可以轻松地可视化分布以找出异常情况:

df['time'].plot.bar(xlabel='', xticks=[])

使用 Pandas 进行 JIRA 分析

查看受让人解决的问题的分布也很有趣:

top_solvers = df.groupby('assignee').count()[['time']]
top_solvers.rename(columns={'time': 'tickets'}, inplace=true)
top_solvers.sort_values('tickets', ascending=false, inplace=true)

top_solvers.plot.barh().invert_yaxis()

它可能看起来像下面这样:

使用 Pandas 进行 JIRA 分析

预测

让我们尝试预测完成所有未决问题所需的时间。当然,我们可以在没有机器学习的情况下,通过使用简单的近似和平均时间来解决问题。因此,预计所需时间就是未解决问题的数量乘以解决问题的平均时间。例如,解决一个问题的平均时间为 2 小时,而我们有 9 个未解决的问题,因此解决所有问题所需的时间为 18 小时(近似值)。这是一个足够好的预测,但我们可能知道解决的速度取决于产品、团队和问题的其他属性。如果我们想改进预测,我们可以利用机器学习来解决这个任务。

高级方法如下所示:

  • 获取“学习”数据集
  • 清理数据
  • 准备“特征”,又名“特征工程”
  • 训练模型
  • 使用模型来预测目标数据集的某些值

第一步,我们将使用过去 30 周的门票数据集。出于说明目的,此处对某些部分进行了简化。在现实生活中,用于学习的数据量应该足够大才能建立有用的模型(例如,在我们的例子中,我们需要分析数千个问题)。

issues = jira.search_issues(
    f'project = pps and status in (resolved) and created >= -30w',
    maxresults=false,
    fields='summary,issuetype,customfield_10718,customfield_10674,aggregatetimespent',
)

closed_tickets = pd.dataframe([{
    'key': issue.key,
    'team': issue.fields.customfield_10718,
    'product': issue.fields.customfield_10674,
    'time': issue.fields.aggregatetimespent,
} for issue in issues])

closed_tickets.set_index('key', inplace=true)
closed_tickets['time'].fillna(closed_tickets['time'].median(), inplace=true)

closed_tickets

就我而言,大约有 800 张门票,并且只有两个“学习”字段:“团队”和“产品”。

下一步是获取我们的目标数据集。我为什么这么早做?我想一次性清理两个数据集并进行“特征工程”。否则,结构之间的不匹配可能会导致问题。

issues = jira.search_issues(
    f'project = pps and status in (open, reopened)',
    maxresults=false,
    fields='summary,issuetype,customfield_10718,customfield_10674',
)

open_tickets = pd.dataframe([{
    'key': issue.key,
    'team': issue.fields.customfield_10718,
    'product': issue.fields.customfield_10674,
} for issue in issues])

open_tickets.set_index('key', inplace=true)

open_tickets

请注意,我们这里没有“时间”列,因为我们想要预测它。让我们取消它并结合两个数据集来准备“特征”。

open_tickets['time'] = 0
tickets = pd.concat([closed_tickets, open_tickets])

tickets

“团队”和“产品”列包含字符串值。处理这个问题的方法之一是将每个值转换为带有布尔标志的单独字段。

products = pd.get_dummies(tickets['product'], prefix='product')
tickets = pd.concat([tickets, products], axis=1)
tickets.drop('product', axis=1, inplace=true)

teams = pd.get_dummies(tickets['team'], prefix='team')
tickets = pd.concat([tickets, teams], axis=1)
tickets.drop('team', axis=1, inplace=true)

tickets

结果可能如下所示:

使用 Pandas 进行 JIRA 分析

组合数据集准备完毕后,我们可以将其分成两部分:

closed_tickets = tickets[:len(closed_tickets)]
open_tickets = tickets[len(closed_tickets):][:]

现在是时候训练我们的模型了:

from sklearn.model_selection import train_test_split
from sklearn.tree import decisiontreeregressor

features = closed_tickets.drop(['time'], axis=1)
labels = closed_tickets['time']

features_train, features_val, labels_train, labels_val = train_test_split(features, labels, test_size=0.2)

model = decisiontreeregressor()
model.fit(features_train, labels_train)
model.score(features_val, labels_val)

最后一步是使用我们的模型进行预测:

open_tickets['time'] = model.predict(open_tickets.drop('time', axis=1, errors='ignore'))
open_tickets['time'].sum() / 3600

最终的输出,就我而言,是 25 小时,这比我们最初的粗略估计要高。这是一个基本的例子。但是,通过使用 ml 工具,您可以显着扩展分析 jira 数据的能力。

结论

有时,jira 内置工具和插件不足以进行有效分析。此外,许多第 3 方插件相当昂贵,每年花费数千美元,而且您仍然很难让它们按照您想要的方式工作。然而,您可以通过 jira api 获取必要的信息,轻松利用众所周知的数据分析工具,并超越这些限制。我花了很多时间使用各种 jira 插件,试图为项目创建好的报告,但它们经常错过一些重要的部分。在 jira api 之上构建工具或功能齐全的服务通常看起来也有些过头了。这就是为什么 jupiter、pandas、matplotlib、scikit-learn 等典型数据分析和 ml 工具在这里可能效果更好。

使用 Pandas 进行 JIRA 分析

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

82

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

34

2026.01.31

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

651

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1229

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1205

2024.04.29

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号