2013-04-05 39 views
1

我正在嘗試用Python編寫一個小程序,記錄一年以上的股票投資組合,所以基本上要記錄每筆買/賣,並跟蹤餘額。我正在瀏覽一系列訂單並更新Pandas數據框,在那裏我保留投資組合。該代碼看起來很不起眼,但我很新的大熊貓/ numpy的:python pandas set_value不持久?

orders_book = DataFrame(np.zeros((num_of_days,num_of_companies+1)), ldt_timestamps, columns = book_keys) 

for equity_sym in ls_symbols[1:2]: 
    for trade_date in ldt_timestamps: 
     if trade_date == ldt_timestamps[0]: 
      current_number = orders_book.xs(trade_date)[equity_sym] 
     for transaction in trades: 
      transaction_date = transaction[0] 
      transaction_sym = transaction[1] 
      if ((trade_date == transaction_date) and (equity_sym == transaction_sym)): 
       transaction_order = transaction[2] 
       transaction_number = transaction[3] 
       if str(transaction_order) == 'Buy': 
        current_number += transaction_number 
       if str(transaction_order) == 'Sell': 
        current_number -= transaction_number 
     orders_book.ix[trade_date,equity_sym, current_number] = current_number 

[equity_sym] 我不停的意見說服你,我通過在運行打印我檢查了這個複雜的循環工作確定(如您所見,我使用set_value更新orders_book)。然而,當循環結束時,我試試print orders_book['GOOG'],然後orders_book看起來就像在開始時,即在循環之前。這是爲什麼?希望你的幫助:)

編輯: 代碼現在改變,並正常工作。這不是Panda的錯,而是代碼中更新/寫入功能的錯誤放置。感謝您的努力!

+0

'set_value'的語義似乎很模糊,它可能會創建一個新的DataFrame。 – Eike 2013-04-05 19:19:54

+1

嘗試做類似'orders_book.ix [trade_date,equity_sym] = current_number'而不是 – 2013-04-05 19:20:39

+0

@ChangShe:不幸沒有幫助 – 2013-04-05 19:28:47

回答

0

根據Pandas的作者this answerset_value返回對新對象的引用。您需要使用concatappend將行添加到數據表。請參閱Pandas手冊中的"Merge, join, and concatenate"

+0

但是如果我寧願修改而不是添加? – 2013-04-05 19:30:00