python - 有没有办法有效地将函数应用于 Pandas 列中的 300 万个值?
问题描述
我目前正在研究如何赢得数据科学竞赛的数据科学课程。最后一个项目是我们必须参加的 Kaggle 比赛。
我的训练数据集有近 300 万行,其中一列是“购买日期”列。
我想计算每个日期到最近的公共假期的距离。
例如,如果日期是 2014 年 12 月 31 日,则最接近的 PH 将是 2015 年 1 月 1 日。相隔的天数为“1”。
我想不出一种有效的方法来执行此操作。我有一个包含多个时间戳的列表,每个时间戳都是俄罗斯的公共假期(数据集来自俄罗斯)。
def dateDifference (target_date_raw):
abs_deltas_from_target_date = np.subtract(russian_public_holidays, target_date_raw)
abs_deltas_from_target_date = [i.days for i in abs_deltas_from_target_date if i.days >= 0]
index_of_min_delta_from_target_date = np.min(abs_deltas_from_target_date)
return index_of_min_delta_from_target_date
其中“russian_public_holidays”是公共假期日期列表,“target_date_raw”是我要计算到最近公共假期距离的日期。
这是我用来在我的 DataFrame 中为日期差异创建一个新列的代码。
training_data['closest_public_holiday'] = [dateDifference(i) for i in training_data['date']]
这段代码运行了将近 25 分钟,没有显示完成的迹象,这就是我向你们寻求帮助的原因。
我知道这可能是最不受欢迎的做事方式,但在我的研究过程中,我真的找不到在单个列上操作的干净方式。我看到很多人说在单个列上使用“应用”功能是一种不好的做事方式。我对处理如此大的数据集非常陌生,这就是为什么我现在似乎无法使用干净高效的做法。请让我知道解决这个问题的最佳方法是什么!
解决方案
试试这个,看看是否有助于计时。我担心它会占用太多内存。我没有要测试的数据。你可以试试。
df = pd.DataFrame(pd.date_range('01/01/2021','12/31/2021',freq='M'),columns=['Date'])
holidays = pd.to_datetime(np.array(['1/1/2021','12/25/2021','8/9/2021'])).to_numpy()
假设假期:2021 年 1 月 1 日、2021 年 8 月 9 日、2021 年 12 月 25 日
df['Days Away'] = (
np.min(np.absolute(df.Date.to_numpy()
.reshape(-1,1) - holidays),axis=1) /
np.timedelta64(1, 'D')
)
推荐阅读
- r - 创建列表的所有组合的数据框
- cvxpy - 在 cvxpy 0.4.10 但不是 1.0.18 中获得“无法乘以 AFFINE 和 CONVEX”
- android-studio - ExampleInstrumentedTest 出现 java.lang.ClassNotFoundException 错误
- flutter - 继承的小部件和导航抽屉。在 null 上调用了 getter 块
- excel - 根据名称(文本)计算哪个分数更高(值)
- javascript - 将文本上的句子转换为链接
- sql - 插入期间对整数进行 MS SQL 舍入 | VBA
- javascript - 处理来自 JSON 的 POST 数组对象,避免错误 ECONNREFUSED 套接字挂起
- vb.net - 如何在记事本文件中编辑文本框?
- html - 视频 z-index 变换旋转异常行为