2017-02-28 59 views
0

下面是我當前的代碼:如何提高我的python代碼來加速?

import pandas as pd 
import math 
import csv 

fund = 10000 
print("investment",fund) 

pval = 0 
oldportfolio = [] 

dts = ["06 Feb 2017", "07 Feb 2017", "08 Feb 2017", "09 Feb 2017", "10 Feb 2017", "13 Feb 2017", "14 Feb 2017", "15 Feb 2017", "16 Feb 2017", "17 Feb 2017", 
     "20 Feb 2017", "21 Feb 2017", "22 Feb 2017", "23 Feb 2017", "27 Feb 2017"] 
for dt in dts: 
    files = ["stocklistcustom.csv"] 
    for file in files: 
     df = pd.read_csv(file, header=None) 
     i = 0 
     filecount = len(df) 
     result = [] 
     while i < filecount: 
     # while i < 10: 
      name = df[0][i] 
      link = df[1][i] 
      mcsym = df[2][i] 
      i = i + 1 
      filepath = "data/nse/his/" + mcsym + ".csv" 
      try: 
       sp = pd.read_csv(filepath, header=None) 
       endrow = sp[sp[0] == dt].index[0] + 1 
       parray = [] 
       tarray = [] 
       starray = [] 
       intdate = [] 
       p1 = 0 
       p2 = 0 
       p3 = 0 
       p4 = 0 
       j = 0 
       mavg15 = '' 
       mavg60 = '' 
       olddiff = 0 
       days = 2 
       strtrow = endrow - days - 60 
       for k in range (strtrow, endrow): 
        date = sp[0][k] 
        price = float(sp[4][k]) 
        k = k + 1 
        parray.append(price) 
        j = j + 1 
        strtavg = j - 15 
        mavg15 = sum(parray[strtavg:j])/15 
        strtavg = j - 60 
        mavg60 = sum(parray[strtavg:j])/60 
        # buy criteria 
        if j > 59: 
         diff = mavg60 - mavg15 
         if diff < 0 and olddiff > 0: 
          trigger = 1 
          intdate.append(date) 
         else: 
          trigger = 0 
         tarray.append(trigger) 
         olddiff = diff 
        # sell criteria 
        if j == (days + 60): 
         pricep = (price - p1) * 100/p1 
         p1p = (p1 - p2) * 100/p2 
         p2p = (p2 - p3) * 100/p3 
         p3p = (p3 - p4) * 100/p4 
         if pricep < -5 or pricep > 8: 
          sell = 1 
         if price < p1 and p1 < p2 and p2 < p3: 
          sell = 1 
         else: 
          sell = 0 
        p4 = p3 
        p3 = p2 
        p2 = p1 
        p1 = price 
       if sum(tarray) > 0: 
        result.append([name,mcsym,"buy",price]) 
       if sell > 0: 
        result.append([name,mcsym,"sell",price]) 
      except: 
       # print(name,"not found") 
       pass 

    # print(result) 

    output = "output/triggers/"+dt+"trigger.csv" 
    with open(output, "wb") as f: 
     writer = csv.writer(f) 
     writer.writerows(result) 
     print(output,"exported") 

上面的代碼創建一個名爲結果,並與出口不同的呼叫CSV文件中的數組...

下面的代碼現在在處理結果數組中的數據計算產品組合值

# Code for calculating investment 
    portfolio = [] 
    for row in result: 
     if row[2] == "sell" and len(oldportfolio) > 0: 
      pindex = 0 
      for buys in oldportfolio: 
       bindex = 0 
       for stock in buys: 
        if row[0] == stock[0]: 
         sellqty = stock[2] 
         sellp = row[3] 
         sellval = sellqty * sellp 
         purchasep = stock[1] 
         sellcost = purchasep * sellqty 
         print(dt,"selling",row[0],row[1],sellp,sellqty,sellval) 
         # print(oldportfolio) 
         del oldportfolio[pindex][bindex] 
         # print(oldportfolio) 
         fund = fund + sellval 
         pval = pval - sellcost 
        bindex = bindex + 1 
       pindex = pindex + 1 
    # print("op", oldportfolio) 
    # print(dt,"fund after selling",fund) 
    buycount = sum(1 for row in result if row[2]==("buy")) 
    if buycount > 0: 
     maxinvest = fund/buycount 
    for row in result: 
     if row[2] == "buy": 
      name = row[0] 
      price = row[3] 
      qty = math.floor(maxinvest/price) 
      if qty > 0: 
       val = qty * price 
       print(dt,"buying",name,row[1],price,qty,val) 
       portfolio.append([name,price,qty,val]) 
       fund = fund - val 

    # print("portfolio",portfolio) 
    pval = pval + sum(row[3] for row in portfolio) 
    print(dt,"cash",fund,"portfolio value",pval,"total",fund+pval) 
    oldportfolio.append(portfolio) 

print(oldportfolio) 

它給了我基於某些規則交易後每一天的投資​​組合價值。但它的執行時間太多了。如何減少執行時間?

另外,我需要改變pval,因爲它在當前代碼中計算不正確。它必須根據當天的價格計算。

+1

http://codereview.stackexchange.com –

+0

按照建議將此問題移至codereview。 –

回答

-1

你的代碼有多個嵌套循環,這可能是爲什麼它如此緩慢。

但是你最大的問題不是速度,而是可讀性。關於你的代碼很難推理,請考慮重構。

我相信你會發現一些瓶頸,並能夠在重構時改進你的代碼。

+0

什麼是重構? –

+0

基本上重構代碼以使其更具可讀性。 (在這裏閱讀更多:https://en.wikipedia.org/wiki/Code_refactoring) 嘗試將您的代碼分成更小的函數。 – Dunderklaepp

+0

維基百科在這裏沒有多大幫助。它沒有適當地描述這個話題,而是用百科全書的方式來談論它。我試圖將有問題的代碼分成兩部分。這是你在說什麼嗎? –