我有一个大型数据集(大约25万行),其中包含属性ID号码和调查响应日期时间。我正在尝试构建一种基本的欺诈检测方法,其中考虑的因素之一是每个属性/商店的不同调查之间的响应时间。如果某个位置的任何调查之间的时间间隔少于10分钟,我希望在名为“close_response”的列下将其标记为TRUE。
我在一个函数中嵌套了for循环,该函数应用于每个组,实现了我想要的效果,但在应用于非常大的数据集时,计算成本高且耗时。
我在一个函数中嵌套了for循环,该函数应用于每个组,实现了我想要的效果,但在应用于非常大的数据集时,计算成本高且耗时。
import pandas as pd
from datetime import timedelta
# Sample DataFrame
data = {'property_id': [1, 1, 1, 2, 2, 3, 3],
'response_datetime': ['2023-10-19 08:00:00', '2023-10-19 08:05:00', '2023-10-19 08:25:00', '2023-10-19 09:00:00', '2023-10-19 09:15:00', '2023-10-19 10:00:00', '2023-10-19 11:00:00']}
df = pd.DataFrame(data)
df['response_datetime'] = pd.to_datetime(df['response_datetime'])
def mark_close_responses(group):
group['close_response'] = False
for i in range(len(group)):
for j in range(i+1, len(group)):
time_diff = group.iloc[j]['response_datetime'] - group.iloc[i]['response_datetime']
if time_diff <= timedelta(minutes=10):
group.at[i, 'close_response'] = True
group.at[j, 'close_response'] = True
return group
df = df.groupby('property_id').apply(mark_close_responses)