Skip to content

Commit 553a829

Browse files
jbrockmendeljreback
authored andcommitted
Use cache_readonly attrs to minimize attrs set in __init__ (pandas-dev#17450)
1 parent 26b461b commit 553a829

File tree

1 file changed

+29
-18
lines changed

1 file changed

+29
-18
lines changed

pandas/tseries/offsets.py

+29-18
Original file line numberDiff line numberDiff line change
@@ -939,12 +939,14 @@ def __init__(self, n=1, normalize=False, **kwds):
939939
self.normalize = normalize
940940
super(BusinessHour, self).__init__(**kwds)
941941

942+
@cache_readonly
943+
def next_bday(self):
942944
# used for moving to next businessday
943945
if self.n >= 0:
944946
nb_offset = 1
945947
else:
946948
nb_offset = -1
947-
self.next_bday = BusinessDay(n=nb_offset)
949+
return BusinessDay(n=nb_offset)
948950

949951

950952
class CustomBusinessDay(BusinessDay):
@@ -1562,6 +1564,7 @@ class Week(DateOffset):
15621564
Always generate specific day of week. 0 for Monday
15631565
"""
15641566
_adjust_dst = True
1567+
_inc = timedelta(weeks=1)
15651568

15661569
def __init__(self, n=1, normalize=False, **kwds):
15671570
self.n = n
@@ -1573,7 +1576,6 @@ def __init__(self, n=1, normalize=False, **kwds):
15731576
raise ValueError('Day must be 0<=day<=6, got {day}'
15741577
.format(day=self.weekday))
15751578

1576-
self._inc = timedelta(weeks=1)
15771579
self.kwds = kwds
15781580

15791581
def isAnchored(self):
@@ -1977,13 +1979,6 @@ class QuarterEnd(QuarterOffset):
19771979
_default_startingMonth = 3
19781980
_prefix = 'Q'
19791981

1980-
def __init__(self, n=1, normalize=False, **kwds):
1981-
self.n = n
1982-
self.normalize = normalize
1983-
self.startingMonth = kwds.get('startingMonth', 3)
1984-
1985-
self.kwds = kwds
1986-
19871982
def isAnchored(self):
19881983
return (self.n == 1 and self.startingMonth is not None)
19891984

@@ -2316,12 +2311,28 @@ def __init__(self, n=1, normalize=False, **kwds):
23162311
raise ValueError('{variation} is not a valid variation'
23172312
.format(variation=self.variation))
23182313

2314+
@cache_readonly
2315+
def _relativedelta_forward(self):
23192316
if self.variation == "nearest":
23202317
weekday_offset = weekday(self.weekday)
2321-
self._rd_forward = relativedelta(weekday=weekday_offset)
2322-
self._rd_backward = relativedelta(weekday=weekday_offset(-1))
2318+
return relativedelta(weekday=weekday_offset)
23232319
else:
2324-
self._offset_lwom = LastWeekOfMonth(n=1, weekday=self.weekday)
2320+
return None
2321+
2322+
@cache_readonly
2323+
def _relativedelta_backward(self):
2324+
if self.variation == "nearest":
2325+
weekday_offset = weekday(self.weekday)
2326+
return relativedelta(weekday=weekday_offset(-1))
2327+
else:
2328+
return None
2329+
2330+
@cache_readonly
2331+
def _offset_lwom(self):
2332+
if self.variation == "nearest":
2333+
return None
2334+
else:
2335+
return LastWeekOfMonth(n=1, weekday=self.weekday)
23252336

23262337
def isAnchored(self):
23272338
return self.n == 1 \
@@ -2425,8 +2436,8 @@ def _get_year_end_nearest(self, dt):
24252436
if target_date.weekday() == self.weekday:
24262437
return target_date
24272438
else:
2428-
forward = target_date + self._rd_forward
2429-
backward = target_date + self._rd_backward
2439+
forward = target_date + self._relativedelta_forward
2440+
backward = target_date + self._relativedelta_backward
24302441

24312442
if forward - target_date < target_date - backward:
24322443
return forward
@@ -2542,7 +2553,10 @@ def __init__(self, n=1, normalize=False, **kwds):
25422553
if self.n == 0:
25432554
raise ValueError('N cannot be 0')
25442555

2545-
self._offset = FY5253(
2556+
@cache_readonly
2557+
def _offset(self):
2558+
kwds = self.kwds
2559+
return FY5253(
25462560
startingMonth=kwds['startingMonth'],
25472561
weekday=kwds["weekday"],
25482562
variation=kwds["variation"])
@@ -2652,9 +2666,6 @@ class Easter(DateOffset):
26522666
"""
26532667
_adjust_dst = True
26542668

2655-
def __init__(self, n=1, **kwds):
2656-
super(Easter, self).__init__(n, **kwds)
2657-
26582669
@apply_wraps
26592670
def apply(self, other):
26602671
currentEaster = easter(other.year)

0 commit comments

Comments
 (0)