1

这三个函数为我提供了客户数量及其订单从状态 0 到接下来的 365 个状态(或天)的进展。在function state_evolution,我想绘制线的输出

custA = float(custA*1.09**(1.0/365))

反对线路的输出

A = sum(80 + random.random() * 50 for i in range(ordsA))

并做同样的事情,custB这样我就可以以图形方式比较它们的输出。

def get_state0():
    """ functions gets four columns from base data and finds their state 0"""
    statetype0 = {'custt':{'typeA':100,'typeB':200}}
    orderstype0 = {'orders':{'typeA':1095, 'typeB':4380}}
    return  {'custtypeA' : int(statetype0['custt']['typeA']),
             'custtypeB' : int(statetype0['custt']['typeB']),
             'ordstypeA': orderstype0['orders']['typeA'],'A':1095, 'B':4380,
             'ordstypeB':orderstype0['orders']['typeB'], 
             'day':0 }  


def state_evolution(state):
    """function takes state 0 and predicts state evolution """
    custA = state['custtypeA']
    custB = state['custtypeB']
    ordsA = state['ordstypeA']
    ordsB = state['ordstypeB']
    A = state['A']
    B = state['B']
    day = state['day']   
    # evolve day
    day += 1
    #evolve cust typea
    custA = float(custA*1.09**(1.0/365))
    #evolve cust typeb
    custB = float (custB*1.063**(1.0/365))
    # evolve orders cust type A 
    ordsA += int(custA * order_rateA(day))
    A = sum(80 + random.random() * 50 for i in range(ordsA))
    # evolve orders cust type B 
    ordsB += int(custB * order_rateB(day))
    B = sum(70 + random.random() * 40 for i in range(ordsB))
    return {'custtypeA':custA ,'ordstypeA':ordsA, 'A':A, 'B':B,
            'custtypeB':custB, 'ordstypeB':ordsB, 'day': day}


def show_all_states():
    """ function runs state evolution function to find other states"""
    s  = get_state0() 
    for day in range(365):
        s = state_evolution(s)

        print day, s
4

1 回答 1

0

您应该执行以下操作:

  1. 修改您的custA函数,使其返回一个包含 365 个项目的序列(列表、元组)。或者,custA在列表推导或 for 循环中使用以获取 365 个结果的序列;
  2. 对函数做同样的ordsA事情,得到另一个序列。

从现在开始,您可以根据自己的需要做不同的事情。

如果你想要两个平行的图(叠加),那么:

pyplot.plot(custA_result_list);
pyplot.plot(ordsA_result_list);
pyplot.show()

如果你想关联数据,你可以做一个散点图(更快),或者一个带有点标记的常规图(更慢但更可定制的 IMO):

pyplot.scatter(custA_result_list, ordsA_result_list)
# or
pyplot.plot(custA_result_list, ordsA_result_list, 'o')

## THIS WILL ONLY WORK IF BOTH SEQUENCES HAVE SAME LENGTH! (e.g. 365 elements each)

最后,如果数据是不规则采样的,您还可以提供水平轴值的序列。例如,这将允许仅绘制工作日的结果而不会“折叠”周末(否则周五和周一之间的间隔会看起来像一天):

weekdays = [1,2,3,4,5, 8,9,10,11,12, 15,16,17,18,19,  22, ...] # len(weekdays) ~ 260

pyplot.plot(weekdays, custA_result_list);
pyplot.plot(weekdays, ordsA_result_list);
pyplot.show()

希望这可以帮助!

编辑:关于 excel,如果我理解正确,你已经有一个 csv 文件。然后,您可以使用csvpython 模块,或者像这样自己阅读:

with open('file.csv') as csv_in:
    content = [line.strip().split(',') for line in csv_in]

现在,如果您有实际文件.xls.xlsx文件,xlrd请使用可以在此处pip install xlrd下载或在命令提示符下运行的模块。

于 2013-07-14T18:23:17.010 回答