@@ -90,7 +90,7 @@ def f(self, other):
9090 'done with scalar values' )
9191
9292 return self ._combine (other , func )
93-
93+ f . __name__ = name
9494 return f
9595
9696def _panel_arith_method (op , name ):
@@ -1160,78 +1160,21 @@ def _get_join_index(self, other, how):
11601160WidePanel = Panel
11611161LongPanel = DataFrame
11621162
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-
12201163def long_swapaxes (frame ):
12211164 """
12221165 Swap major and minor axes and reorder values to be grouped by
12231166 minor axis values
12241167
12251168 Returns
12261169 -------
1227- LongPanel (new object)
1170+ DataFrame (new object)
12281171 """
12291172 return frame .swaplevel (0 , 1 , axis = 0 )
12301173
12311174
12321175def long_truncate (lp , before = None , after = None ):
12331176 """
1234- Slice panel between two major axis values, return complete LongPanel
1177+ Slice panel between two major axis values, return complete DataFrame
12351178
12361179 Parameters
12371180 ----------
@@ -1242,7 +1185,7 @@ def long_truncate(lp, before=None, after=None):
12421185
12431186 Returns
12441187 -------
1245- LongPanel
1188+ DataFrame
12461189 """
12471190 left , right = lp .index .slice_locs (before , after )
12481191 new_index = lp .index .truncate (before , after )
@@ -1260,13 +1203,11 @@ def long_apply(lp, f, axis='major', broadcast=False):
12601203 f : function
12611204 NumPy function to apply to each group
12621205 axis : {'major', 'minor'}
1263-
12641206 broadcast : boolean
12651207
12661208 Returns
12671209 -------
1268- broadcast=True -> LongPanel
1269- broadcast=False -> DataFrame
1210+ applied : DataFrame
12701211 """
12711212 try :
12721213 return lp ._apply_level (f , axis = axis , broadcast = broadcast )
@@ -1278,8 +1219,8 @@ def long_apply(lp, f, axis='major', broadcast=False):
12781219
12791220def make_dummies (frame , item ):
12801221 """
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)
12831224
12841225 Parameters
12851226 ----------
@@ -1288,15 +1229,15 @@ def make_dummies(frame, item):
12881229
12891230 Returns
12901231 -------
1291- LongPanel
1232+ dummies : DataFrame
12921233 """
12931234 from pandas import Factor
12941235 factor = Factor (frame [item ].values )
12951236 values = np .eye (len (factor .levels ))
12961237 dummy_mat = values .take (factor .labels , axis = 0 )
12971238 return DataFrame (dummy_mat , columns = factor .levels , index = frame .index )
12981239
1299- def make_axis_dummies (frame , axis = 'minor' ):
1240+ def make_axis_dummies (frame , axis = 'minor' , transform = None ):
13001241 """
13011242 Construct 1-0 dummy variables corresponding to designated axis
13021243 labels
@@ -1308,19 +1249,27 @@ def make_axis_dummies(frame, axis='minor'):
13081249 Function to apply to axis labels first. For example, to
13091250 get "day of week" dummies in a time series regression you might
13101251 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())
13131254 Returns
13141255 -------
1315- LongPanel, item names taken from chosen axis
1256+ dummies : DataFrame
1257+ Column names taken from chosen axis
13161258 """
13171259 numbers = {
13181260 'major' : 0 ,
13191261 'minor' : 1
13201262 }
13211263 num = numbers .get (axis , axis )
1264+
13221265 items = frame .index .levels [num ]
13231266 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+
13241273 values = np .eye (len (items ), dtype = float )
13251274 values = values .take (labels , axis = 0 )
13261275
@@ -1407,16 +1356,5 @@ def _get_distinct_indexes(indexes):
14071356 indexes = sorted (indexes , key = id )
14081357 return [gp .next () for _ , gp in groupby (indexes , id )]
14091358
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-
14211359def _monotonic (arr ):
14221360 return not (arr [1 :] < arr [:- 1 ]).any ()
0 commit comments