@@ -90,7 +90,7 @@ def f(self, other):
90
90
'done with scalar values' )
91
91
92
92
return self ._combine (other , func )
93
-
93
+ f . __name__ = name
94
94
return f
95
95
96
96
def _panel_arith_method (op , name ):
@@ -1160,78 +1160,21 @@ def _get_join_index(self, other, how):
1160
1160
WidePanel = Panel
1161
1161
LongPanel = DataFrame
1162
1162
1163
- def panel_is_consistent (panel ):
1164
- offset = max (len (panel .major_axis ), len (panel .minor_axis ))
1165
- major_labels = panel .major_labels .astype ('i8' )
1166
- minor_labels = panel .minor_labels .astype ('i8' )
1167
- keys = major_labels * offset + minor_labels
1168
- unique_keys = np .unique (keys )
1169
-
1170
- if len (unique_keys ) < len (keys ):
1171
- return False
1172
-
1173
- return True
1174
-
1175
- def long_to_wide (lp ):
1176
- """
1177
- Transform long (stacked) format into wide format
1178
-
1179
- Returns
1180
- -------
1181
- Panel
1182
- """
1183
- assert (lp .consistent )
1184
- mask = make_mask (lp .index )
1185
- if lp ._data .is_mixed_dtype ():
1186
- return _to_wide_mixed (lp , mask )
1187
- else :
1188
- return _to_wide_homogeneous (lp , mask )
1189
-
1190
- def _to_wide_homogeneous (lp , mask ):
1191
- shape = _wide_shape (lp )
1192
- values = np .empty (shape , dtype = lp .values .dtype )
1193
-
1194
- if not issubclass (lp .values .dtype .type , np .integer ):
1195
- values .fill (np .nan )
1196
-
1197
- for i in xrange (len (lp .items )):
1198
- values [i ].flat [mask ] = lp .values [:, i ]
1199
-
1200
- return Panel (values , lp .items , lp .major_axis , lp .minor_axis )
1201
-
1202
- def _to_wide_mixed (lp , mask ):
1203
- _ , N , K = _wide_shape (lp )
1204
-
1205
- # TODO: make much more efficient
1206
-
1207
- data = {}
1208
- for i , item in enumerate (lp .items ):
1209
- item_vals = lp [item ].values
1210
-
1211
- values = np .empty ((N , K ), dtype = item_vals .dtype )
1212
- values .ravel ()[mask ] = item_vals
1213
- data [item ] = DataFrame (values , index = lp .major_axis ,
1214
- columns = lp .minor_axis )
1215
- return Panel .from_dict (data )
1216
-
1217
- def _wide_shape (lp ):
1218
- return (len (lp .columns ), len (lp .index .levels [0 ]), len (lp .index .levels [1 ]))
1219
-
1220
1163
def long_swapaxes (frame ):
1221
1164
"""
1222
1165
Swap major and minor axes and reorder values to be grouped by
1223
1166
minor axis values
1224
1167
1225
1168
Returns
1226
1169
-------
1227
- LongPanel (new object)
1170
+ DataFrame (new object)
1228
1171
"""
1229
1172
return frame .swaplevel (0 , 1 , axis = 0 )
1230
1173
1231
1174
1232
1175
def long_truncate (lp , before = None , after = None ):
1233
1176
"""
1234
- Slice panel between two major axis values, return complete LongPanel
1177
+ Slice panel between two major axis values, return complete DataFrame
1235
1178
1236
1179
Parameters
1237
1180
----------
@@ -1242,7 +1185,7 @@ def long_truncate(lp, before=None, after=None):
1242
1185
1243
1186
Returns
1244
1187
-------
1245
- LongPanel
1188
+ DataFrame
1246
1189
"""
1247
1190
left , right = lp .index .slice_locs (before , after )
1248
1191
new_index = lp .index .truncate (before , after )
@@ -1260,13 +1203,11 @@ def long_apply(lp, f, axis='major', broadcast=False):
1260
1203
f : function
1261
1204
NumPy function to apply to each group
1262
1205
axis : {'major', 'minor'}
1263
-
1264
1206
broadcast : boolean
1265
1207
1266
1208
Returns
1267
1209
-------
1268
- broadcast=True -> LongPanel
1269
- broadcast=False -> DataFrame
1210
+ applied : DataFrame
1270
1211
"""
1271
1212
try :
1272
1213
return lp ._apply_level (f , axis = axis , broadcast = broadcast )
@@ -1278,8 +1219,8 @@ def long_apply(lp, f, axis='major', broadcast=False):
1278
1219
1279
1220
def make_dummies (frame , item ):
1280
1221
"""
1281
- Use unique values in column of panel to construct LongPanel
1282
- containing dummy
1222
+ Use unique values in column of panel to construct DataFrame containing
1223
+ dummy variables in the columns (constructed from the unique values)
1283
1224
1284
1225
Parameters
1285
1226
----------
@@ -1288,15 +1229,15 @@ def make_dummies(frame, item):
1288
1229
1289
1230
Returns
1290
1231
-------
1291
- LongPanel
1232
+ dummies : DataFrame
1292
1233
"""
1293
1234
from pandas import Factor
1294
1235
factor = Factor (frame [item ].values )
1295
1236
values = np .eye (len (factor .levels ))
1296
1237
dummy_mat = values .take (factor .labels , axis = 0 )
1297
1238
return DataFrame (dummy_mat , columns = factor .levels , index = frame .index )
1298
1239
1299
- def make_axis_dummies (frame , axis = 'minor' ):
1240
+ def make_axis_dummies (frame , axis = 'minor' , transform = None ):
1300
1241
"""
1301
1242
Construct 1-0 dummy variables corresponding to designated axis
1302
1243
labels
@@ -1308,19 +1249,27 @@ def make_axis_dummies(frame, axis='minor'):
1308
1249
Function to apply to axis labels first. For example, to
1309
1250
get "day of week" dummies in a time series regression you might
1310
1251
call:
1311
- panel.get_axis_dummies( axis='major',
1312
- transform=lambda d: d.weekday())
1252
+ make_axis_dummies(panel, axis='major',
1253
+ transform=lambda d: d.weekday())
1313
1254
Returns
1314
1255
-------
1315
- LongPanel, item names taken from chosen axis
1256
+ dummies : DataFrame
1257
+ Column names taken from chosen axis
1316
1258
"""
1317
1259
numbers = {
1318
1260
'major' : 0 ,
1319
1261
'minor' : 1
1320
1262
}
1321
1263
num = numbers .get (axis , axis )
1264
+
1322
1265
items = frame .index .levels [num ]
1323
1266
labels = frame .index .labels [num ]
1267
+ if transform is not None :
1268
+ mapped_items = items .map (transform )
1269
+ factor = Factor (mapped_items .take (labels ))
1270
+ labels = factor .labels
1271
+ items = factor .levels
1272
+
1324
1273
values = np .eye (len (items ), dtype = float )
1325
1274
values = values .take (labels , axis = 0 )
1326
1275
@@ -1407,16 +1356,5 @@ def _get_distinct_indexes(indexes):
1407
1356
indexes = sorted (indexes , key = id )
1408
1357
return [gp .next () for _ , gp in groupby (indexes , id )]
1409
1358
1410
- def make_mask (index ):
1411
- """
1412
- Create observation selection vector using major and minor
1413
- labels, for converting to wide format.
1414
- """
1415
- N , K = index .levshape
1416
- selector = index .labels [1 ] + K * index .labels [0 ]
1417
- mask = np .zeros (N * K , dtype = bool )
1418
- mask .put (selector , True )
1419
- return mask
1420
-
1421
1359
def _monotonic (arr ):
1422
1360
return not (arr [1 :] < arr [:- 1 ]).any ()
0 commit comments