首页 > 解决方案 > 如何在我迭代数据帧中的行时加快这个循环

问题描述

TimePeriods2 = [1440] # other elements will be populated to this list later
MovingAverages = [50] # other elements will be populated to this list later

for Time in TimePeriods2:
    k = 1
    for MA in MovingAverages:
        for i in range(len(df)):
            if (df["Close"][i] > df[f"{MA*Time} MA"][i]) & (df["Close"][i+Time] > df[f"{MA*Time} MA"][i+Time]):
                df[f"Moving Average (not crossover) Strategy {k} on {Time} Mins"][i] = "Buy"
        df[f"Moving Average (not crossover) Strategy {k} on {Time} Mins"] = df[f"Moving Average (not crossover) Strategy {k} on {Time} Mins"].fillna("Sell")
        df[f"Moving Average (not crossover) Strategy {k} on {Time} Mins"] = df[f"Moving Average (not crossover) Strategy {k} on {Time} Mins"].astype("category")
        k += 1
    print(f"Time period {Time} complete")

我尝试了以下方法:

TimePeriods2 = [1440] # other elements will be populated to this list later
MovingAverages = [50] # other elements will be populated to this list later

for Time in TimePeriods2:
    k = 1
    for MA in MovingAverages:
        df.loc[( (df["Close"] > df[f"{MA*Time} MA"]) & (df["Close"][i+Time] > df[f"{MA*Time} MA"][i+Time]) ), f"Moving Average (not crossover) Strategy {k} on {Time} Mins"] = "Buy"
        df[f"Moving Average (not crossover) Strategy {k} on {Time} Mins"] = df[f"Moving Average (not crossover) Strategy {k} on {Time} Mins"].fillna("Sell")
        df[f"Moving Average (not crossover) Strategy {k} on {Time} Mins"] = df[f"Moving Average (not crossover) Strategy {k} on {Time} Mins"].astype("category")
        k += 1
    print(f"Time period {Time} complete")

但似乎你不能像这样使用 .loc 方法,我的数据框有大约 140 万行,所以不用说第一种方法需要永远,而第二种方法要快得多,除了我无法得到它好好工作。

标签: pythonpandasloops

解决方案


推荐阅读