Можно ли ускорить цикл for для python в датафрейме? - PullRequest
0 голосов
/ 02 января 2019

Могу ли я ускорить время выполнения кода ниже?

этот код для моего денежного плана

Я должен продолжать использовать свой денежный журнал

, потому что мне нужно получить трассировкуиспользования денег

def seperate_accumulate_m(m_df):

    """
    make accumulate money paper according to option number
    """

    m_df = m_df.reset_index(drop=True)

    m_df.loc[0, "etc_m"] = 0
    m_df.loc[0, "sell_m"] = 0
    m_df.loc[0, "buy_m"] = 0
    m_df.loc[0, "use_m"] = 0
    m_df.loc[0, "gone_m"] = 0


    if m_df.loc[0, "option"] == 3:
        m_df.loc[0, "etc_m"] = m_df.loc[0, "m"]
    elif m_df.loc[0, "option"] == 2:
       m_df.loc[0, "sell_m"] = m_df.loc[0, "m"]
    elif m_df.loc[0, "option"] == 1:
        m_df.loc[0, "buy_m"] = m_df.loc[0, "m"]
    else:
        pass


    for idx in range(1, len(m_df)):
        if m_df.loc[idx, "option"] == 3:
            m_df.loc[idx, "etc_m"] = m_df.loc[idx-1, "etc_m"] + m_df.loc[idx, "m"]
            m_df.loc[idx, "sell_m"] = m_df.loc[idx-1, "sell_m"] + 0
            m_df.loc[idx, "buy_m"] = m_df.loc[idx-1, "buy_m"] + 0
            m_df.loc[idx, "use_m"] = m_df.loc[idx-1, "use_m"] + 0
            m_df.loc[idx, "gone_m"] = m_df.loc[idx-1, "gone_m"] + 0
        elif m_df.loc[idx, "option"] == 2:
            m_df.loc[idx, "etc_m"] = m_df.loc[idx-1, "etc_m"] + 0
            m_df.loc[idx, "sell_m"] = m_df.loc[idx-1, "sell_m"] + m_df.loc[idx, "m"]
            m_df.loc[idx, "buy_m"] = m_df.loc[idx-1, "buy_m"] + 0
            m_df.loc[idx, "use_m"] = m_df.loc[idx-1, "use_m"] + 0
            m_df.loc[idx, "gone_m"] = m_df.loc[idx-1, "gone_m"] + 0
        elif m_df.loc[idx, "option"] == 1:
            m_df.loc[idx, "etc_m"] = m_df.loc[idx-1, "etc_m"] + 0
            m_df.loc[idx, "sell_m"] = m_df.loc[idx-1, "sell_m"] + 0
            m_df.loc[idx, "buy_m"] = m_df.loc[idx-1, "buy_m"] + m_df.loc[idx, "m"]
            m_df.loc[idx, "use_m"] = m_df.loc[idx-1, "use_m"] + 0
            m_df.loc[idx, "gone_m"] = m_df.loc[idx-1, "gone_m"] + 0
        else:
            continue

    return m_df

размер данных составляет 3 500 000 строк

, а размер m_no равен 90000 строк

def get_total_accumulate_m_df(data):

    """
    make total dataframe base on seperate_accumulate_m
    """

    tmp_df = pd.DataFrame()

    for mno in tqdm(data["m_no"].unique()):

        mno_df = data[data["m_no"] == mno]
        mno_df = mno_df.sort_values(by='regdt')
        mno_df = mno_df.reset_index(drop=True)


        df = seperate_accumulate_m(mno_df)
        tmp_df = pd.concat([tmp_df, df])

    return tmp_df

Эта строка тратит время около 2 часов, я хочу сократить время!Пожалуйста, помогите мне.

df = get_total_accumulate_emoney_df(data)

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...