Python:Impact-effort图表实现教程

283 阅读7分钟

嘿,伙计们!在本教程结束时,你将最终学会如何使用Python编程语言实现影响-努力图表。我们首先要了解什么是影响-努力图表,以及为什么它们很重要。


Impact-effort图的介绍

让我们快速了解影响-努力图表究竟是什么。并在此基础上,用python创建一个代码来实现影响-努力图表。

注意:这是一个复杂的过程,需要专业技术。如果你正在寻找一个更简单的解决方案,可以使用一个客户反馈管理工具,该工具可以在没有任何麻烦的情况下执行这些计算和视觉化。

什么是Impact-effort图表?

是一种工具,可以帮助一个团队确定哪些方面的问题。 影响-努力决策图是一个工具,可以帮助一个团队确定哪些是需要重点改进的领域。该图表可以帮助一个人根据任务的效果和达到每个目标所需的工作量对质量改进的 "待办事项 "清单进行分类。

Effort Impact Chart Demo

工作影响图演示

高产归根结底是要尽可能有效地管理你的时间。通过对所有任务进行影响与努力的分析,你可以过滤掉无关紧要的杂事,把注意力集中在你每天的关键目标上。当你在接收客户对你的产品的反馈,并希望创建任务来提高你的产品质量时,这非常有用。市场上有许多客户反馈管理软件,我个人使用过的其中一个是UserWell,它为B2B公司解决了所有与反馈有关的挑战。

Impact-effort图表的重要性

影响-努力图表有各种好处。其中一些列在下面:

  1. 有助于优化有限的时间和资源
  2. 为每天的待办事项甚至是复杂的战略计划提供直观的感觉
  3. 有助于根据对实现目标最有帮助的内容来确定任务的优先次序
  4. 帮助调整目标和优先事项

现在我们已经知道了什么是影响-努力图表,让我们来看看同样的代码实现。


实施Impact-effort图表

为了实现该图表,我们将遵循一些步骤。这些步骤列在下面的图表中。

ImpactEffortChart Implementation

ImpactEffortChart的实现

第1步 - 导入模块/库

就像其他程序一样,最初的步骤是将所有必要的模块/库导入我们的代码中。对于这个实现,我们只需要两个模块,即pandas和matplotlib。

import pandas as pd
import matplotlib.pyplot as plt

我希望你对这两个模块都很熟悉。如果没有,那就看看下面提到的教程吧:

  1. Python Pandas模块教程
  2. Python Matplotlib教程

第2步--加载和清理数据

下一步是将定制的或随机的数据集加载到我们的程序中。下面是所用数据的快照。

TaskList Snap ImpactMatrix

TaskList Snap ImpactMatrix

在本教程中,我们将利用这个数据集,它包含一些任务,包括开始和结束日期以及每个任务的优先级。还有一些额外的属性,但我们不需要它们。

在加载的同时,我们需要确保删除nan (如果有的话)。同样的代码显示如下。

data = pd.read_csv("Task_List.csv")
data =data.dropna()
data.head()

ImpactEffortChart Loaded Data

ImpactEffortChart加载的数据

第3步--从数据中提取所需信息

下一步涉及从数据中获取必要的信息。为了实现这一点,我们将制作一个字典,其中包含优先级和分配给每个任务的天数。

我已经假设优先级定义了任务将产生的影响,而努力将由任务的天数决定。

这里的一个主要任务是计算每项任务的天数。为了实现这一点,我们需要datetime 模块并获得date 函数。

我们首先将每个任务的开始和结束日期分开,并提取日期,创建两个date 对象。最后,我们找出两者之间的差异,并从差异中返回天数。

下面是相同的代码实现。如果你不知道datetime模块是如何工作的,请查看这个 教程。

from datetime import date
def get_time (start,end):
    start = (start.split()[0]).split('-')
    end = (end.split()[0]).split('-')
    start = date(int(start[2]), int(start[1]),int(start[0]))
    end = date(int(end[2]),int(end[1]),int(end[0]))
    diff = end - start
    return diff.days

现在我们有了计算天数的函数,也就是计算每个任务的时间。我们将继续创建字典,它将与列表中每个任务的优先级一起存储相同的内容。

all_tasks = data['Task']
final_data = {}
for i in range(len(all_tasks)):
    l = list()
    # priority
    l.append(data['Priority'][i])
    # get_no_days
    l.append(get_time(data['Start Date'][i],data['End Date'][i]))
    final_data[all_tasks[i]] = l

最后的字典有如下形式的值:

Extracted Data ImpactEffortChart

提取的数据 ImpactEffortChart

第4步 - 为每个任务分配一个象限

现在,下一个任务是在我们将在下一阶段绘制的图中为每个任务分配一个象限。

象限是根据某些规则和假设定义的,如下表所示:

象限编号象限名称天数优先级
1高影响-低努力>10
2高影响 - 高努力<10
3低影响 - 低努力>10低/中
4低影响 - 高努力程度<10低/中

为了给每个任务分配坐标点,我们需要一个特定的范围,以便使用random 模块来分配随机坐标。如果你不知道这个随机模块,请查看这里 教程。

我们将确保我们的绘图保持在22乘22的x和y值,因此我们将在[1,20]的范围内分配随机(x,y)值,以获得一个清晰的绘图。这些值是根据上面提到的表格分配的。

import random
first,second,third,fourth = 0,0,0,0
plot_data = {}
for i in final_data:
    
    # 1st Quadrant
    if(final_data[i][0] == 'High' and final_data[i][1] > 10):
        first+=1
        x = random.randint(1,10)
        y = random.randint(12,20)
        while((x,y) in plot_data.values()):
            x = random.randint(1,10)
            y = random.randint(12,20)
        plot_data[i] = (x,y)

    #2nd Quadrant
    elif(final_data[i][0] == 'High' and final_data[i][1] < 10):
        second+=1
        x = random.randint(12,20)
        y = random.randint(12,20)
        while((x,y) in plot_data.values()):
            x = random.randint(12,20)
            y = random.randint(12,20)
        plot_data[i] = (x,y)
    
    # 3rd Quadrant
    elif((final_data[i][0] == 'Low' and final_data[i][1] > 10) or (final_data[i][0]=='Medium' and final_data[i][1]>10)):
        third+=1
        x = random.randint(1,10)
        y = random.randint(1,10)
        while((x,y) in plot_data.values()):
            x = random.randint(1,10)
            y = random.randint(1,10)
        plot_data[i] = (x,y)
    
    else:
        fourth+=1
        x = random.randint(12,20)
        y = random.randint(1,10)
        while((x,y) in plot_data.values()):
            x = random.randint(12,20)
            y = random.randint(1,10)
        plot_data[i] = (x,y)

print("Quadrant 1 - High Impact but Low Efforts -" , first)
print("Quadrant 2 - High Impact and High Efforts -", second)
print("Quadrant 3 - Low Impact and Low Efforts -", third)
print("Quadrant 4 - Low Impact and High Efforts -", fourth)

运行上述代码片段后,我们可以看到分配给每个象限的任务数,如下图所示:

Quadrant 1 - High Impact but Low Efforts - 1
Quadrant 2 - High Impact and High Efforts - 7
Quadrant 3 - Low Impact and Low Efforts - 4
Quadrant 4 - Low Impact and High Efforts - 12

第5步--可视化最终结果

为了使最终结果可视化,我们需要在不同的变量下有x和y坐标值,为了有注释,我们也需要标签。

为了避免在图中出现冗长的文字,得到清晰的图,我们将只绘制字符串的前12个字符:

all_x = [plot_data[i][0] for i in plot_data]
all_y = [plot_data[i][1] for i in plot_data]
all_labels = [i[:12] for i in plot_data]

可视化部分非常简单,可以用一个基本的散点图来完成,注释可以在以后添加。与此同时,我们将添加文本,以定义象限:

plt.style.use('seaborn')
plt.figure(figsize=(10,10))
plt.xlim((0,21))
plt.ylim((0,21))
plt.plot([11,11],[0,21], linewidth=2, color='red')
plt.plot([0,21],[11,11], linewidth=2, color='red' )
plt.scatter(all_x,all_y,marker='*')

plt.text(3,6, 'Low Impact \nLow Efforts', fontsize = 22,alpha = 0.1)
plt.text(3,15, 'High Impact \nLow Efforts', fontsize = 22,alpha = 0.1)
plt.text(15,15, 'High Impact \nHigh Efforts', fontsize = 22,alpha = 0.1)
plt.text(15,6, 'Low Impact \nHigh Efforts', fontsize = 22,alpha = 0.1)

plt.xticks([])
plt.yticks([])
for i in range(len(all_x)):
    plt.annotate(all_labels[i], (all_x[i], all_y[i] + 0.2))

plt.title('Impact - Effort Chart',fontsize=30)
plt.xlabel('Effort',fontsize=30)
plt.ylabel('Impact',fontsize=30)
#plt.axis('off')
plt.show()

Final Impact Effort Chart

最终图


结语

祝贺你!你刚刚了解了影响-努力图,以及如何使用Python编程语言从头开始手动实现。😇

谢谢您抽出时间!希望你能学到新的东西!!😄