1919 'ISOSpeedRatings' , 'SceneType'
2020]
2121
22+ YEAR_KEY = "__year__"
23+
24+ DATETIME_COL = "DateTime"
25+
26+ MAKE_COL = 'Make'
27+
2228
2329class ImageFolderView (ModelView ):
2430 """ ModelView for an image folder object.
@@ -30,6 +36,10 @@ class ImageFolderView(ModelView):
3036 # Filters widgets
3137 view_filter_controls = Bool
3238
39+ # Copy of the model's data, with filtering columns added if missing
40+ all_data = Instance (pd .DataFrame )
41+
42+ # Filtered dataframe based on filtering widgets
3343 filtered_data = Instance (pd .DataFrame )
3444
3545 year_mask = Instance (pd .Series )
@@ -82,21 +92,22 @@ def traits_view(self):
8292 @observe ("scan" )
8393 def scan_for_faces (self , event ):
8494 self .model .compute_num_faces ()
95+ self .all_data = self .model .data .copy ()
8596
8697 @observe ("selected_years" )
8798 def update_years (self , event ):
88- self .year_mask = self .model . data [ 'Year' ].isin (self .selected_years )
99+ self .year_mask = self .all_data [ YEAR_KEY ].isin (self .selected_years )
89100
90101 @observe ("selected_make" )
91102 def update_make (self , event ):
92103 if self .selected_make == "All" :
93104 self .make_mask = pd .Series ([True ] * len (self .model .data ))
94105 else :
95- self .make_mask = self .model . data [ 'Make' ] == self .selected_make
106+ self .make_mask = self .all_data [ MAKE_COL ] == self .selected_make
96107
97- @observe ("year_mask, make_mask" )
108+ @observe ("year_mask, make_mask, all_data " )
98109 def update_filtered_data (self , event ):
99- self .filtered_data = self .model . data [self .year_mask & self .make_mask ]
110+ self .filtered_data = self .all_data [self .year_mask & self .make_mask ]
100111
101112 # Initialization methods --------------------------------------------------
102113
@@ -106,15 +117,25 @@ def _make_mask_default(self):
106117 def _year_mask_default (self ):
107118 return pd .Series (np .ones (len (self .model .data ), dtype = bool ))
108119
120+ def _all_data_default (self ):
121+ data = self .model .data .copy ()
122+ if DATETIME_COL not in data .columns :
123+ data [DATETIME_COL ] = np .nan
124+
125+ if MAKE_COL not in data .columns :
126+ data [MAKE_COL ] = np .nan
127+
128+ return data
129+
109130 def _filtered_data_default (self ):
110- return self .model . data
131+ return self .all_data
111132
112133 def _all_years_default (self ):
113134 def parse_year (x ):
114135 return x .split (":" )[0 ] if isinstance (x , str ) else "unknown"
115136
116- self .model . data [ 'Year' ] = self .model . data ['DateTime' ].apply (parse_year )
117- return sorted (self .model . data [ 'Year' ].unique ().tolist ())
137+ self .all_data [ YEAR_KEY ] = self .all_data ['DateTime' ].apply (parse_year )
138+ return sorted (self .all_data [ YEAR_KEY ].unique ().tolist ())
118139
119140
120141if __name__ == '__main__' :
0 commit comments