Closed jasonebox closed 1 year ago
I understand from PAJW that the effort to apply manual filters to QC data is a TBD.
So, I think it helps to share that I'm using BAV's GC-Net filter procedures on my l3 and tx data deliveries to DMI for CARRA-TU.
Idea here is since I have already done the work of tuning and applying said filters, the parameters my code outputs via the function quoted below are by-design in precisely the format used by BAV to apply filters in https://github.com/GEUS-Glaciology-and-Climate/GC-Net-level-1-data-processing
here is my code that specifies (manually) applies and outputs the filter parameters and below I paste my function in that code I've used.
# ----------------------------------------------------------- adjuster routine # jason box # procedure with different filter functions # counts cases rejected by filters # outputs filter to a format that is compatible for GC-Net-level-1-data-processing/GC-Net-level-1-data-processing.py def adjuster(site,df,var_list,y0,m0,d0,func,y1,m1,d1,comment,val): tstring='%Y-%m-%dT%H:%M:%S'+'+00:00' df_out = df.copy() t0=datetime(y0,m0,d0) t1=datetime(y1,m1,d1) # two variables required for abs_diff if func == 'abs_diff': tmp0=df_out.loc[t0:t1,var_list[0]].values tmp1=df_out.loc[t0:t1,var_list[1]].values tmp = df_out.loc[t0:t1,var_list[1]].values-df_out.loc[t0:t1,var_list[0]].values count=sum(abs(tmp)>val) tmp0[abs(tmp)>val] = np.nan tmp1[abs(tmp)>val] = np.nan df_out.loc[t0:t1,var_list[0]] = tmp0 df_out.loc[t0:t1,var_list[1]] = tmp1 if func == "rotate": df_out.loc[t0:t1, var_list[0]] = df_out.loc[t0:t1, var_list[0]].values + val df_out.loc[t0:t1, var_list[0]][df_out.loc[t0:t1, var_list[0]] > 360] = ( df_out.loc[t0:t1, var_list[0]] - 360 ) count=len(df_out.loc[t0:t1]) if func == 'abs_diff_del_instrument_2': tmp0=df_out.loc[t0:t1,var_list[0]].values tmp1=df_out.loc[t0:t1,var_list[1]].values tmp = df_out.loc[t0:t1,var_list[1]].values-df_out.loc[t0:t1,var_list[0]].values count=sum(abs(tmp)>val) # tmp0[abs(tmp)>val] = np.nan tmp1[abs(tmp)>val] = np.nan # df_out.loc[t0:t1,var_list[0]] = tmp0 df_out.loc[t0:t1,var_list[1]] = tmp1 if func == 'swap': val_var = df_out.loc[t0:t1,var_list[0]].values.copy() val_var2 = df_out.loc[t0:t1,var_list[1]].values.copy() df_out.loc[t0:t1,var_list[1]] = val_var df_out.loc[t0:t1,var_list[0]] = val_var2 count=len(df_out.loc[t0:t1,var_list[1]]) for var in var_list: # set to nan stuck values if func == 'nan_constant': tmp = df_out.loc[t0:t1,var] count=sum(tmp.diff()==0) tmp[tmp.diff()==0]=np.nan df_out.loc[t0:t1,var] = tmp if func == 'min_filter': tmp = df_out.loc[t0:t1,var].values count=sum(tmp<val) tmp[tmp<val] = np.nan df_out.loc[t0:t1,var] = tmp if func == 'nan_var': tmp = df_out.loc[t0:t1,var].values count=len(tmp) tmp[:] = np.nan df_out.loc[t0:t1,var] = tmp if func == 'max_filter': tmp = df_out.loc[t0:t1,var].values count=sum(tmp>val) tmp[tmp>val] = np.nan df_out.loc[t0:t1,var] = tmp # if 'swap_with_' in func: # var2 = func[10:] # val_var = df_out.loc[t0:t1,var].values.copy() # val_var2 = df_out.loc[t0:t1,var2].values.copy() # df_out.loc[t0:t1,var2] = val_var # df_out.loc[t0:t1,var] = val_var2 msg=datetime(y0,m0,d0).strftime(tstring)+\ ','+datetime(y1,m1,d1).strftime(tstring)+\ ','+var+','+func+','+str(val)+','+comment+','+str(count) # print(msg) # dfx=pd.read_csv('/Users/jason/Dropbox/AWS/GCNET/GC-Net-level-1-data-processing/metadata/adjustments/'+site+'.csv') # print(dfx) wo=1 if wo: opath_adjustments='./metadata/adjustments/'+site+'/' os.system('mkdir -p '+opath_adjustments) out_fn=opath_adjustments+var+'_'+func+'_'+datetime(y0,m0,d0).strftime('%Y-%m-%d')+'_'+datetime(y1,m1,d1).strftime('%Y-%m-%d')+'.csv' out_concept=open(out_fn,'w') out_concept.write('t0,t1,variable,adjust_function,adjust_value,comment,count\n') out_concept.write(msg) out_concept.close() return(df_out) # ----------------------------------------------------------- end adjuster routine
This issue could be moved to pypromice issues since it is not actually a data issue.
I'm closing this here because it is discussed here and there.
We'll use your scripts to populate the flag csv files.
I understand from PAJW that the effort to apply manual filters to QC data is a TBD.
So, I think it helps to share that I'm using BAV's GC-Net filter procedures on my l3 and tx data deliveries to DMI for CARRA-TU.
Idea here is since I have already done the work of tuning and applying said filters, the parameters my code outputs via the function quoted below are by-design in precisely the format used by BAV to apply filters in https://github.com/GEUS-Glaciology-and-Climate/GC-Net-level-1-data-processing
here is my code that specifies (manually) applies and outputs the filter parameters and below I paste my function in that code I've used.