【发布时间】:2018-01-14 04:18:51
【问题描述】:
我有项目历史及其相关的计划开始和结束时间:
id planned_start planned_end
1 2017-09-12 2017-09-13
2 2017-09-12 2017-09-14
3 2017-09-12 2017-09-13
4 2017-09-13 2017-09-13
5 2017-09-12 2017-09-12
6 2017-09-12 2017-09-20
7 2017-09-14 2017-09-15
8 2017-09-14 2017-09-20
我想计算上述项目的每个开始日期的并发项目数。这是我的逻辑:
for project_id in df['id']:
start_date = df[df['id'] == project_id]['planned_start'].values[0]
concurrent_projects = df[(df['planned_start'] <= start_date) & (df['planned_end'] >= start_date)]
df.ix[df['id'] == project_id, 'concurrent_projects'] = concurrent_projects.shape[0]
产生这个:
id planned_start planned_end concurrent_projects
0 1 2017-09-12 2017-09-13 5.0
1 2 2017-09-12 2017-09-14 5.0
2 3 2017-09-12 2017-09-13 5.0
3 4 2017-09-13 2017-09-13 5.0
4 5 2017-09-12 2017-09-12 5.0
5 6 2017-09-12 2017-09-20 5.0
6 7 2017-09-14 2017-09-15 4.0
7 8 2017-09-14 2017-09-20 4.0
但是,我知道上面的for 循环在时间上是多么不理想。实际上,我有超过 500,000 个项目需要计算。有人可以就如何加快速度提供一些建议吗?我知道必须有一个纯熊猫甚至 numpy 的解决方案来杀死我上面的内容。
【问题讨论】:
-
如果
A在B之后但在B结束之前开始,您当前的逻辑不会考虑一个项目(A) 与另一个项目(B) 并发。当您说“我想要......每个开始日期的并发项目”时,您的意思是您只想知道在新项目开始时已经开始但尚未完成的项目数量? -
是的,只有在给定项目 A 开始时已经开始并且可能已经完成也可能尚未完成的项目。基本上,我想知道项目团队在开始一个新项目时已经完成了多少工作。
-
“已经开始,可能已经完成,也可能没有完成”:为了并发,为什么要计算一个可能已经完成的项目?
-
如果你只想要已经开始的项目,那么你想要
df['planned_start'] < start_date而不是<=吗? -
漫长的一天……是的,应该是“以前开始但尚未完成的项目”。
<=过滤器很好......我会将同时开始的项目算作“之前”的一部分。
标签: python pandas numpy optimization