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
31
32
33
34
35
36
37
38
39
|
import pandas as pd
from pandas.tseries.offsets import CustomBusinessDay, Day
from pandas.tseries.holiday import get_calendar, HolidayCalendarFactory, GoodFriday
import unittest
fed_cal = get_calendar('USFederalHolidayCalendar')
bond_cal = HolidayCalendarFactory('BondCalendar', fed_cal, GoodFriday)
bus_day = CustomBusinessDay(calendar=bond_cal())
def prev_immdate(valdate):
dates = [pd.datetime(valdate.year-1, 12, 20)] + \
[pd.datetime(valdate.year, m, 20) for m in [3, 6, 9, 12]]
dates = [bus_day.rollforward(d) for d in dates]
for i, d in enumerate(dates[1:], 1):
if d >= valdate:
break
else:
return dates[-1]
return d if d==valdate else dates[i-1]
def days_accrued(tradedate):
start_protection = pd.Timestamp(tradedate) + Day()
delta = start_protection-prev_immdate(start_protection)
return delta.days
class TestDaysAccrued(unittest.TestCase):
def test(self):
dates = [('2015-01-07', 17),
('2015-06-19', 92),
('2015-03-19', 0),
('2015-06-20', 93),
('2015-06-21', 0),
('2015-12-21', 1),
('2015-12-28', 8)]
for date, days in dates:
self.assertEqual(days_accrued(date), days)
if __name__=="__main__":
unittest.main()
|