|
1 | 1 | import datetime
|
2 |
| -import unittest |
3 |
| -import warnings |
4 | 2 |
|
5 | 3 | import numpy as np
|
6 | 4 | from numpy.testing import assert_equal
|
7 | 5 |
|
8 | 6 | import pandas
|
9 |
| -from pandas import DataFrame, Series, Index, MultiIndex |
| 7 | +from pandas import DataFrame, Series, Index, MultiIndex, Grouper |
10 | 8 | from pandas.tools.merge import concat
|
11 | 9 | from pandas.tools.pivot import pivot_table, crosstab
|
12 | 10 | from pandas.compat import range, u, product
|
@@ -288,8 +286,7 @@ def test_pivot_columns_lexsorted(self):
|
288 | 286 | iproduct = np.random.randint(0, len(products), n)
|
289 | 287 | items['Index'] = products['Index'][iproduct]
|
290 | 288 | items['Symbol'] = products['Symbol'][iproduct]
|
291 |
| - dr = pandas.date_range(datetime.date(2000, 1, 1), |
292 |
| - datetime.date(2010, 12, 31)) |
| 289 | + dr = pandas.date_range(datetime.date(2000, 1, 1), datetime.date(2010, 12, 31)) |
293 | 290 | dates = dr[np.random.randint(0, len(dr), n)]
|
294 | 291 | items['Year'] = dates.year
|
295 | 292 | items['Month'] = dates.month
|
@@ -333,6 +330,128 @@ def test_margins_no_values_two_row_two_cols(self):
|
333 | 330 | result = self.data[['A', 'B', 'C', 'D']].pivot_table(index=['A', 'B'], columns=['C', 'D'], aggfunc=len, margins=True)
|
334 | 331 | self.assertEqual(result.All.tolist(), [3.0, 1.0, 4.0, 3.0, 11.0])
|
335 | 332 |
|
| 333 | + def test_pivot_timegrouper(self): |
| 334 | + df = DataFrame({ |
| 335 | + 'Branch' : 'A A A A A A A B'.split(), |
| 336 | + 'Buyer': 'Carl Mark Carl Carl Joe Joe Joe Carl'.split(), |
| 337 | + 'Quantity': [1, 3, 5, 1, 8, 1, 9, 3], |
| 338 | + 'Date' : [datetime.datetime(2013, 1, 1), datetime.datetime(2013, 1, 1), |
| 339 | + datetime.datetime(2013, 10, 1), datetime.datetime(2013, 10, 2), |
| 340 | + datetime.datetime(2013, 10, 1), datetime.datetime(2013, 10, 2), |
| 341 | + datetime.datetime(2013, 12, 2), datetime.datetime(2013, 12, 2),]}).set_index('Date') |
| 342 | + |
| 343 | + expected = DataFrame(np.array([10, 18, 3]).reshape(1, 3), |
| 344 | + index=[datetime.datetime(2013, 12, 31)], |
| 345 | + columns='Carl Joe Mark'.split()) |
| 346 | + expected.index.name = 'Date' |
| 347 | + expected.columns.name = 'Buyer' |
| 348 | + |
| 349 | + result = pivot_table(df, index=Grouper(freq='A'), columns='Buyer', |
| 350 | + values='Quantity', aggfunc=np.sum) |
| 351 | + tm.assert_frame_equal(result,expected) |
| 352 | + |
| 353 | + result = pivot_table(df, index='Buyer', columns=Grouper(freq='A'), |
| 354 | + values='Quantity', aggfunc=np.sum) |
| 355 | + tm.assert_frame_equal(result,expected.T) |
| 356 | + |
| 357 | + expected = DataFrame(np.array([1, np.nan, 3, 9, 18, np.nan]).reshape(2, 3), |
| 358 | + index=[datetime.datetime(2013, 1, 1), datetime.datetime(2013, 7, 1)], |
| 359 | + columns='Carl Joe Mark'.split()) |
| 360 | + expected.index.name = 'Date' |
| 361 | + expected.columns.name = 'Buyer' |
| 362 | + |
| 363 | + result = pivot_table(df, index=Grouper(freq='6MS'), columns='Buyer', |
| 364 | + values='Quantity', aggfunc=np.sum) |
| 365 | + tm.assert_frame_equal(result, expected) |
| 366 | + |
| 367 | + result = pivot_table(df, index='Buyer', columns=Grouper(freq='6MS'), |
| 368 | + values='Quantity', aggfunc=np.sum) |
| 369 | + tm.assert_frame_equal(result, expected.T) |
| 370 | + |
| 371 | + # passing the name |
| 372 | + df = df.reset_index() |
| 373 | + result = pivot_table(df, index=Grouper(freq='6MS', key='Date'), columns='Buyer', |
| 374 | + values='Quantity', aggfunc=np.sum) |
| 375 | + tm.assert_frame_equal(result, expected) |
| 376 | + |
| 377 | + result = pivot_table(df, index='Buyer', columns=Grouper(freq='6MS', key='Date'), |
| 378 | + values='Quantity', aggfunc=np.sum) |
| 379 | + tm.assert_frame_equal(result, expected.T) |
| 380 | + |
| 381 | + self.assertRaises(KeyError, lambda : pivot_table(df, index=Grouper(freq='6MS', key='foo'), |
| 382 | + columns='Buyer', values='Quantity', aggfunc=np.sum)) |
| 383 | + self.assertRaises(KeyError, lambda : pivot_table(df, index='Buyer', |
| 384 | + columns=Grouper(freq='6MS', key='foo'), values='Quantity', aggfunc=np.sum)) |
| 385 | + |
| 386 | + # passing the level |
| 387 | + df = df.set_index('Date') |
| 388 | + result = pivot_table(df, index=Grouper(freq='6MS', level='Date'), columns='Buyer', |
| 389 | + values='Quantity', aggfunc=np.sum) |
| 390 | + tm.assert_frame_equal(result, expected) |
| 391 | + |
| 392 | + result = pivot_table(df, index='Buyer', columns=Grouper(freq='6MS', level='Date'), |
| 393 | + values='Quantity', aggfunc=np.sum) |
| 394 | + tm.assert_frame_equal(result, expected.T) |
| 395 | + |
| 396 | + self.assertRaises(ValueError, lambda : pivot_table(df, index=Grouper(freq='6MS', level='foo'), |
| 397 | + columns='Buyer', values='Quantity', aggfunc=np.sum)) |
| 398 | + self.assertRaises(ValueError, lambda : pivot_table(df, index='Buyer', |
| 399 | + columns=Grouper(freq='6MS', level='foo'), values='Quantity', aggfunc=np.sum)) |
| 400 | + |
| 401 | + # double grouper |
| 402 | + df = DataFrame({ |
| 403 | + 'Branch' : 'A A A A A A A B'.split(), |
| 404 | + 'Buyer': 'Carl Mark Carl Carl Joe Joe Joe Carl'.split(), |
| 405 | + 'Quantity': [1,3,5,1,8,1,9,3], |
| 406 | + 'Date' : [datetime.datetime(2013,11,1,13,0), datetime.datetime(2013,9,1,13,5), |
| 407 | + datetime.datetime(2013,10,1,20,0), datetime.datetime(2013,10,2,10,0), |
| 408 | + datetime.datetime(2013,11,1,20,0), datetime.datetime(2013,10,2,10,0), |
| 409 | + datetime.datetime(2013,10,2,12,0), datetime.datetime(2013,12,5,14,0)], |
| 410 | + 'PayDay' : [datetime.datetime(2013,10,4,0,0), datetime.datetime(2013,10,15,13,5), |
| 411 | + datetime.datetime(2013,9,5,20,0), datetime.datetime(2013,11,2,10,0), |
| 412 | + datetime.datetime(2013,10,7,20,0), datetime.datetime(2013,9,5,10,0), |
| 413 | + datetime.datetime(2013,12,30,12,0), datetime.datetime(2013,11,20,14,0),]}) |
| 414 | + |
| 415 | + result = pivot_table(df, index=Grouper(freq='M', key='Date'), |
| 416 | + columns=Grouper(freq='M', key='PayDay'), |
| 417 | + values='Quantity', aggfunc=np.sum) |
| 418 | + expected = DataFrame(np.array([np.nan, 3, np.nan, np.nan, 6, np.nan, 1, 9, |
| 419 | + np.nan, 9, np.nan, np.nan, np.nan, np.nan, 3, np.nan]).reshape(4, 4), |
| 420 | + index=[datetime.datetime(2013, 9, 30), datetime.datetime(2013, 10, 31), |
| 421 | + datetime.datetime(2013, 11, 30), datetime.datetime(2013, 12, 31)], |
| 422 | + columns=[datetime.datetime(2013, 9, 30), datetime.datetime(2013, 10, 31), |
| 423 | + datetime.datetime(2013, 11, 30), datetime.datetime(2013, 12, 31)]) |
| 424 | + expected.index.name = 'Date' |
| 425 | + expected.columns.name = 'PayDay' |
| 426 | + |
| 427 | + tm.assert_frame_equal(result, expected) |
| 428 | + |
| 429 | + result = pivot_table(df, index=Grouper(freq='M', key='PayDay'), |
| 430 | + columns=Grouper(freq='M', key='Date'), |
| 431 | + values='Quantity', aggfunc=np.sum) |
| 432 | + tm.assert_frame_equal(result, expected.T) |
| 433 | + |
| 434 | + tuples = [(datetime.datetime(2013, 9, 30), datetime.datetime(2013, 10, 31)), |
| 435 | + (datetime.datetime(2013, 10, 31), datetime.datetime(2013, 9, 30)), |
| 436 | + (datetime.datetime(2013, 10, 31), datetime.datetime(2013, 11, 30)), |
| 437 | + (datetime.datetime(2013, 10, 31), datetime.datetime(2013, 12, 31)), |
| 438 | + (datetime.datetime(2013, 11, 30), datetime.datetime(2013, 10, 31)), |
| 439 | + (datetime.datetime(2013, 12, 31), datetime.datetime(2013, 11, 30)),] |
| 440 | + idx = MultiIndex.from_tuples(tuples, names=['Date', 'PayDay']) |
| 441 | + expected = DataFrame(np.array([3, np.nan, 6, np.nan, 1, np.nan, |
| 442 | + 9, np.nan, 9, np.nan, np.nan, 3]).reshape(6, 2), |
| 443 | + index=idx, columns=['A', 'B']) |
| 444 | + expected.columns.name = 'Branch' |
| 445 | + |
| 446 | + result = pivot_table(df, index=[Grouper(freq='M', key='Date'), |
| 447 | + Grouper(freq='M', key='PayDay')], columns=['Branch'], |
| 448 | + values='Quantity', aggfunc=np.sum) |
| 449 | + tm.assert_frame_equal(result, expected) |
| 450 | + |
| 451 | + result = pivot_table(df, index=['Branch'], columns=[Grouper(freq='M', key='Date'), |
| 452 | + Grouper(freq='M', key='PayDay')], |
| 453 | + values='Quantity', aggfunc=np.sum) |
| 454 | + tm.assert_frame_equal(result, expected.T) |
336 | 455 |
|
337 | 456 | class TestCrosstab(tm.TestCase):
|
338 | 457 |
|
|
0 commit comments