【发布时间】:2021-08-27 09:36:24
【问题描述】:
我有需要优化的脚本。示例数据在此处添加data。
我尝试了几件事,将 groupby 更改为使用排序值。我已经尝试过更快速地快速申请,但它需要更多时间。
df_loop = pd.read_excel("data.xlsx")
df_loop.index = df_loop["Destination"]
uni_list = df_loop["Destination"].unique()
def get_custcon(x):
dfa = df_loop[(df_loop.index.isin(x))]
dfa.sort_values\
(by = ["Source","Time"],ascending=True).drop_duplicates('Source'\
,keep='first',inplace = True)
return [x,dfa["con"].sum()/dfa["Options"].sum()]
def get_optimisation(site):
list_site = []
for si in range(site):
s = "step_" + str(si)
list_site.append(s)
list_site = ["random_combination"] + list_site + ["Cust"]
test_data = pd.DataFrame(columns = list_site)
Iteration = 1 #how many iteration do you want to run
for it in range(Iteration):
test_list = []
random_com = tuple(random.sample(set(df_loop["Source"]\
.unique()),site)) ### random combination
test_list.append(random_com)
for i in range(site):
li = list(range(site))
li.remove(i)
col_dict = {}
for k in li:
j = "site_" + str(k)
if j not in col_dict:
col_dict[j] = [random_com[k]]* 5
df_com = pd.DataFrame(col_dict)
df_com["site_"+str(i)] = uni_list
df_com["res"] = df_com.apply(lambda x : get_custcon(list(x)),axis = 1)
df_com[['combination', 'cust_C']] = df_com['res'].apply(pd.Series)
solution = df_com.loc[df_com["cust_C"].idxmin()][["res"]][0]
random_com = tuple(solution[0])
test_list.append(tuple(solution[0]))
test_list.append(solution[1])
test_data.loc[it] = test_list
return(test_data.loc[test_data["Cust"].idxmin()][test_data.columns[-2]])
start = time.time()
print(list(get_optimisation(2))) # write site number here
end = time.time()
print("time",end - start)
此代码通常需要 0.038 秒。现在我分享的数据只是样本。我有 250 万行的数据,这需要 75 秒,但我不能为这个过程腾出这么多时间。
我尝试过的代码但没有运气:
def get_custcon(x):
dfa = df_loop[(df_loop.index.isin(x))]
dfa.sort_values('Time').groupby('Source').first()
return [x,dfa["con"].sum()/dfa["Options"].sum()]
df_com["res"] = df_com.swifter.apply(lambda x : get_custcon(list(x)),axis = 1)
提前致谢。
【问题讨论】:
-
您有没有机会运行分析器来查找热点?
-
您的代码调用
get_optimised_sites(),但该方法不在您的帖子中。它是get_optimisation()的别名/错字吗? -
是的,这是一个打字错误。谢谢指出
-
最耗时的函数是get_custcon()。但我必须称它为 site * len(uni_list) Times
标签: python-3.x pandas dataframe optimization pandas-groupby