如何使该python程序运行更快?

时间:2019-03-08 11:24:13

标签: python pandas

我是python和pandas的新手,我设法完成了自己想要的事情,但是在python上运行大约需要10分钟,在Jupyter上需要大约1分钟。有很多循环,并且可能有一种更聪明的方式来做到这一点。 我该怎么做才能使其更快?欢迎任何建议。提前致谢! 我读的其他表很小,大约2列10行。

import pandas as pd
import os
os.chdir("C:/Users/user/Desktop")

df = pd.read_excel('arquivo.xlsx')

dias_de_embarque = [None]*df.shape[0]
for i in range (0,df.shape[0]):
    if (df['Centro custo emissor'][i] == 2002040041) & (df['Tp.ausência/presença'][i] == 602):                    
        dias_de_embarque[i] = round((1/12)*df['Horas'][i],4)
    else:
        dias_de_embarque[i] = 0

folga_adquirida = [None]*df.shape[0]
for i in range (0,df.shape[0]):
    folga_adquirida[i] = round((5/7) * dias_de_embarque[i],4)

dias_de_folga = [None]*df.shape[0]
for i in range (0,df.shape[0]):
    if df['Centro custo emissor'][i] == 2002040041 and df['Tp.ausência/presença'][i] == 323:
        dias_de_folga[i] = round(df['Horas'][i]/8,4)
    elif  df['Centro custo emissor'][i] == 2002040041 and df['Tp.ausência/presença'][i] == 608:
        dias_de_folga[i] = round(df['Horas'][i]*(5/56),4)
    else:
        dias_de_folga[i] = 0

saldo = [None]*df.shape[0]
for i in range (0,df.shape[0]):
    saldo[i] = folga_adquirida[i] - dias_de_folga[i]

treinamento = [None]*df.shape[0]
for i in range (0,df.shape[0]):
    if df['Centro custo emissor'][i] == 2002040041 and df['Tp.ausência/presença'][i] == 606:
        treinamento[i] = round(df['Horas'][i]/8,4)
    else:
        treinamento[i] = 0

not_alocacao_codigos = pd.read_excel('Apoio e Budget.xlsx', 'not_alocacao_codigos')
atividades = [None]*df.shape[0]

for i in range (0, df.shape[0]):
    if df['Operação'][i] in set(not_alocacao_codigos['Operação']):
        atividades[i] = not_alocacao_codigos['Atividades Engenharia'][ not_alocacao_codigos[not_alocacao_codigos['Operação'] == df.Operação[i] ].index [0] ]
    else:
        atividades[i] = "-"

not_tabela_e150 = pd.read_excel('Apoio e Budget.xlsx', 'not_tabela_e150')
not_tabela_e130 = pd.read_excel('Apoio e Budget.xlsx', 'not_tabela_e130')

tabela_sub_atividade = pd.read_excel('Apoio e Budget.xlsx', 'tabela sub-atividade')
sub_atividades = [None]*df.shape[0]

for i in range (0, df.shape[0]):
    if df['Operação'][i] == "E120":
        sub_atividades[i] = not_tabela_e150['Categoria Macro'][ not_tabela_e150[not_tabela_e150['Código'] == df['Nome do empregado ou candidato'][i] ].index [0] ]
    elif (df['Operação'][i] == "E130") & (str(df['ALT Code1'][i])[0:3] == "ET-"):
        sub_atividades[i] = not_tabela_e130['Categoria Macro'][not_tabela_e130[not_tabela_e130['Código'] == str(df['ALT Code1'][i])[0:7]].index[0]]
    elif (df['Operação'][i] == "E130") & (str(df['ALT Code1'][i])[0:3] != "ET-") & (str(df['ALT Code1'][i])[0:3] in set(not_tabela_e130['Código'])):
        sub_atividades[i] = not_tabela_e130['Categoria Macro'][not_tabela_e130[not_tabela_e130['Código'] == str(df['ALT Code1'][i])[0:3]].index[0]]
    elif df['Operação'][i] in set(tabela_sub_atividade['Código']):
        sub_atividades[i] = tabela_sub_atividade['Sub-Atividade'] [tabela_sub_atividade['Sub-Atividade'] [tabela_sub_atividade['Código'] == df['Operação'][i]].index[0]]
    else:    
        sub_atividades[i] = "-"

not_dias =    pd.read_excel('Apoio e Budget.xlsx', 'not_dias')
data_aux = [None]*df.shape[0]
for i in range (0,df.shape[0]):
    data_aux[i] = str(pd.DatetimeIndex(df['Data']).month[i]) + " " + str(pd.DatetimeIndex(df['Data']).year[i])

alocacao = [None]*df.shape[0]
for i in range (0,df.shape[0]):
    if df['Tp.ausência/presença'][i] == 602:
        alocacao[i] = df['Horas'][i] / (12 * not_dias['Dias Totais'][not_dias[not_dias['Mês'] == data_aux[i]].index [0] ])
    elif df['Tp.ausência/presença'][i] == 632:
        alocacao[i] = 0
    else:
        alocacao[i] = df['Horas'][i] / (8 * not_dias['Dias Úteis'][not_dias[not_dias['Mês'] == data_aux[i]].index [0] ])

df['Dias de Embarque'] = dias_de_embarque
df['Folga Adquirida'] = folga_adquirida
df['Dias de Folga'] = dias_de_folga
df['Saldo'] = saldo
df['Treinamento'] = treinamento
df['Atividades (Alocação)'] = atividades
df['Sub-Atividades (Alocação)'] = sub_atividades
df['Alocação HH (Alocação)'] = alocacao  

df.to_excel("Dashboard Folgas e Treinamento.xlsx")

1 个答案:

答案 0 :(得分:0)

仅不要在所有行中使用循环

dias_de_embarque = [None]*df.shape[0]
for i in range (0,df.shape[0]):
     if (df['Centro custo emissor'][i] == 2002040041) & (df['Tp.ausência/presença'][i] == 602):                    
        dias_de_embarque[i] = round((1/12)*df['Horas'][i],4)
    else:
        dias_de_embarque[i] = 0

在numpy和pandas中,您应该使用以下数组操作:

df['Dias de Embarque'] = 0  # Init new column with 0-vector

编辑:

df.loc[df['Centro custo emissor'] == 2002040041) & (df['Tp.ausência/presença'] == 602), 'Dias de Embarque'] = round((1/12)*df['Horas'],4)  # At every position, where condition is True, set new value