我正在开发一个机器学习项目,以预测何时在工业采购流程中激活供应商。我有两个主要数据集:
doc3
:包含有关采购订单的日常信息。expedite2
:包含供应商激活时间的记录。我的目标是创建一个模型,可以在任何一天根据历史模式预测是否需要激活供应商。
这是我当前数据准备功能的简化版本:
import pandas as pd
def optimized_join_and_prepare_data(doc3, expedite2):
doc3['PROCESS_DATE'] = pd.to_datetime(doc3['PROCESS_DATE'])
expedite2['LOG_DATE'] = pd.to_datetime(expedite2['LOG_DATE'])
doc3['item_key'] = doc3['DOC_NUM'].astype(str) + '_' + doc3['DOC_ITEM'].astype(str) + '_' + doc3['SAP_CODE']
expedite2['item_key'] = expedite2['DOC_NUM'].astype(str) + '_' + expedite2['DOC_ITEM'].astype(str) + '_' + expedite2['SAP_WEB_CODE']
doc3 = doc3.sort_values('PROCESS_DATE')
expedite2 = expedite2.sort_values('LOG_DATE')
merged = pd.merge_asof(doc3, expedite2[['item_key', 'LOG_DATE', 'DATA01']],
left_on='PROCESS_DATE',
right_on='LOG_DATE',
by='item_key',
direction='nearest',
tolerance=pd.Timedelta('2d'))
merged['LOG_DATE'] = merged['LOG_DATE'].fillna(pd.NaT)
merged['DATA01'] = merged['DATA01'].fillna('NO_ACTIVATION')
merged = merged.dropna(subset=['PROCESS_DATE', 'item_key'])
return merged
final_data = optimized_join_and_prepare_data(doc3, expedite2)
我的主要担忧和问题是:
这种方法是否存在数据泄露的风险,尤其是使用
merge_asof
和2天的容忍度?
如果存在数据泄漏,我如何修改此函数以确保我只使用每个预测日的过去信息,同时保持计算效率?
在为预测模型准备这些数据时,我还应该牢记任何其他特定于时间序列的注意事项吗?
我正在处理大型数据集,因此效率是一个问题,但我想确保时间序列分析的完整性。任何改进的见解或建议将不胜感激!
我尝试了几种方法来准备时间序列数据:
最初,我对项目键和日期使用了简单的合并,但这导致了许多缺失值,并且没有捕获数据的时间性质。
然后,我实现了
merge_asof
函数,如代码所示。我预计这会在 2 天的窗口内将激活数据(来自 expedite2
)与最近的处理日期(来自 doc3
)对齐。这在效率方面效果很好,并且似乎捕获了最近的激活。
我还使用每个项目组中的
shift
功能添加了历史功能,例如之前的激活和自上次激活以来的天数。
我的期望:
doc3
中的每一行都富含最新的激活数据。实际发生了什么:
merge_asof
中的 2 天容差。shift
功能可能无法有效捕获长期模式。我正在寻找对我的方法的验证或改进建议,特别是在数据泄漏预防和更复杂的时间序列特征工程方面。
那就自己走吧
Id-0it 无法为 shi 编码,哈哈。我通过这个 ez a job chat gpt 为我做了一年超过六位数的收入