首页 > 编程问答 >我的 Python 代码和 Cycle Time 小部件之间的平均周期时间不同

我的 Python 代码和 Cycle Time 小部件之间的平均周期时间不同

时间:2024-07-25 11:33:30浏览次数:9  
标签:python azure-devops powerbi odata azure-boards

我过去遇到过如何在周期时间小部件中计算平均周期时间的一些问题,因此我决定使用 Python 进行分析,看看是否找到任何方法来计算平均周期时间并获得相同的结果周期时间小部件中显示的值。

我的问题是我无法达到周期时间小部件中显示的相同的平均周期时间值。

你们能帮我解决这个问题吗?|| |在撰写本主题时,周期时间小部件中显示的平均周期时间值为 12 天。

但是,使用 Python、Pandas 并连接 Feed OData API,我从未达到相同的值。我已经达到了 11 天的值,并且使用其他计算方法(例如移动平均线),我已经达到了 9 天或 11 天。我已在帖子中提供了代码。

当使用 Power BI 并与 Feed OData API 连接时(按照此处指示的方式

),我获得的平均周期时间值仍然是 11。 在撰写本主题时,我的目标值为 12 天。 这是我的代码 - 最初是在 Jupyter 笔记本中编写的:

At the time of writing this topic, the value I was targeting were 12 days.

Here’s my code - originally written in a Jupyter notebook:

# %%
import pandas as pd
import requests
import json
import base64
import math
from datetime import datetime, timedelta

# %%
token_do_azure = '{hidden}'
pat_encoded = base64.b64encode((":" + token_do_azure).encode()).decode()
headers = {
    'Content-Type': 'application/json',
    'Authorization': f'Basic {pat_encoded}'
}

# %%
hoje = datetime.today()

delta = timedelta(days=90)
dia_resultante = hoje - delta

dia_formatado = dia_resultante.strftime('%Y-%m-%dT00:00:00.00000Z')

print(dia_formatado)

url = rf"https://analytics.dev.azure.com/{hidden}/_odata/v4.0-preview/WorkItems?$select=WorkItemId,WorkItemType,Title,CycleTimeDays,ClosedDate&$filter=(Project/ProjectName eq 'Suporte_Torres' AND (WorkItemType eq 'Issue') AND State eq 'Done' AND ClosedOn/Date ge {dia_formatado})"

# %%
req = requests.get(url, headers=headers)
req_tabela = json.loads(req.text)
req_valores = req_tabela["value"]

# %%
df = pd.DataFrame(req_valores)
df['ClosedDate'] = pd.to_datetime(df['ClosedDate'], format='ISO8601').dt.date

# %%
print(round(df['CycleTimeDays'].mean(), 0))
# Returns 11.0, instead of 12.0.

# %%
# The moving average part of the code was written based on the moving average content of this page: https://learn.microsoft.com/en-us/azure/devops/report/dashboards/cycle-time-and-lead-time?view=azure-devops
def calcular_janela_n(n_dias):
    n = int(0.2 * n_dias)
    n = math.floor(n)
    if n % 2 == 0:
        n -= 1
    if n < 1:
        n = 1
    return n

janela_n = calcular_janela_n(90)

# %%
df['SMA_n'] = df['CycleTimeDays'].rolling(window=janela_n, min_periods=1).mean()
print(round(df['SMA_n'].tail(1).iloc[0], 0))
# Returns 9.0, instead of 12.0.
print(round(df['SMA_n'].mean(), 0))
# Returns 11.0, instead of 12.0.

在比较从 Python 代码和 Azure DevOps 周期时间小组件获得的平均周期时间结果时,有几个原因可能会导致差异。以下是解决差异的分步指南,以及需要牢记的一些事项:

  1. 日期范围对齐:

    • 确保的 Python 脚本和周期时间小组件使用完全相同的日期范围。 检查小组件中是否应用了任何过滤器,这可能会减少所考虑的工作项数量。
    • 时区: 验证 Python 代码和 Azure DevOps 帐户中使用的时区之间是否一致。时区差异可能会导致计算的周期时间出现细微差异。
  2. 工作项过滤:

    • 验证的小组件和 Python 脚本是否使用相同的筛选条件。 周期时间小组件可能包含可以自定义的筛选条件。 确保的 Python 代码复制了这些条件,包括工作项类型、项目、里程碑或任何自定义筛选条件。
    • 周末/节假日: Azure DevOps 允许在计算周期时间时配置工作日。 确保的 Python 脚本与这些设置一致。如果 Azure DevOps 配置为排除周末或节假日,需要在 Python 代码中进行相应调整。
  3. 计算周期时间的逻辑理解:

    • Azure DevOps 计算: Azure DevOps 计算周期时间的方式是,从工作项进入“进行中”状态的那一天到其进入“完成”状态的那一天,但不包括在“完成”状态中度过的那一天。
    • 复制逻辑: 确保的 Python 代码完全反映了这种计算。
  4. 处理异常值:

    • 识别异常值: 极高的周期时间值(异常值)会极大地影响平均值。 在的 Python 代码和 Azure DevOps 中识别并检查这些异常值。
    • 异常值策略: 确定 Azure DevOps 如何处理异常值。它可能完全排除它们、使用不同的平均方法或应用某种形式的平滑处理。在的 Python 分析中调整异常值的处理方式以匹配。
  5. 移动平均线计算:

    • 窗口大小: 虽然 Azure DevOps 的周期时间小组件确实提供了移动平均选项,但确切的实现(窗口大小、加权)可能会有所不同或未明确说明。尝试试验 Python 代码中的窗口大小,以查看它是否与小组件值相符。
  6. API 分页:

    • 如果的数据集中有大量工作项,则 Azure DevOps API 可能会将结果分页。 确保的 Python 代码从 API 中获取所有页面的数据以包含所有相关的工作项。

调试技巧:

  • 从一个较小的数据集开始: 选择一个非常小的工作项集,可以在其中手动验证 Azure DevOps 和 Python 代码中的计算结果。
  • 逐步比较: 逐步调整的 Python 代码,每次比较结果,以隔离导致差异的特定部分。
  • 记录和日志记录: 添加日志记录语句以捕获 Python 代码中的中间计算和过滤后的数据集大小。这可以帮助查明差异。

代码改进建议:

  • 直接日期比较: 与其格式化日期字符串进行比较,不如在 Python 代码中使用 datetime.date 对象进行更可靠的比较。
  • 优化 API 查询: 仅请求的分析所需的字段(例如, WorkItemId ClosedDate CycleTimeDays ),以减少数据传输并提高性能。

通过系统地解决这些要点,应该能够识别出差异的原因,并使的 Python 代码与 Azure DevOps 周期时间小组件保持一致。

标签:python,azure-devops,powerbi,odata,azure-boards
From: 78755022

相关文章

  • python3之requests库使用
    使用https://www.cnblogs.com/caroline2016/p/17007956.html建立的api测试下requests库怎么使用。模拟登录时laravelapi那边出现了 Sessionstorenotsetonrequest.错误。解决办法在app/Http/Kernel.php中api中间件组中添加两行代码:<?phpprotected$middlewareGrou......
  • 如何利用Python中的pyecharts制作—不同的柱状图
    目录专栏导读库的介绍库的安装1、柱状图(防止x轴标签名过长)2、柱状图—堆叠样式3、复合型柱状图4、柱状图—字典型总结专栏导读......
  • 六、【Python】基础教程-【Python全掌握】六大基础数据类型:浮点、布尔、列表、元组、
    ......
  • 用于获取半径内邮政编码的 Python 脚本无法正确填充 CSV
    我正在尝试编写一个Python脚本,该脚本读取包含邮政编码的CSV文件,使用API获取半径内的邮政编码,然后将结果填充到CSV中的新列中。API请求似乎工作正常,我可以在控制台输出中看到响应。但是,生成的CSV文件在radius_zips列中没有预期的值。这是我当前的脚本:......
  • 如何在Python中对轮廓图应用点画?
    我想向XarrayDataArray数据添加点画以指示重要性。该数据是经纬度网格上的二维气候数据。我想提供一个True/False掩码来绘制映射的变量数据。我正在尝试使用contourf来达到此目的,但如果它们更合适,我愿意接受其他方法。我尝试过使用contourf孵化点画重要区域,但......
  • 在 Python Notebook 中调用 `subprocess` 具有与 `!` shell 不同的 `$PATH`
    我正在IPython笔记本中交互地开发一个包装类。这个包装类调用用java编写的命令行程序,因此我需要访问用于编译该程序的相同版本的java运行时。但是,我注意到在笔记本中使用方便的!运算符,生成的shell实例与在我的终端中使用zsh时不同。这得到了确......
  • 在 VSCode 中激活 conda env 时,“which python”和“sys.path”给出不同的输出
    当我激活condaenv时,选择相应的解释器并在VScode中启动Python乍一看一切似乎都很好:(My_env)name@my_computer:~/Bureau/My_env/Code/current_dir$/home/name/anaconda3/envs/My_env/bin/python-mIPython--no-autoindentPython3.12.4|packagedb......
  • Python课程设计项目期末大作业(含免费源代码)
    选题代码下载地址:https://download.csdn.net/download/s44359487yad/89572689选题程序名称:口红色号识别器选题:基于图像处理、人脸识别和Flask构建的图片口红色号识别及商品推荐系统功能:根据上传的图片自动化图像处理后分析脸部特征,并判断其嘴部妆容状态,依托现......
  • python webbrowser.open 不使用默认浏览器
    对你们来说这是一个好奇的家伙..在我的python程序中webbrowser.open('etc..')打开MicrosoftEdge现在奇怪的是,我在与opensChrome(我的默认值)稍有不同的文件夹中还有另一个python程序关于发生了什么的任何想法吗?!!(我知道有人问过类似的问题,但......
  • 如何在 Mac 上运行 Python 文件来读取 txt 文件并将其写入外部硬盘?
    我目前有一个充满了我想阅读的epub的文件夹,一个我已经阅读过并想再次阅读的epub的文件夹,以及一个相应的文件,其中每个文件都有epub文件的名称。问题是,这些文件夹仅位于我的外部硬盘上。我想要做的是让我的脚本解析这些文件夹中的epub列表,并在我的下载文件夹中创建最新的副......