|
2 | 2 | from datetime import datetime
|
3 | 3 |
|
4 | 4 | import numpy as np
|
5 |
| - |
6 | 5 | import pandas as pd
|
7 |
| -from pandas import date_range |
8 |
| - |
9 | 6 | try:
|
10 |
| - import pandas.tseries.holiday |
| 7 | + import pandas.tseries.holiday # noqa |
11 | 8 | except ImportError:
|
12 | 9 | pass
|
13 | 10 |
|
14 | 11 | hcal = pd.tseries.holiday.USFederalHolidayCalendar()
|
| 12 | +# These offests currently raise a NotImplimentedError with .apply_index() |
| 13 | +non_apply = [pd.offsets.Day(), |
| 14 | + pd.offsets.BYearEnd(), |
| 15 | + pd.offsets.BYearBegin(), |
| 16 | + pd.offsets.BQuarterEnd(), |
| 17 | + pd.offsets.BQuarterBegin(), |
| 18 | + pd.offsets.BMonthEnd(), |
| 19 | + pd.offsets.BMonthBegin(), |
| 20 | + pd.offsets.CustomBusinessDay(), |
| 21 | + pd.offsets.CustomBusinessDay(calendar=hcal), |
| 22 | + pd.offsets.CustomBusinessMonthBegin(calendar=hcal), |
| 23 | + pd.offsets.CustomBusinessMonthEnd(calendar=hcal), |
| 24 | + pd.offsets.CustomBusinessMonthEnd(calendar=hcal)] |
| 25 | +other_offsets = [pd.offsets.YearEnd(), pd.offsets.YearBegin(), |
| 26 | + pd.offsets.QuarterEnd(), pd.offsets.QuarterBegin(), |
| 27 | + pd.offsets.MonthEnd(), pd.offsets.MonthBegin(), |
| 28 | + pd.offsets.DateOffset(months=2, days=2), |
| 29 | + pd.offsets.BusinessDay(), pd.offsets.SemiMonthEnd(), |
| 30 | + pd.offsets.SemiMonthBegin()] |
| 31 | +offsets = non_apply + other_offsets |
15 | 32 |
|
16 | 33 |
|
17 | 34 | class ApplyIndex(object):
|
18 |
| - goal_time = 0.2 |
19 | 35 |
|
20 |
| - params = [pd.offsets.YearEnd(), pd.offsets.YearBegin(), |
21 |
| - pd.offsets.BYearEnd(), pd.offsets.BYearBegin(), |
22 |
| - pd.offsets.QuarterEnd(), pd.offsets.QuarterBegin(), |
23 |
| - pd.offsets.BQuarterEnd(), pd.offsets.BQuarterBegin(), |
24 |
| - pd.offsets.MonthEnd(), pd.offsets.MonthBegin(), |
25 |
| - pd.offsets.BMonthEnd(), pd.offsets.BMonthBegin()] |
26 |
| - |
27 |
| - def setup(self, param): |
28 |
| - self.offset = param |
| 36 | + goal_time = 0.2 |
29 | 37 |
|
30 |
| - self.N = 100000 |
31 |
| - self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') |
32 |
| - self.ser = pd.Series(self.rng) |
| 38 | + params = other_offsets |
| 39 | + param_names = ['offset'] |
33 | 40 |
|
34 |
| - def time_apply_index(self, param): |
35 |
| - self.rng + self.offset |
| 41 | + def setup(self, offset): |
| 42 | + N = 10000 |
| 43 | + self.rng = pd.date_range(start='1/1/2000', periods=N, freq='T') |
36 | 44 |
|
37 |
| - def time_apply_series(self, param): |
38 |
| - self.ser + self.offset |
| 45 | + def time_apply_index(self, offset): |
| 46 | + offset.apply_index(self.rng) |
39 | 47 |
|
40 | 48 |
|
41 | 49 | class OnOffset(object):
|
| 50 | + |
42 | 51 | goal_time = 0.2
|
43 | 52 |
|
44 |
| - params = [pd.offsets.QuarterBegin(), pd.offsets.QuarterEnd(), |
45 |
| - pd.offsets.BQuarterBegin(), pd.offsets.BQuarterEnd()] |
| 53 | + params = offsets |
46 | 54 | param_names = ['offset']
|
47 | 55 |
|
48 | 56 | def setup(self, offset):
|
49 |
| - self.offset = offset |
50 | 57 | self.dates = [datetime(2016, m, d)
|
51 | 58 | for m in [10, 11, 12]
|
52 | 59 | for d in [1, 2, 3, 28, 29, 30, 31]
|
53 | 60 | if not (m == 11 and d == 31)]
|
54 | 61 |
|
55 | 62 | def time_on_offset(self, offset):
|
56 | 63 | for date in self.dates:
|
57 |
| - self.offset.onOffset(date) |
58 |
| - |
59 |
| - |
60 |
| -class DatetimeIndexArithmetic(object): |
61 |
| - goal_time = 0.2 |
62 |
| - |
63 |
| - def setup(self): |
64 |
| - self.N = 100000 |
65 |
| - self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') |
66 |
| - self.day_offset = pd.offsets.Day() |
67 |
| - self.relativedelta_offset = pd.offsets.DateOffset(months=2, days=2) |
68 |
| - self.busday_offset = pd.offsets.BusinessDay() |
69 |
| - |
70 |
| - def time_add_offset_delta(self): |
71 |
| - self.rng + self.day_offset |
72 |
| - |
73 |
| - def time_add_offset_fast(self): |
74 |
| - self.rng + self.relativedelta_offset |
75 |
| - |
76 |
| - def time_add_offset_slow(self): |
77 |
| - self.rng + self.busday_offset |
78 |
| - |
79 |
| - |
80 |
| -class SeriesArithmetic(object): |
81 |
| - goal_time = 0.2 |
| 64 | + offset.onOffset(date) |
82 | 65 |
|
83 |
| - def setup(self): |
84 |
| - self.N = 100000 |
85 |
| - rng = date_range(start='20140101', freq='T', periods=self.N) |
86 |
| - self.ser = pd.Series(rng) |
87 |
| - self.day_offset = pd.offsets.Day() |
88 |
| - self.relativedelta_offset = pd.offsets.DateOffset(months=2, days=2) |
89 |
| - self.busday_offset = pd.offsets.BusinessDay() |
90 | 66 |
|
91 |
| - def time_add_offset_delta(self): |
92 |
| - self.ser + self.day_offset |
| 67 | +class OffsetSeriesArithmetic(object): |
93 | 68 |
|
94 |
| - def time_add_offset_fast(self): |
95 |
| - self.ser + self.relativedelta_offset |
96 |
| - |
97 |
| - def time_add_offset_slow(self): |
98 |
| - self.ser + self.busday_offset |
99 |
| - |
100 |
| - |
101 |
| -class YearBegin(object): |
102 | 69 | goal_time = 0.2
|
| 70 | + params = offsets |
| 71 | + param_names = ['offset'] |
103 | 72 |
|
104 |
| - def setup(self): |
105 |
| - self.date = datetime(2011, 1, 1) |
106 |
| - self.year = pd.offsets.YearBegin() |
| 73 | + def setup(self, offset): |
| 74 | + N = 1000 |
| 75 | + rng = pd.date_range(start='1/1/2000', periods=N, freq='T') |
| 76 | + self.data = pd.Series(rng) |
107 | 77 |
|
108 |
| - def time_timeseries_year_apply(self): |
109 |
| - self.year.apply(self.date) |
| 78 | + def time_add_offset(self, offset): |
| 79 | + self.data + offset |
110 | 80 |
|
111 |
| - def time_timeseries_year_incr(self): |
112 |
| - self.date + self.year |
113 | 81 |
|
| 82 | +class OffsetDatetimeIndexArithmetic(object): |
114 | 83 |
|
115 |
| -class Day(object): |
116 | 84 | goal_time = 0.2
|
| 85 | + params = offsets |
| 86 | + param_names = ['offset'] |
117 | 87 |
|
118 |
| - def setup(self): |
119 |
| - self.date = datetime(2011, 1, 1) |
120 |
| - self.day = pd.offsets.Day() |
| 88 | + def setup(self, offset): |
| 89 | + N = 1000 |
| 90 | + self.data = pd.date_range(start='1/1/2000', periods=N, freq='T') |
121 | 91 |
|
122 |
| - def time_timeseries_day_apply(self): |
123 |
| - self.day.apply(self.date) |
| 92 | + def time_add_offset(self, offset): |
| 93 | + self.data + offset |
124 | 94 |
|
125 |
| - def time_timeseries_day_incr(self): |
126 |
| - self.date + self.day |
127 | 95 |
|
| 96 | +class OffestDatetimeArithmetic(object): |
128 | 97 |
|
129 |
| -class CBDay(object): |
130 | 98 | goal_time = 0.2
|
| 99 | + params = offsets |
| 100 | + param_names = ['offset'] |
131 | 101 |
|
132 |
| - def setup(self): |
| 102 | + def setup(self, offset): |
133 | 103 | self.date = datetime(2011, 1, 1)
|
134 | 104 | self.dt64 = np.datetime64('2011-01-01 09:00Z')
|
135 |
| - self.cday = pd.offsets.CustomBusinessDay() |
136 |
| - |
137 |
| - def time_custom_bday_decr(self): |
138 |
| - self.date - self.cday |
139 |
| - |
140 |
| - def time_custom_bday_incr(self): |
141 |
| - self.date + self.cday |
142 |
| - |
143 |
| - def time_custom_bday_apply(self): |
144 |
| - self.cday.apply(self.date) |
145 |
| - |
146 |
| - def time_custom_bday_apply_dt64(self): |
147 |
| - self.cday.apply(self.dt64) |
148 |
| - |
149 |
| - |
150 |
| -class CBDayHolidays(object): |
151 |
| - goal_time = 0.2 |
152 |
| - |
153 |
| - def setup(self): |
154 |
| - self.date = datetime(2011, 1, 1) |
155 |
| - self.cdayh = pd.offsets.CustomBusinessDay(calendar=hcal) |
156 |
| - |
157 |
| - def time_custom_bday_cal_incr(self): |
158 |
| - self.date + 1 * self.cdayh |
159 |
| - |
160 |
| - def time_custom_bday_cal_decr(self): |
161 |
| - self.date - 1 * self.cdayh |
162 |
| - |
163 |
| - def time_custom_bday_cal_incr_n(self): |
164 |
| - self.date + 10 * self.cdayh |
165 |
| - |
166 |
| - def time_custom_bday_cal_incr_neg_n(self): |
167 |
| - self.date - 10 * self.cdayh |
168 |
| - |
169 |
| - |
170 |
| -class CBMonthBegin(object): |
171 |
| - goal_time = 0.2 |
172 |
| - |
173 |
| - def setup(self): |
174 |
| - self.date = datetime(2011, 1, 1) |
175 |
| - self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=hcal) |
176 |
| - |
177 |
| - def time_custom_bmonthbegin_decr_n(self): |
178 |
| - self.date - (10 * self.cmb) |
179 |
| - |
180 |
| - def time_custom_bmonthbegin_incr_n(self): |
181 |
| - self.date + (10 * self.cmb) |
182 |
| - |
183 |
| - |
184 |
| -class CBMonthEnd(object): |
185 |
| - goal_time = 0.2 |
186 |
| - |
187 |
| - def setup(self): |
188 |
| - self.date = datetime(2011, 1, 1) |
189 |
| - self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=hcal) |
190 |
| - |
191 |
| - def time_custom_bmonthend_incr(self): |
192 |
| - self.date + self.cme |
193 |
| - |
194 |
| - def time_custom_bmonthend_incr_n(self): |
195 |
| - self.date + (10 * self.cme) |
196 |
| - |
197 |
| - def time_custom_bmonthend_decr_n(self): |
198 |
| - self.date - (10 * self.cme) |
199 |
| - |
200 |
| - |
201 |
| -class SemiMonthOffset(object): |
202 |
| - goal_time = 0.2 |
203 |
| - |
204 |
| - def setup(self): |
205 |
| - self.N = 100000 |
206 |
| - self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') |
207 |
| - # date is not on an offset which will be slowest case |
208 |
| - self.date = datetime(2011, 1, 2) |
209 |
| - self.semi_month_end = pd.offsets.SemiMonthEnd() |
210 |
| - self.semi_month_begin = pd.offsets.SemiMonthBegin() |
211 |
| - |
212 |
| - def time_end_apply(self): |
213 |
| - self.semi_month_end.apply(self.date) |
214 |
| - |
215 |
| - def time_end_incr(self): |
216 |
| - self.date + self.semi_month_end |
217 |
| - |
218 |
| - def time_end_incr_n(self): |
219 |
| - self.date + 10 * self.semi_month_end |
220 |
| - |
221 |
| - def time_end_decr(self): |
222 |
| - self.date - self.semi_month_end |
223 |
| - |
224 |
| - def time_end_decr_n(self): |
225 |
| - self.date - 10 * self.semi_month_end |
226 |
| - |
227 |
| - def time_end_apply_index(self): |
228 |
| - self.semi_month_end.apply_index(self.rng) |
229 |
| - |
230 |
| - def time_end_incr_rng(self): |
231 |
| - self.rng + self.semi_month_end |
232 |
| - |
233 |
| - def time_end_decr_rng(self): |
234 |
| - self.rng - self.semi_month_end |
235 |
| - |
236 |
| - def time_begin_apply(self): |
237 |
| - self.semi_month_begin.apply(self.date) |
238 |
| - |
239 |
| - def time_begin_incr(self): |
240 |
| - self.date + self.semi_month_begin |
241 | 105 |
|
242 |
| - def time_begin_incr_n(self): |
243 |
| - self.date + 10 * self.semi_month_begin |
| 106 | + def time_apply(self, offset): |
| 107 | + offset.apply(self.date) |
244 | 108 |
|
245 |
| - def time_begin_decr(self): |
246 |
| - self.date - self.semi_month_begin |
| 109 | + def time_apply_np_dt64(self, offset): |
| 110 | + offset.apply(self.dt64) |
247 | 111 |
|
248 |
| - def time_begin_decr_n(self): |
249 |
| - self.date - 10 * self.semi_month_begin |
| 112 | + def time_add(self, offset): |
| 113 | + self.date + offset |
250 | 114 |
|
251 |
| - def time_begin_apply_index(self): |
252 |
| - self.semi_month_begin.apply_index(self.rng) |
| 115 | + def time_add_10(self, offset): |
| 116 | + self.date + (10 * offset) |
253 | 117 |
|
254 |
| - def time_begin_incr_rng(self): |
255 |
| - self.rng + self.semi_month_begin |
| 118 | + def time_subtract(self, offset): |
| 119 | + self.date - offset |
256 | 120 |
|
257 |
| - def time_begin_decr_rng(self): |
258 |
| - self.rng - self.semi_month_begin |
| 121 | + def time_subtract_10(self, offset): |
| 122 | + self.date - (10 * offset) |
0 commit comments