Python计算结果与Cycle Time Widget平均周期时间不符求助
Azure DevOps Cycle Time Widget 平均周期时间计算结果不一致问题
问题概述
我在对比Azure DevOps Cycle Time Widget显示的平均周期时间与自定义计算结果时,发现数值存在差异:
- Cycle Time Widget显示12天
- 用Python/Pandas调用Feed OData API直接计算平均值得到11天
- 按官方逻辑实现移动平均时,结果为9天或11天
- 用Power BI连接Feed OData API计算,结果同样为11天
代码实现(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') 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)) # 返回11.0,而非预期的12.0 # 移动平均计算(参考官方逻辑) 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)) # 返回9.0,而非预期的12.0 print(round(df['SMA_n'].mean(), 0)) # 返回11.0,而非预期的12.0
待排查疑问
请协助分析可能导致差异的原因:
- OData API返回的
CycleTimeDays字段计算逻辑是否与Widget不一致? - Widget是否对时间范围、工作项筛选有特殊处理(比如状态转换规则、时区差异)?
- 移动平均的窗口计算或数据排序逻辑是否与官方实现存在偏差?
内容的提问来源于stack exchange,提问作者fcoalcantarajr
相关产品推荐
相关产品推荐

