【发布时间】:2019-12-16 01:50:55
【问题描述】:
我有一个包含 4 个属性的数据集:
- 名为“id”(整数)的 id 属性
一个名为“组”的属性(整数)
一个名为“aankomstdt”(日期时间)的准入时间
称为“ontslagdt”的放电时间(日期时间)
数据集看起来像这样:
id group aankomstdt ontslagdt
1 A Thu Nov 14 04:31:00 CET 2019 Thu Nov 14 09:43:00 CET 2019
2 A Thu Nov 14 05:38:00 CET 2019 Thu Nov 14 06:19:00 CET 2019
3 A Thu Nov 14 05:52:00 CET 2019 Thu Nov 14 09:14:00 CET 2019
4 A Thu Nov 14 05:54:00 CET 2019 Thu Nov 14 10:02:00 CET 2019
5 B Thu Nov 14 06:06:00 CET 2019 Thu Nov 14 11:22:00 CET 2019
我想计算同时被录取的例子的数量。因此,一个新属性应该为我提供每个患者(id)在他/她的入院时间范围内入院的患者数量。 我创建了以下工作代码:
import pandas as pd
import numpy as np
from datetime import datetime
admission_time = "aankomstdt"
discharge_time = "ontslagdt"
group = 'group'
date_format = '%Y-%m-%d %H:%M:%S'
path = 'D:/Lionel/Formations_DataScience/Rapidminer/Tests_Rapidminer/count_overlaps_sven.xlsx'
def convert_to_datetime(a) :
a = datetime.strptime(str(a), date_format)
return a
def interval_overlaps(a, b):
return min(a[discharge_time], b[discharge_time]) - max(a[admission_time], b[admission_time]) > np.timedelta64(-1)
def count_overlaps(df1):
return pd.Series([df1.apply(lambda x: interval_overlaps(x, df1.iloc[i]), axis=1).sum() - 1 for i in range(len(df1))], df1.index)
#return pd.Series([df1.apply(lambda x: interval_overlaps(x, df1.iloc[i]), axis=1).sum() - 1 for i in range(len(df1))])
def rm_main():
data = pd.read_excel(path)
data[admission_time] = data[admission_time].apply(convert_to_datetime)
data[discharge_time] = data[discharge_time].apply(convert_to_datetime)
data["count"] = data.groupby(group).apply(count_overlaps).values
return data
但我的原始数据集有大约 70 000 个示例,因此我估计计算时间约为 1 个月(24 小时/24 小时)。 我的问题是:Python 中是否有解决方案可以显着加速该算法?
谢谢你,
【问题讨论】:
-
查找具有重叠时间的项目的最快方法可能是首先按开始时间对它们进行排序(也许它们已经是?),然后仅与紧随其后的项目进行比较(首先停止不重叠)。我希望这可以在几秒钟内完成。
-
@zvone,感谢您的评论。你有在 Python 中实现你的想法吗?
标签: python python-3.x algorithm overlap