掙值分析

风·华正茂發表於2024-04-08

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Cursor
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 指定預設字型:解決plot不能顯示中文問題
mpl.rcParams['axes.unicode_minus'] = False # 解決儲存影像是負號'-'顯示為方塊的問題


# 資料
# 總時間:10 周
sac = 10
bac = np.array([[30], [70], [40], [30]])
# 每期預算分配(共10期)
bac_list = np.array([
    [10, 15, 5, 0, 0, 0, 0, 0, 0, 0],
    [0, 10, 10, 10, 20, 10, 10, 0, 0, 0],
    [0, 0, 0, 0, 5, 5, 25, 5, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 5, 5, 20]
])
# 每期實際成本(前6期)
ac_list = np.array([
    [10, 16, 8, 0, 0, 0],
    [0, 10, 10, 12, 24, 12],
    [0, 0, 0, 0, 5, 5],
    [0, 0, 0, 0, 0, 0]
])
# 每期完成任務百分率(前6期)
radio = np.array([
    [30, 80, 100, 0, 0, 0],
    [0, 10, 25, 35, 55, 65],
    [0, 0, 0, 0, 10, 20],
    [0, 0, 0, 0, 0, 0]
])


# 求PV函式
def get_PV(bac, num):
    # 取出每行前num列資料,對行對列進行相加得到PV
    pv = np.sum(np.sum(bac[:, :num], axis=1), axis=0)
    return pv


# 求EV函式
def get_EV(bac, radio, num):
    # 每項任務的ev =  每項任務的bac * ra每一行的第num列值
    ra = radio[:, num - 1:num]
    ev = np.sum(np.sum(bac * (0.01 * ra), axis=1), axis=0)
    return ev


# 求AC函式
def get_AC(ac, num):
    # 每項任務的ac = 每項任務的前num列之和,axis=1是每一行的和
    ac = np.sum(np.sum(ac[:, :num], axis=1), axis=0)
    return ac


# 求sv函式
def get_SV(ev, pv):
    return ev - pv


# 求SPI函式
def get_SPI(ev, pv):
    return ev / pv


# 求cv函式
def get_CV(ev, ac):
    return ev - ac


# 求CPI
def get_CPI(ev, ac):
    return ev / ac


# 求 TEAC
def get_TEAC(sac, spi):
    return sac / spi


# 求 EAC
def get_EAC(bac, cpi):
    bac_all = np.sum(np.sum(bac, axis=1), axis=0)
    return bac_all / cpi


# 問題:求1-3期的掙值分析
# 第一期
pv1 = get_PV(bac_list, 1)
ev1 = get_EV(bac, radio, 1)
ac1 = get_AC(ac_list, 1)
sv1 = get_SV(ev1, pv1)
cv1 = get_CV(ev1, ac1)
spi1 = get_SPI(ev1, pv1)
cpi1 = get_CPI(ev1, ac1)
teac1 = get_TEAC(sac, spi1)
eac1 = get_EAC(bac, cpi1)
print("第1期的掙值分析: \n"
      "PV=%.2f(元), EV=%.2f(元), AC=%.2f(元)\n"
      "SV=%.2f(元),CV=%.2f(元)\n"
      "SPI=%.2f,CPI=%.2f\n"
      "TEAC=%.2f(天),EAC=%.2f(元)" % (pv1, ev1, ac1, sv1, cv1, spi1, cpi1, teac1, eac1))

# 第2期
pv2 = get_PV(bac_list, 2)
ev2 = get_EV(bac, radio, 2)
ac2 = get_AC(ac_list, 2)
sv2 = get_SV(ev2, pv2)
cv2 = get_CV(ev2, ac2)
spi2 = get_SPI(ev2, pv2)
cpi2 = get_CPI(ev2, ac2)
teac2 = get_TEAC(sac, spi2)
eac2 = get_EAC(bac, cpi2)

print("第2期的掙值分析: \n"
      "PV=%.2f(元), EV=%.2f(元), AC=%.2f(元)\n"
      "SV=%.2f(元),CV=%.2f(元)\n"
      "SPI=%.2f,CPI=%.2f\n"
      "TEAC=%.2f(天),EAC=%.2f(元)" % (pv2, ev2, ac2, sv2, cv2, spi2, cpi2, teac2, eac2))

# 第三期
pv3 = get_PV(bac_list, 3)
ev3 = get_EV(bac, radio, 3)
ac3 = get_AC(ac_list, 3)
sv3 = get_SV(ev3, pv3)
cv3 = get_CV(ev3, ac3)
spi3 = get_SPI(ev3, pv3)
cpi3 = get_CPI(ev3, ac3)
teac3 = get_TEAC(sac, spi3)
eac3 = get_EAC(bac, cpi3)

print("第3期的掙值分析: \n"
      "PV=%.2f(元), EV=%.2f(元), AC=%.2f(元)\n"
      "SV=%.2f(元),CV=%.2f(元)\n"
      "SPI=%.2f,CPI=%.2f\n"
      "TEAC=%.2f(天),EAC=%.2f(元)" % (pv3, ev3, ac3, sv3, cv3, spi3, cpi3, teac3, eac3))

# 繪製1-3期折線圖
x_data = [1, 2, 3]
y_pv = [pv1, pv2, pv3]
y_ev = [ev1, ev2, ev3]
y_ac = [ac1, ac2, ac3]
plt.plot(x_data, y_pv, 'go-', alpha=0.5, linewidth=1, label='PV')
plt.plot(x_data, y_ev, 'rs-', alpha=0.5, linewidth=1, label='EV')
plt.plot(x_data, y_ac, 'b*-', alpha=0.5, linewidth=1, label='AC')
plt.legend()
plt.title("1-3期掙值分析")
plt.xlabel("時間(周)")
plt.ylabel("錢(元)")
plt.show()

相關文章