Skip to content

Commit a44c304

Browse files
committed
Merge pull request #6747 from dalejung/quick_shift_fixes
Quick shift fixes
2 parents 73506cb + 3a4e770 commit a44c304

File tree

3 files changed

+28
-9
lines changed

3 files changed

+28
-9
lines changed

pandas/core/generic.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -3238,9 +3238,9 @@ def shift(self, periods=1, freq=None, axis=0, **kwds):
32383238
if periods == 0:
32393239
return self
32403240

3241-
axis = self._get_axis_number(axis)
3241+
block_axis = self._get_block_manager_axis(axis)
32423242
if freq is None and not len(kwds):
3243-
new_data = self._data.shift(periods=periods, axis=axis)
3243+
new_data = self._data.shift(periods=periods, axis=block_axis)
32443244
else:
32453245
return self.tshift(periods, freq, **kwds)
32463246

pandas/core/internals.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -966,15 +966,24 @@ def shift(self, periods, axis=0):
966966
# convert integer to float if necessary. need to do a lot more than
967967
# that, handle boolean etc also
968968
new_values, fill_value = com._maybe_upcast(self.values)
969-
new_values = np.roll(new_values.T,periods,axis=axis)
969+
# make sure array sent to np.roll is c_contiguous
970+
f_ordered = new_values.flags.f_contiguous
971+
if f_ordered:
972+
new_values = new_values.T
973+
axis = new_values.ndim - axis - 1
974+
new_values = np.roll(new_values, periods, axis=axis)
970975
axis_indexer = [ slice(None) ] * self.ndim
971976
if periods > 0:
972977
axis_indexer[axis] = slice(None,periods)
973978
else:
974979
axis_indexer[axis] = slice(periods,None)
975980
new_values[tuple(axis_indexer)] = fill_value
976981

977-
return [make_block(new_values.T, self.items, self.ref_items,
982+
# restore original order
983+
if f_ordered:
984+
new_values = new_values.T
985+
986+
return [make_block(new_values, self.items, self.ref_items,
978987
ndim=self.ndim, fastpath=True)]
979988

980989
def eval(self, func, other, raise_on_error=True, try_cast=False):

vb_suite/frame_methods.py

+15-5
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ def test_equal(name):
386386
def test_unequal(name):
387387
df, df2 = pairs[name]
388388
return df.equals(df2)
389-
389+
390390
float_df = DataFrame(np.random.randn(1000, 1000))
391391
object_df = DataFrame([['foo']*1000]*1000)
392392
nonunique_cols = object_df.copy()
@@ -434,11 +434,21 @@ def test_unequal(name):
434434
# frame shift speedup issue-5609
435435

436436
setup = common_setup + """
437-
df = pd.DataFrame(np.random.rand(10000,500))
437+
df = DataFrame(np.random.rand(10000,500))
438+
# note: df._data.blocks are f_contigous
438439
"""
439440
frame_shift_axis0 = Benchmark('df.shift(1,axis=0)', setup,
440-
name = 'frame_shift_axis_0',
441441
start_date=datetime(2014,1,1))
442442
frame_shift_axis1 = Benchmark('df.shift(1,axis=1)', setup,
443-
name = 'frame_shift_axis_1',
444-
start_date=datetime(2014,1,1))
443+
start_date=datetime(2014,1,1))
444+
445+
#
446+
setup = common_setup + """
447+
df = DataFrame(np.random.rand(10000,500))
448+
df = df.consolidate()
449+
# note: df._data.blocks are c_contigous
450+
"""
451+
frame_shift_c_order_axis0 = Benchmark('df.shift(1,axis=0)', setup,
452+
start_date=datetime(2014,1,1))
453+
frame_shift_c_order_axis1 = Benchmark('df.shift(1,axis=1)', setup,
454+
start_date=datetime(2014,1,1))

0 commit comments

Comments
 (0)