Skip to content

Commit

Permalink
ENH: frequency inference and tests, close #391
Browse files Browse the repository at this point in the history
  • Loading branch information
wesm committed Apr 26, 2012
1 parent da2b7ad commit 1d3ed84
Show file tree
Hide file tree
Showing 8 changed files with 329 additions and 177 deletions.
2 changes: 2 additions & 0 deletions RELEASE.rst
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ pandas 0.8.0

- Add GroupBy.prod optimized aggregation function and 'prod' fast time series
conversion method (#1018)
- Implement robust frequency inference function and `inferred_freq` attribute
on DatetimeIndex (#391)

**Improvements to existing features**

Expand Down
10 changes: 9 additions & 1 deletion pandas/core/algorithms.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import numpy as np

from pandas.core.series import Series
import pandas.core.common as com
import pandas._tseries as lib

Expand All @@ -26,6 +25,12 @@ def match(values, index):
def unique(values):
"""
Parameters
----------
Returns
-------
"""
f = lambda htype, caster: _unique_generic(values, htype, caster)
return _hashtable_algo(f, values.dtype)
Expand All @@ -52,6 +57,8 @@ def _hashtable_algo(f, dtype):


def _count_generic(values, table_type, type_caster):
from pandas.core.series import Series

values = type_caster(values)
table = table_type(len(values))
uniques, labels, counts = table.factorize(values)
Expand Down Expand Up @@ -113,6 +120,7 @@ def value_counts(values, sort=True, ascending=False):
-------
value_counts : Series
"""
from pandas.core.series import Series
from collections import defaultdict
if com.is_integer_dtype(values.dtype):
values = com._ensure_int64(values)
Expand Down
123 changes: 52 additions & 71 deletions pandas/tests/test_datetools.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,9 +220,9 @@ def test_apply(self):
datetime(2008, 1, 6): datetime(2008, 1, 7),
datetime(2008, 1, 7): datetime(2008, 1, 7)}))

for dateOffset, cases in tests:
for baseDate, expected in cases.iteritems():
assertEq(dateOffset, baseDate, expected)
for offset, cases in tests:
for base, expected in cases.iteritems():
assertEq(offset, base, expected)

def test_apply_corner(self):
self.assertRaises(Exception, BDay().apply, BMonthEnd())
Expand Down Expand Up @@ -277,9 +277,9 @@ def test_offset(self):
datetime(2010, 4, 8): datetime(2010, 3, 30),
datetime(2010, 4, 5): datetime(2010, 3, 23)}))

for dateOffset, cases in tests:
for baseDate, expected in cases.iteritems():
assertEq(dateOffset, baseDate, expected)
for offset, cases in tests:
for base, expected in cases.iteritems():
assertEq(offset, base, expected)

def test_onOffset(self):
for weekday in range(7):
Expand Down Expand Up @@ -414,9 +414,9 @@ def test_offset(self):
datetime(2006, 12, 30): datetime(2006, 12, 1),
datetime(2007, 1, 1): datetime(2006, 12, 1)}))

for dateOffset, cases in tests:
for baseDate, expected in cases.iteritems():
assertEq(dateOffset, baseDate, expected)
for offset, cases in tests:
for base, expected in cases.iteritems():
assertEq(offset, base, expected)

def test_onOffset(self):

Expand Down Expand Up @@ -470,9 +470,9 @@ def test_offset(self):
datetime(2006, 12, 30): datetime(2006, 12, 29),
datetime(2007, 1, 1): datetime(2006, 12, 29)}))

for dateOffset, cases in tests:
for baseDate, expected in cases.iteritems():
assertEq(dateOffset, baseDate, expected)
for offset, cases in tests:
for base, expected in cases.iteritems():
assertEq(offset, base, expected)

def test_onOffset(self):

Expand Down Expand Up @@ -523,9 +523,9 @@ def test_offset(self):
datetime(2006, 12, 29): datetime(2006, 12, 1),
datetime(2006, 1, 2): datetime(2006, 1, 1)}))

for dateOffset, cases in tests:
for baseDate, expected in cases.iteritems():
assertEq(dateOffset, baseDate, expected)
for offset, cases in tests:
for base, expected in cases.iteritems():
assertEq(offset, base, expected)

class TestMonthEnd(unittest.TestCase):

Expand Down Expand Up @@ -563,9 +563,9 @@ def test_offset(self):
datetime(2006, 12, 30): datetime(2006, 11, 30),
datetime(2007, 1, 1): datetime(2006, 12, 31)}))

for dateOffset, cases in tests:
for baseDate, expected in cases.iteritems():
assertEq(dateOffset, baseDate, expected)
for offset, cases in tests:
for base, expected in cases.iteritems():
assertEq(offset, base, expected)

def test_onOffset(self):

Expand Down Expand Up @@ -651,9 +651,9 @@ def test_offset(self):
datetime(2007, 4, 15): datetime(2007, 10, 1),
datetime(2008, 4, 30): datetime(2008, 10, 1),}))

for dateOffset, cases in tests:
for baseDate, expected in cases.iteritems():
assertEq(dateOffset, baseDate, expected)
for offset, cases in tests:
for base, expected in cases.iteritems():
assertEq(offset, base, expected)

# corner
offset = BQuarterBegin(n=-1, startingMonth=1)
Expand Down Expand Up @@ -718,9 +718,9 @@ def test_offset(self):
datetime(2008, 4, 15): datetime(2008, 7, 31),
datetime(2008, 4, 30): datetime(2008, 10, 31),}))

for dateOffset, cases in tests:
for baseDate, expected in cases.iteritems():
assertEq(dateOffset, baseDate, expected)
for offset, cases in tests:
for base, expected in cases.iteritems():
assertEq(offset, base, expected)

# corner
offset = BQuarterEnd(n=-1, startingMonth=1)
Expand Down Expand Up @@ -822,9 +822,9 @@ def test_offset(self):
datetime(2008, 4, 15): datetime(2008, 10, 1),
datetime(2008, 4, 1): datetime(2008, 10, 1),}))

for dateOffset, cases in tests:
for baseDate, expected in cases.iteritems():
assertEq(dateOffset, baseDate, expected)
for offset, cases in tests:
for base, expected in cases.iteritems():
assertEq(offset, base, expected)

# corner
offset = QuarterBegin(n=-1, startingMonth=1)
Expand Down Expand Up @@ -890,9 +890,9 @@ def test_offset(self):
datetime(2008, 4, 15): datetime(2008, 7, 31),
datetime(2008, 4, 30): datetime(2008, 10, 31),}))

for dateOffset, cases in tests:
for baseDate, expected in cases.iteritems():
assertEq(dateOffset, baseDate, expected)
for offset, cases in tests:
for base, expected in cases.iteritems():
assertEq(offset, base, expected)

# corner
offset = QuarterEnd(n=-1, startingMonth=1)
Expand Down Expand Up @@ -974,9 +974,9 @@ def test_offset(self):
datetime(2007, 6, 30): datetime(2006, 1, 2),
datetime(2008, 12, 31): datetime(2007, 1, 1),}))

for dateOffset, cases in tests:
for baseDate, expected in cases.iteritems():
assertEq(dateOffset, baseDate, expected)
for offset, cases in tests:
for base, expected in cases.iteritems():
assertEq(offset, base, expected)


class TestYearBegin(unittest.TestCase):
Expand Down Expand Up @@ -1012,9 +1012,9 @@ def test_offset(self):
datetime(2008, 6, 30): datetime(2007, 1, 1),
datetime(2008, 12, 31): datetime(2007, 1, 1),}))

for dateOffset, cases in tests:
for baseDate, expected in cases.iteritems():
assertEq(dateOffset, baseDate, expected)
for offset, cases in tests:
for base, expected in cases.iteritems():
assertEq(offset, base, expected)


def test_onOffset(self):
Expand Down Expand Up @@ -1048,9 +1048,9 @@ def test_offset(self):
datetime(2007, 6, 30): datetime(2007, 6, 29)},
))

for dateOffset, cases in tests:
for baseDate, expected in cases.iteritems():
self.assertEqual(baseDate + dateOffset, expected)
for offset, cases in tests:
for base, expected in cases.iteritems():
self.assertEqual(base + offset, expected)

def test_roll(self):
offset = BYearEnd(month=6)
Expand Down Expand Up @@ -1100,9 +1100,9 @@ def test_offset(self):
datetime(2008, 6, 30): datetime(2006, 12, 29),
datetime(2008, 12, 31): datetime(2006, 12, 29),}))

for dateOffset, cases in tests:
for baseDate, expected in cases.iteritems():
assertEq(dateOffset, baseDate, expected)
for offset, cases in tests:
for base, expected in cases.iteritems():
assertEq(offset, base, expected)

def test_onOffset(self):

Expand Down Expand Up @@ -1147,9 +1147,9 @@ def test_offset(self):
datetime(2008, 6, 30): datetime(2006, 12, 31),
datetime(2008, 12, 31): datetime(2006, 12, 31),}))

for dateOffset, cases in tests:
for baseDate, expected in cases.iteritems():
assertEq(dateOffset, baseDate, expected)
for offset, cases in tests:
for base, expected in cases.iteritems():
assertEq(offset, base, expected)

def test_onOffset(self):

Expand Down Expand Up @@ -1191,12 +1191,12 @@ def test_offset(self):

tests.append((YearEnd(-2, month=3),
{datetime(2007, 1, 1): datetime(2005, 3, 31),
datetime(2008, 6, 30): datetime(2006, 3, 31),
datetime(2008, 6, 30): datetime(2007, 3, 31),
datetime(2008, 3, 31): datetime(2006, 3, 31),}))

for dateOffset, cases in tests:
for baseDate, expected in cases.iteritems():
assertEq(dateOffset, baseDate, expected)
for offset, cases in tests:
for base, expected in cases.iteritems():
assertEq(offset, base, expected)

def test_onOffset(self):

Expand All @@ -1210,14 +1210,14 @@ def test_onOffset(self):
for offset, date, expected in tests:
assertOnOffset(offset, date, expected)

def assertEq(dateOffset, baseDate, expected):
actual = dateOffset + baseDate
def assertEq(offset, base, expected):
actual = offset + base
try:
assert actual == expected
except AssertionError as err:
raise AssertionError("\nExpected: %s\nActual: %s\nFor Offset: %s)"
"\nAt Date: %s"%
(expected, actual, dateOffset, baseDate))
(expected, actual, offset, base))

def test_Hour():
assertEq(Hour(), datetime(2010, 1, 1), datetime(2010, 1, 1, 1))
Expand Down Expand Up @@ -1249,25 +1249,6 @@ def test_Second():
assert (Second(3) + Second(2)) == Second(5)
assert (Second(3) - Second(2)) == Second()

def test_inferTimeRule():
index1 = [datetime(2010, 1, 29, 0, 0),
datetime(2010, 2, 26, 0, 0),
datetime(2010, 3, 31, 0, 0)]

index2 = [datetime(2010, 3, 26, 0, 0),
datetime(2010, 3, 29, 0, 0),
datetime(2010, 3, 30, 0, 0)]

index3 = [datetime(2010, 3, 26, 0, 0),
datetime(2010, 3, 27, 0, 0),
datetime(2010, 3, 29, 0, 0)]

assert inferTimeRule(index1) == 'BM'
assert inferTimeRule(index2) == 'B'

assert_raises(Exception, inferTimeRule, index1[:2])
assert_raises(Exception, inferTimeRule, index3)

def test_hasOffsetName():
assert hasOffsetName(BDay())
assert not hasOffsetName(BDay(2))
Expand Down
Loading

0 comments on commit 1d3ed84

Please sign in to comment.