如何减少运行(for循环),Python

Posted

技术标签:

【中文标题】如何减少运行(for循环),Python【英文标题】:How to Reduce Running (for loop), Python 【发布时间】:2016-10-13 17:18:48 【问题描述】:
    以下代码运行时间过长(超过 5 分钟)

    有什么好的方法可以减少运行时间。

    data.head() # more than 10 year data, Total iteration is around 4,500,000
                    Open      High       Low     Close  Volume  Adj Close  \
    Date                                                                    
    2012-07-02  125500.0  126500.0  124000.0  125000.0  118500  104996.59   
    2012-07-03  126500.0  130000.0  125500.0  129500.0  239400  108776.47   
    2012-07-04  130000.0  132500.0  128500.0  131000.0  180800  110036.43   
    2012-07-05  129500.0  131000.0  127500.0  128500.0  118600  107936.50   
    2012-07-06  128500.0  129000.0  126000.0  127000.0  149000  106676.54  
    

    我的代码是

    import pandas as pd
    import numpy as np
    from pandas.io.data import DataReader
    import matplotlib.pylab as plt
    from datetime import datetime        
    
    def DataReading(code):
        start = datetime(2012,7,1)
        end = pd.to_datetime('today')
        data = DataReader(code,'yahoo',start=start,end=end) 
        data = data[data["Volume"] != 0]  
        return data
    
    data['Cut_Off'] = 0
    Cut_Pct = 0.85
    
    for i in range(len(data['Open'])):
        if i==0:
            pass
        for j in range(0,i):
            if data['Close'][j]/data['Close'][i-1]<=Cut_Pct:
               data['Cut_Off'][j] = 1 
               data['Cut_Off'][i] = 1 
            else
                pass
    

    以上代码需要 5 分钟以上。 当然,后面还有“elif”(我没有写上面的代码) 我刚刚测试了上面的代码。

有什么好的方法可以减少上述代码运行时间?

    补充

        buying list is
        Open      High       Low     Close  Volume  Adj Close  \
     Date                                                                    
     2012-07-02  125500.0  126500.0  124000.0  125000.0  118500  104996.59   
     2012-07-03  126500.0  130000.0  125500.0  129500.0  239400  108776.47   
     2012-07-04  130000.0  132500.0  128500.0  131000.0  180800  110036.43   
     2012-07-05  129500.0  131000.0  127500.0  128500.0  118600  107936.50   
     2012-07-06  128500.0  129000.0  126000.0  127000.0  149000  106676.54   
     2012-07-09  127000.0  133000.0  126500.0  131500.0  207500  110456.41   
     2012-07-10  131500.0  135000.0  130500.0  133000.0  240800  111716.37   
     2012-07-11  133500.0  136500.0  132500.0  136500.0  223800  114656.28   
     for exam, i bought 10 ea at 2012-07-02 with 125,500, and as times goes 
     daily, if the close price drop under 85% of buying price(125,500) then i         
     will sell out 10ea with 85% of buying price. 
     for reducing running time, i made buying list also(i didnt show in here)
     but it also take more than 2 min with using for loop.
    

【问题讨论】:

您可以为指定的样本 DF 发布所需的输出吗?否则很难猜出你想做什么...... 我想要的输出是 我想要的输出是。为考试。 1. 2 月 1 日购买股票,2ea。 1 美元。第二次购买 3 月 3 日 3ea 1.5 美元。然后从4月开始每天计算利润率,如果价格从买入价下跌0.85然后卖出。对于考试来说,从 1.5 美元和 4 月的 1 美元开始,没有低于 0.85 的价格。然后没有行动,但 1 日它会下跌 1.275,然后我将卖出 3ea 的 1.5 美元。但仍持有 2ea 的 1usd。有时它会下跌 0.85 美元,然后我会卖掉 2ea。 1美元。上面的代码是用来查找这只股票的。 你分析过你的代码吗? @Rogalski 我刚刚显示了价格和数量数据。但我的数据有购买栏。此列有 0 和 1。1 表示我购买了一些数量。 【参考方案1】:

不要遍历数据中的 4.5MM 行,而是使用 pandas 的内置索引功能。我在代码末尾重新编写了循环,如下所示:

data.loc[data.Close/data.Close.shift(1) <= Cut_Pct,'Cut_Off'] = 1

.loc 定位符合第一个参数中条件的行。 .shift 根据传递的参数向上或向下移动行。

【讨论】:

我想知道我是否使用 .loc 以及您的建议,那么它是否与迭代类似?我想计算我过去每天购买的利润率。您评论的代码似乎每天都不起作用。 @萌

以上是关于如何减少运行(for循环),Python的主要内容,如果未能解决你的问题,请参考以下文章

Python for循环遍历一列的所有行

如何将python for循环从顺序转换为并行运行

Python for 循环

如何减少运行(for循环),Python

如何使用范围将这个 python for 循环转换为 C++?

pythonfor循环