@@ -450,20 +450,30 @@ def test_agg(self):
450
450
('r2' , 'B' , 'sum' )])
451
451
452
452
def test_agg_misc (self ):
453
- # test with both a Resampler and a TimeGrouper
453
+ # test with all three Resampler apis and TimeGrouper
454
454
455
455
np .random .seed (1234 )
456
456
df = pd .DataFrame (np .random .rand (10 , 2 ),
457
457
columns = list ('AB' ),
458
458
index = pd .date_range ('2010-01-01 09:00:00' ,
459
459
periods = 10 ,
460
- freq = 's' ))
460
+ freq = 's' ,
461
+ name = 'date' ))
462
+ df_col = df .reset_index ()
463
+ df_mult = df_col .copy ()
464
+ df_mult .index = pd .MultiIndex .from_arrays ([range (10 ), df .index ],
465
+ names = ['index' , 'date' ])
461
466
462
467
r = df .resample ('2s' )
463
- g = df .groupby (pd .Grouper (freq = '2s' ))
468
+ cases = [
469
+ r ,
470
+ df_col .resample ('2s' , on = 'date' ),
471
+ df_mult .resample ('2s' , level = 'date' ),
472
+ df .groupby (pd .Grouper (freq = '2s' ))
473
+ ]
464
474
465
475
# passed lambda
466
- for t in [ r , g ] :
476
+ for t in cases :
467
477
result = t .agg ({'A' : np .sum ,
468
478
'B' : lambda x : np .std (x , ddof = 1 )})
469
479
rcustom = t ['B' ].apply (lambda x : np .std (x , ddof = 1 ))
@@ -480,7 +490,7 @@ def test_agg_misc(self):
480
490
('result1' , 'B' ),
481
491
('result2' , 'A' ),
482
492
('result2' , 'B' )])
483
- for t in [ r , g ] :
493
+ for t in cases :
484
494
result = t [['A' , 'B' ]].agg (OrderedDict ([('result1' , np .sum ),
485
495
('result2' , np .mean )]))
486
496
assert_frame_equal (result , expected , check_like = True )
@@ -495,19 +505,19 @@ def test_agg_misc(self):
495
505
('A' , 'std' ),
496
506
('B' , 'mean' ),
497
507
('B' , 'std' )])
498
- for t in [ r , g ] :
508
+ for t in cases :
499
509
result = t .agg (OrderedDict ([('A' , ['sum' , 'std' ]),
500
510
('B' , ['mean' , 'std' ])]))
501
511
assert_frame_equal (result , expected , check_like = True )
502
512
503
513
# equivalent of using a selection list / or not
504
- for t in [ r , g ] :
505
- result = g [['A' , 'B' ]].agg ({'A' : ['sum' , 'std' ],
514
+ for t in cases :
515
+ result = t [['A' , 'B' ]].agg ({'A' : ['sum' , 'std' ],
506
516
'B' : ['mean' , 'std' ]})
507
517
assert_frame_equal (result , expected , check_like = True )
508
518
509
519
# series like aggs
510
- for t in [ r , g ] :
520
+ for t in cases :
511
521
result = t ['A' ].agg ({'A' : ['sum' , 'std' ]})
512
522
expected = pd .concat ([t ['A' ].sum (),
513
523
t ['A' ].std ()],
@@ -528,9 +538,9 @@ def test_agg_misc(self):
528
538
529
539
# errors
530
540
# invalid names in the agg specification
531
- for t in [ r , g ] :
541
+ for t in cases :
532
542
def f ():
533
- r [['A' ]].agg ({'A' : ['sum' , 'std' ],
543
+ t [['A' ]].agg ({'A' : ['sum' , 'std' ],
534
544
'B' : ['mean' , 'std' ]})
535
545
536
546
self .assertRaises (SpecificationError , f )
@@ -581,6 +591,36 @@ def test_agg_consistency(self):
581
591
result = r .agg ({'r1' : 'mean' , 'r2' : 'sum' })
582
592
assert_frame_equal (result , expected )
583
593
594
+ def test_api_validation (self ):
595
+ # GH 13500
596
+ dates = pd .date_range ('2015-01-01' , freq = 'W' , periods = 10 )
597
+ df = pd .DataFrame ({'date' : dates ,
598
+ 'a' : np .arange (10 , dtype = 'int64' )},
599
+ index = pd .MultiIndex .from_arrays ([
600
+ np .arange (10 ),
601
+ dates ], names = ['v' , 'd' ]))
602
+
603
+ exp_index = pd .date_range ('2015-01-31' , periods = 3 ,
604
+ freq = 'M' , name = 'date' )
605
+ expected = pd .DataFrame ({'a' : [6 , 22 , 17 ]},
606
+ index = exp_index )
607
+
608
+ actual = df .resample ('M' , on = 'date' ).sum ()
609
+ assert_frame_equal (actual , expected )
610
+
611
+ actual = df .resample ('M' , level = 'd' ).sum ()
612
+ expected .index .name = 'd'
613
+ assert_frame_equal (actual , expected )
614
+
615
+ with tm .assertRaises (ValueError ):
616
+ df .resample ('M' , on = 'date' , level = 'd' )
617
+
618
+ with tm .assertRaises (ValueError ):
619
+ df .resample ('M' , on = ['a' , 'date' ])
620
+
621
+ with tm .assertRaises (ValueError ):
622
+ df .resample ('M' , level = ['a' , 'date' ])
623
+
584
624
585
625
class Base (object ):
586
626
"""
0 commit comments