如何有效地实现"修改后的"的矢量化版本?熊猫的工作日付款规则?
背景
在金融领域,通常情况下,固定收入优惠券是在"修改后的"基础,即如果优惠券日期属于周末或假日,则在下一个工作日支付,除非下一个工作日落入下一个日历月,在这种情况下我们会倒退到最近的上一个工作日。
April 2017
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
2017年4月提供了一个很好的例子。如果付款在星期六15日付款,它将被转移到星期一17日。但是,如果它在两周后的星期六29日落下,它将被倒退到星期五28日(因为下一个星期一将在5月)。
我需要一次为成千上万的日期做这件事,因此我希望它可以被矢量化并且如果可能的话还会保持大熊猫的效率(也就是说,我希望避免每个日期都通过IF-THEN-ELSE)。因此,给定一个日期向量,它将检查Sat / Sun上的哪个下降并自动应用规则,输出"修改后的"日期。
答案 0 :(得分:2)
如果您对熊猫解决方案感兴趣,这是一个开始:
import pandas as pd
from pandas.tseries.holiday import USFederalHolidayCalendar
from pandas.tseries.offsets import CustomBusinessDay
BDayUS = CustomBusinessDay(calendar=USFederalHolidayCalendar())
def is_weekday(dates):
return ~dates.weekday_name.isin(['Saturday', 'Sunday'])
def in_next_month(dates1, dates2):
return dates1.month == dates2.month - 1
def next_bus_day(dates):
fwd = dates + BDayUS(1)
return fwd.where(~in_next_month(dates, fwd), dates - BDayUS(1))
def payment_day(dates):
return dates.where(is_weekday(dates), next_bus_day(dates))
2017年4月:
dates = pd.date_range('4/1/2017', '4/30/2017')
payment_day(dates)
# DatetimeIndex(['2017-04-03', '2017-04-03', '2017-04-03', '2017-04-04',
# '2017-04-05', '2017-04-06', '2017-04-07', '2017-04-10',
# '2017-04-10', '2017-04-10', '2017-04-11', '2017-04-12',
# '2017-04-13', '2017-04-14', '2017-04-17', '2017-04-17',
# '2017-04-17', '2017-04-18', '2017-04-19', '2017-04-20',
# '2017-04-21', '2017-04-24', '2017-04-24', '2017-04-24',
# '2017-04-25', '2017-04-26', '2017-04-27', '2017-04-28',
# '2017-04-28', '2017-04-28'],
# dtype='datetime64[ns]', freq='D')
payment_day(dates).weekday_name
# Index(['Monday', 'Monday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday',
# 'Friday', 'Monday', 'Monday', 'Monday', 'Tuesday', 'Wednesday',
# 'Thursday', 'Friday', 'Monday', 'Monday', 'Monday', 'Tuesday',
# 'Wednesday', 'Thursday', 'Friday', 'Monday', 'Monday', 'Monday',
# 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Friday', 'Friday'],
# dtype='object')
另请参阅:文档中的Custom Business Day。请对此进行压力测试;我大多只是与默认BDay合作,我不确定联邦假期是否与纽约证券交易所市场关闭完美契合。