1

これら 3 つの関数は、状態 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ことを行い、他のシーケンスを取得します。

これからは、自分のやりたいことに応じて、さまざまなことを行うことができます。

2 つのプロットを並行して (重ねて) 表示する場合は、次のようにします。

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)

最後に、データが不規則にサンプリングされた場合は、横軸の値にシーケンスを指定することもできます。これにより、たとえば、週末を「折りたたむ」ことなく、平日の結果のみをプロットできます (そうしないと、金曜日と月曜日の間のギャップが 1 日として表示されます)。

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()

お役に立てれば!

編集:エクセルについて、私が正しく理解しているなら、あなたはすでに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 に答える