Beispiel #1
0
def set_min_max_dates(initial):
    sd = '9999-99-99';ed = '9999-99-99'
    sd_fut = sd; ed_fut = ed
    data_type = 'station'
    if 'location' in initial.keys():
        data_type = 'grid'
    if initial['app_name'] in ['monthly_spatial_summary', 'temporal_summary']:
        data_type = 'grid'
    if 'data_type' in initial.keys() and initial['data_type'] == 'grid':
        data_type = 'grid'
    if 'station_id' in initial.keys():
        stn_json = settings.MEDIA_DIR + '/json/US_station_id.json'
        stn_id, stn_name = WRCCUtils.find_id_and_name(initial['station_id'],stn_json)
        els = []
        if 'variable' in initial.keys():
            els = [initial['variable']]
        if 'variables' in initial.keys():
            els = initial['variables']
        vd, no_vd_els = WRCCUtils.find_valid_daterange(stn_id,el_list=els,max_or_min='min')
        sd = vd[0];ed = vd[1]
        #sd_fut =  sd;ed_fut = ed
    elif data_type == 'grid':
        sd = WRCCData.GRID_CHOICES[str(initial['grid'])][3][0][0]
        #ed = WRCCUtils.advance_date(sd,10*365,'forward')
        ed = WRCCData.GRID_CHOICES[str(initial['grid'])][3][0][1]
        #sd_fut =  sd;ed_fut = ed
        if len(WRCCData.GRID_CHOICES[initial['grid']][3]) == 2:
            sd_fut = WRCCData.GRID_CHOICES[initial['grid']][3][1][0]
            #ed_fut = WRCCUtils.advance_date(sd,10*365,'forward')
            ed_fut = WRCCData.GRID_CHOICES[initial['grid']][3][1][1]
    else:
        if 'data_type' in initial.keys() and initial['data_type'] == 'station':
            sd = '1850-01-01'
            ed = today
    return sd, ed, sd_fut, ed_fut
Beispiel #2
0
def set_min_max_dates(initial):
    sd = '9999-99-99';ed = '9999-99-99'
    sd_fut = sd; ed_fut = ed
    if 'station_id' in initial.keys():
        stn_json = settings.MEDIA_DIR + '/json/US_station_id.json'
        stn_id, stn_name = WRCCUtils.find_id_and_name(initial['station_id'],stn_json)
        els = []
        if 'element' in initial.keys():
            els = [initial['element']]
            if initial['element'] in ['dtr','pet']:els = ['maxt','mint']
        if 'elements' in initial.keys():
            els = initial['elements']
            if 'dtr' in els and 'maxt' not in els:
                els.append('maxt')
            if 'dtr' in els and 'mint' not in els:
                els.append('mint')
            if 'dtr' in els and 'maxt' not in els:
                els.append('maxt')
            if 'dtr' in els and 'mint' not in els:
                els.append('mint')

        vd = WRCCUtils.find_valid_daterange(stn_id,el_list=els,max_or_min='min')
        if vd and len(vd) >=1:sd = vd[0]
        if vd and len(vd) >1:ed = vd[1]
        sd_fut =  sd;ed_fut = ed
    if 'location' in initial.keys() or initial['app_name'] == 'monthly_spatial_summary':
        sd = WRCCData.GRID_CHOICES[str(initial['grid'])][3][0][0]
        ed = WRCCData.GRID_CHOICES[str(initial['grid'])][3][0][1]
        sd_fut =  sd;ed_fut = ed
        if len(WRCCData.GRID_CHOICES[initial['grid']][3]) == 2:
            sd_fut = WRCCData.GRID_CHOICES[initial['grid']][3][1][0]
            ed_fut = WRCCData.GRID_CHOICES[initial['grid']][3][1][1]
    return sd, ed, sd_fut, ed_fut
Beispiel #3
0
def set_wrapper_params(stn_id):
    '''
    yesterday = WRCCUtils.set_back_date(1)
    w_params = [stn_id, 'all','18000101',yesterday]
    '''
    vd = WRCCUtils.find_valid_daterange(stn_id)
    if len(vd) == 2 and vd[0] and vd[1]:
        return [stn_id, 'all',vd[0],vd[1]]
    return []
Beispiel #4
0
def set_form(request, clean=True):
    '''
    Coverts request input to usable form input:
    Deals with unicode issues
    and autofill options for identifiers
    NOTE: elements should always be a list (also when clean = False)
    If Clean == True,
    We also clean up some form fields for submission:
        date fields, convert to yyyymmdd
        window fields, convert to mmdd
        name strings are converted to ids
        Combine elemenst weith degree days
    '''
    try:
        req_method = request.method
    except:
        if isinstance(request,dict):
            req_method = 'dict'
        else:req_method = None
    form= {}
    form['req_method'] = req_method
    #Convert request object to python dictionary
    if req_method == 'dict':
        form = copy.deepcopy(request)
        #Special case elements, always needs to be list
        if 'element' in request.keys() and not 'elements' in request.keys():
            form['elements'] = [form['element']]
        if 'elements' in request.keys():
            form['elements'] = WRCCUtils.convert_elements_to_list(request['elements'])
    elif req_method == 'POST':
        for key, val in request.POST.items():
            form[str(key)]= val
        #form = dict((str(x),str(y)) for x,y in request.POST.items())
        #Special case elements, always needs to be list
        if 'element' in request.POST.keys() and not 'elements' in request.POST.keys():
            form['elements'] = [str(request.POST['element'])]
        if 'elements' in request.POST.keys():
            #form['elements'] = WRCCUtils.convert_elements_to_list(request.POST['elements'])
            els = request.POST.getlist('elements',request.POST.get('elements','').split(','))
            form['elements'] = [str(el) for el in els]
        if 'metadata_keys' in request.POST.keys():
            form['metadata_keys'] = request.POST.getlist('metadata_keys',request.POST.get('metadata_keys','').split(','))
    elif req_method == 'GET':
        #form = dict((str(x),str(y)) for x,y in request.GET.items())
        for key, val in request.GET.items():
            form[str(key)]= val
        #Special case elements, always needs to be list
        if 'element' in request.GET.keys() and not 'elements' in request.GET.keys():
            form['elements'] = [str(request.GET['element'])]
        if 'elements' in request.GET.keys():
            #form['elements'] = WRCCUtils.convert_elements_to_list(request.GET['elements'])
            form['elements'] = request.GET.get('elements','').split(',')
        if 'metadata_keys' in request.GET.keys():
            form['metadata_keys'] = request.GET.getlist('metadata_keys',request.GET.get('metadata_keys','').split(','))
    else:
        form = {}

    #set data type for single apps
    if 'data_type' not in form.keys():
        if 'station_id' in form.keys():
            form['data_type'] = 'station'
        if 'location' in form.keys():
            form['data_type'] = 'grid'
        if 'app_name' in form.keys() and form['app_name'] in ['temporal_summary','monthly_spatial_summary']:
            form['data_type'] = 'grid'
    #Convert unicode to string
    if 'elements' in form.keys():
        form['elements'] = [str(el) for el in form['elements']]
    if 'csrfmiddlewaretoken' in form.keys():
        del form['csrfmiddlewaretoken']
    if 'formData' in form.keys():
        del form['formData']
    if 'form_options' in form.keys():
        del form['form_options']

    if not clean:
        return form
    #Clean up form for submission
    #Clean Dates and windows
    vd = None
    for key in ['start_date', 'end_date', 'start_year', 'end_year','start_window','end_window']:
        if key not in form.keys():
            continue
        if form[key].lower() == 'por':
            if str(key) in ['start_date']:
                k=key; idx = 0;sd = 'por'; ed = form['end_date']
            if str(key) in ['end_date']:
                k=key; idx = 1;ed = 'por'; sd = form['start_date']
            if str(key) in ['start_year']:
                k='start_date'; idx = 0;sd = 'por'
                if form['end_year'].lower() == 'por':ed = 'por'
                else:ed = str(int(form['end_year']) -1) + '-12-31'
            if str(key) in ['end_year']:
                k='end_date'; idx = 1;ed = 'por'
                if form['start_year'].lower() == 'por':sd = 'por'
                else:sd = form['start_year'] + '-01-01'
            if 'element' in form.keys() and not 'elements' in form.keys():
                if form['element'] in ['dtr']:
                    el_list = ['maxt','mint']
                if form['element'] in ['pet']:
                    el_list = ['maxt','mint','pcpn']
            if 'elements' in form.keys() and not 'element' in form.keys():
                if isinstance(form['elements'],basestring):
                    el_list = form['elements'].replace(' ','').split(',')
                else:
                    el_list = form['elements']
            else:
                el_list = None

            if 'station_id' in form.keys():
                if vd is None:
                    stn_id, stn_name = WRCCUtils.find_id_and_name(str(form['station_id']),settings.MEDIA_DIR +'json/US_station_id.json')
                    vd = WRCCUtils.find_valid_daterange(stn_id, start_date=sd, end_date=ed, el_list=el_list, max_or_min='max')
                form[k] = vd[idx]
                if key == 'start_year' and form['start_year'].lower() == 'por':
                    form['start_year'] = vd[0][0:4]
                if key == 'end_year' and form['end_year'].lower() == 'por':
                    form['end_year'] = vd[1][0:4]
            else:
                form[str(key)] = str(form[key]).replace('-','').replace(':','').replace('/','').replace(' ','')
        else:
            form[str(key)] = str(form[key]).replace('-','').replace(':','').replace('/','').replace(' ','')

    #Convert user input of area names to ids
    for key in ['station_id','county', 'basin', 'county_warning_area', 'climate_division']:
        if not key in form.keys():
            continue
        ID,name = WRCCUtils.find_id_and_name(form[key],settings.MEDIA_DIR +'json/US_' + key + '.json')
        form[key] = ID
        form['user_area_id'] = str(name) + ', ' + str(ID)
    if not 'user_area_id' in form.keys():
        try:
            form['user_area_id'] = form[form['area_type']]
        except:
            try:
                form['user_area_id'] =  form[form['data_type']]
            except:
                pass
    #station_ids is special case
    if 'station_ids' in form.keys():
        stn_ids = ''
        stn_list = form['station_ids'].rstrip(',').split(',')
        #Remove leading spaces from list items
        stn_list = [v.lstrip(' ').rstrip(' ') for v in stn_list]
        stn_ids, stn_names = WRCCUtils.find_ids_and_names(stn_list,settings.MEDIA_DIR +'json/US_' + 'station_id' + '.json')
        form['station_ids'] = stn_ids
        uai = ''
        stn_names_list = stn_names.split(',')
        for idx, stn_id in enumerate(stn_ids.split(',')):
            uai+=str(stn_names[idx]) + ', ' + str(stn_id) + ';'
        form['user_area_id'] = uai
    #set data summary if needed
    if 'data_summary' not in form.keys():
        if 'temporal_summary' in form.keys():
            form['data_summary'] = 'temporal_summary'
        if 'spatial_summary' in form.keys():
            form['data_summary'] = 'spatial_summary'
    #Combine elements
    if 'add_degree_days' in form.keys() and form['add_degree_days'] == 'T':
        for dd in form['degree_days'].replace(' ','').split(','):
            '''
            if form['units'] == 'metric':
                el_strip, base_temp = WRCCUtils.get_el_and_base_temp(dd)
                form['elements'].append(el_strip + str(WRCCUtils.convert_to_english('base_temp',base_temp)))
            else:
                form['elements'].append(dd)
            '''
            form['elements'].append(dd)
    return form
Beispiel #5
0
def sods(request, app_name):
    units = {'pcpn':'Hundredths of Inches', 'snow':'Tenths of Inches', 'snwd': 'Inches', 'maxt':'Whole Degrees', 'mint':'Whole Degrees',\
             'avgt':'Whole Degrees', 'dtr':'Whole Degrees', 'hdd':'Days', 'cdd':'Days','gdd':'Days'}
    months = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']
    context = {
    'title': '%s' % app_name,
    }
    #Form 1 dealing with station selection and for some apps, preliminary information
    form1 = set_as_form(request, 'Sod0', init={'app_name': app_name})
    context['form1'] = form1
    if 'stn_selection' in request.POST:
        #if app_name == 'Soddd':
        #    form1 = set_as_form(request, 'Sod0', init={'app_name': app_name, 'skip_days':False})
        #elif app_name  == 'Sodthr':
        #    form1 = set_as_form(request, 'Sod0', init={'app_name': app_name, 'custom_tables':False, 'number_of_threholds':1})
        #else:
        form1 = set_as_form(request, 'Sod0', init={'app_name': app_name})
        context['form1'] = form1
        if form1.is_valid():
            context['form_2_ready'] = '2ready'
            station_selection = form1.cleaned_data['station_selection']
            if app_name == 'Soddd':
                initial = {'app_name':app_name, 'station_selection':station_selection, \
                'skip_days':form1.cleaned_data['skip_days'], 'truncate':form1.cleaned_data['truncate'] }
            elif app_name == 'Sodpct':
                initial = {'app_name':app_name, 'station_selection':station_selection,\
                'threshold':form1.cleaned_data['threshold'], 'element':form1.cleaned_data['element'], \
                'individual_averages': form1.cleaned_data['individual_averages'] }
            elif app_name == 'Sodthr':
                initial = {'app_name':app_name, 'station_selection':station_selection,\
                'custom_tables':form1.cleaned_data['custom_tables'],'number_of_thresholds': form1.cleaned_data['number_of_thresholds']}
            elif app_name == 'Sodxtrmts':
                initial = {'app_name':app_name, 'station_selection':station_selection,\
                'statistic':form1.cleaned_data['statistic'], 'element':form1.cleaned_data['element'], \
                'frequency_analysis':form1.cleaned_data['frequency_analysis'],'statistic_period':'monthly'}
            elif app_name == 'Sodpiii':
                initial = {'app_name':app_name, 'station_selection':station_selection,\
                'skew':form1.cleaned_data['skew'], 'cv':form1.cleaned_data['cv'], 'mean':form1.cleaned_data['mean'], \
                'pct_average':form1.cleaned_data['pct_average'], 'days':form1.cleaned_data['days']}
            else:
                initial = {'app_name':app_name, 'station_selection':station_selection}
            form2 = set_as_form2(init=initial)
            context['form2'] = form2
        else:
            station_selection=None

    #Form2 Application parameters
    if 'app_form' in request.POST:
        form2 = set_as_form(request, 'Sod')
        context['form2'] = form2
        #import pdb; pdb.set_trace()
        if  form2.is_valid():
            context['cleaned'] = form2.cleaned_data
            #Check for POR
            vd = None
            if 'station_id' in form2.cleaned_data.keys() or 'stnid' in form2.cleaned_data.keys():
                if 'station_id' in form2.cleaned_data.keys():
                    stn_id = form2.cleaned_data['station_id']
                if 'stnid' in form2.cleaned_data.keys():
                    stn_id = form2.cleaned_data['stn_id']
                if 'start_date' in form2.cleaned_data.keys() and form2.cleaned_data['start_date'].upper() == 'POR':
                        vd = WRCCUtils.find_valid_daterange(stn_id, max_or_min='max')
                if 'end_date' in form2.cleaned_data.keys() and form2.cleaned_data['end_date'].upper() == 'POR' and vd is None:
                        vd = WRCCUtils.find_valid_daterange(stn_id, max_or_min='max')
            if vd is not None and len(vd) == 2:
                form2.cleaned_data['start_date'] = vd[0]
                form2.cleaned_data['end_date'] = vd[1]
            (data, dates, elements, station_ids, station_names) = AcisWS.get_sod_data(form2.cleaned_data, app_name)
            #get contexts for the different apps and run data application
            if app_name in ['Sodrun', 'Sodrunr']:
                if elements == ['maxt', 'mint']:
                    context['el'] = 'range'
                else:
                    context['el'] = str(elements[0])
                if form2.cleaned_data['aeb'] == 'A':
                    context['op'] = '>'
                elif form2.cleaned_data['aeb'] == 'B':
                    context['op'] = '<'
                else:
                    context['op'] = '='
                context['thresh'] = form2.cleaned_data['threshold']
                context['dur'] = form2.cleaned_data['minimum_run']
                app_args = {'app_name': app_name, 'data':data,'dates':dates,'elements':elements,\
                'station_ids':station_ids,'station_names':station_names,'op':context['op'],\
                'thresh':context['thresh'], 'verbose': form2.cleaned_data['verbose'], 'minimum_run': form2.cleaned_data['minimum_run']}
                results = WRCCDataApps.Sodrun(**app_args)
            elif app_name == 'Soddynorm':
                app_args = {'app_name': app_name, 'data':data,'dates':dates,'elements':elements,\
                'station_ids':station_ids,'station_names':station_names,\
                'filter_type':form2.cleaned_data['filter_type'],\
                'filter_days':form2.cleaned_data['number_of_days']}
                results = WRCCDataApps.Soddynorm(**app_args)
                '''
                results = run_data_app(app_name, data, dates, elements, station_ids, station_names, \
                form2.cleaned_data['filter_type'], form2.cleaned_data['number_of_days'])
                '''
            elif app_name == 'Soddyrec':
                app_args = {'app_name': app_name, 'data':data,'dates':dates,'elements':elements,\
                    'station_ids':station_ids,'station_names':station_names}
                results = WRCCDataApps.Soddyrec(**app_args)
                #context['data'] =results
            elif app_name == 'Soddd':
                base_temp = form2.cleaned_data['base_temperature']
                output_type = form2.cleaned_data['output_type']
                max_miss = form2.cleaned_data['max_missing_days']
                a_b = form2.cleaned_data['above_or_below']
                if a_b == 'a':
                    context['a_b'] = 'ABOVE'
                else:
                    context['a_b'] = 'BELOW'
                max_miss = form2.cleaned_data['max_missing_days']
                ncdc_round = form2.cleaned_data['ncdc_roundoff']
                context['ncdc_round'] = ncdc_round
                app_args = {'app_name':app_name,'data':data,'dates':dates,'elements':elements,\
                'station_ids':station_ids,'station_names':station_names,\
                'base_temp':base_temp, 'a_b':a_b,'output_type':output_type, \
                'max_miss':max_miss, 'ncdc_round':ncdc_round}
                context['skip_max_above'] = 'NO DAYS SKIPPED'
                context['skip_min_below'] = 'NO DAYS SKIPPED'
                context['trunc_high'] = 'NONE'
                context['trunc_low'] = 'NONE'
                if form2.cleaned_data['skip_days']:
                     skip_max_above = form2.cleaned_data['skip_days_with_max_above']
                     skip_min_below = form2.cleaned_data['skip_days_with_min_below']
                     app_args['skip_max_above'] = skip_max_above
                     app_args['skip_min_below'] = skip_min_below
                     context['skip_max_above'] = skip_max_above
                     context['skip_min_below'] = skip_min_below
                if form2.cleaned_data['truncate']:
                    trunc_high = form2.cleaned_data['truncation_upper_limit']
                    trunc_low = form2.cleaned_data['truncation_lower_limit']
                    app_args['trunc_high'] = trunc_high
                    app_args['trunc_low'] = trunc_low
                    context['trunc_high'] = trunc_high
                    context['trunc_low'] = trunc_low
                context['base_temp'] = base_temp
                context['output_type'] = output_type
                context['max_miss'] = max_miss
                if form2.cleaned_data['output_type'] == 'm':
                    context['monthly'] = 'yes'
                else:
                    context['daily'] = 'yes'
                results = run_data_app(**app_args)
            elif app_name == 'Sodpad':
                app_args = {'app_name':app_name,'data':data,'dates':dates,'elements':elements,\
                'station_ids':station_ids,'station_names':station_names}
                results = run_data_app(**app_args)
                mon_dict = {}
                day_dict = {}
                for doy in range(366):
                    mon, day = WRCCUtils.compute_mon_day(doy+1)
                    mon_dict[doy] = mon
                    day_dict[doy] = day
                context['mon'] = mon_dict
                context['day'] = day_dict
                context['durations'] ={ 1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,11:12,12:14,13:15,14:16,15:18,16:20,17:22,18:24,19:25,20:26,21:28,22:30}
            elif app_name == 'Sodsumm':
                el_type  = form2.cleaned_data['element']
                app_args = {'app_name':app_name,'data':data,'dates':dates,'elements':elements,\
                'ids':station_ids,'station_names':station_names,'el_type':el_type, 'max_missing_days':form2.cleaned_data['max_missing_days']}
                results = run_data_app(**app_args)
                context['max_missing_days'] = form2.cleaned_data['max_missing_days']
                if el_type  == 'temp':
                    table_list = ['temp']
                elif el_type  == 'prsn':
                    table_list = ['prsn']
                elif el_type  == 'both':
                    table_list = ['temp', 'prsn']
                elif el_type == 'hc':
                    table_list = ['hdd', 'cdd']
                elif el_type ==  'g':
                    table_list = ['gdd', 'corn']
                elif el_type == 'all':
                    table_list = ['temp', 'prsn', 'hdd', 'cdd', 'gdd', 'corn']
                context['headers'] = set_sodsumm_headers(table_list)
            elif app_name == 'Sodpct':
                el_type = form2.cleaned_data['element']
                if abs(form2.cleaned_data['threshold'] + 9999) < 0.05:
                    threshold = None
                else:
                    threshold = form2.cleaned_data['threshold']
                ia = form2.cleaned_data['individual_averages']
                number_days_ahead = form2.cleaned_data['number_days_ahead']
                if 'threshold_ab' in form2.cleaned_data.keys():
                    threshold_ab = form2.cleaned_data['threshold_ab']
                else:
                    threshold_ab = None
                if el_type in ['hdd', 'cdd', 'gdd']:
                    base_temperature = form2.cleaned_data['base_temperature']
                    if el_type == 'gdd':
                        min_temperature = form2.cleaned_data['min_temperature']
                        max_temperature = form2.cleaned_data['max_temperature']
                    else:
                        min_temperature = None
                        max_temperature = None
                else:
                    base_temperature = None
                    min_temperature = None
                    max_temperature = None
                if 'begin_month' in form2.cleaned_data.keys():
                    begin_month = form2.cleaned_data['begin_month']
                else:
                    begin_month = None
                if 'accumulate_over_season' in form2.cleaned_data.keys():
                    accumulate_over_season = form2.cleaned_data['accumulate_over_season']
                else:
                    accumulate_over_season = None
                app_args = {'app_name':app_name,'data':data,'dates':dates,'elements':elements,\
                'station_ids':station_ids,'station_names':station_names,'el_type':el_type,\
                'ia':ia, 'number_days_ahead':number_days_ahead,'threshold':threshold, 'threshold_ab':threshold_ab, \
                'base_temperature':base_temperature, 'min_temperature':min_temperature, \
                'max_temperature':max_temperature, 'begin_month':begin_month, 'accumulate_over_season':accumulate_over_season }
                if threshold_ab == 'A':
                    context['op'] = 'Above'
                elif threshold_ab == 'B':
                    context['op'] = 'Below'
                context['base_temperature'] = base_temperature
                context['min_temperature'] = min_temperature
                context['min_temperature'] = max_temperature
                context['begin_month'] = begin_month
                context['threshold'] = threshold
                if threshold_ab == 'a':context['op'] = 'ABOVE'
                if threshold_ab == 'b':context['op'] = 'BELOW'
                context['element'] =  el_type
                context['units'] = units[el_type]
                context['individual_averages'] = ia
                results = run_data_app(**app_args)
            elif app_name == 'Sodthr':
                header = {}
                el_type = form2.cleaned_data['element']
                start_year = dates[0][0:4]
                end_year = dates[-1][0:4]
                number_of_thresholds = form2.cleaned_data['number_of_thresholds']
                custom_tables = form2.cleaned_data['custom_tables']
                if custom_tables == 'T':
                    time_series = []
                    thresholds = []
                    #set headers
                    for k in range(3):
                        header[k] = set_sodthr_headers(k, el_type, str(form2.cleaned_data['interval_start']), \
                        str(form2.cleaned_data['midpoint']),str(form2.cleaned_data['interval_end']), start_year, end_year, \
                        int(form2.cleaned_data['max_missing_days_first_and_last']), int(form2.cleaned_data['max_missing_days_differences']), \
                        str(form2.cleaned_data['above_or_below']), str(form2.cleaned_data['latest_or_earliest_for_period_1']), \
                        str(form2.cleaned_data['latest_or_earliest_for_period_2']))
                    #Find list of thresholds, and time_series_booleans
                    for k in range(int(number_of_thresholds)):
                        thresholds.append(float(form2.cleaned_data['threshold_%s' % str(k)]))
                        time_series.append(form2.cleaned_data['time_series_%s' % str(k)])
                    #set application arguments
                    app_args = {'app_name':app_name,'data':data,'dates':dates,'elements':elements,\
                    'station_ids':station_ids,'station_names':station_names,'el_type':el_type, 'custom_tables':True, \
                    'interval_start':form2.cleaned_data['interval_start'], 'midpoint':form2.cleaned_data['midpoint'], \
                    'interval_end':form2.cleaned_data['interval_end'], 'thresholds': thresholds, 'time_series': time_series, \
                    'le_1': form2.cleaned_data['latest_or_earliest_for_period_1'], \
                    'le_2':form2.cleaned_data['latest_or_earliest_for_period_2'], 'ab':form2.cleaned_data['above_or_below'], \
                    'miss_days_1':form2.cleaned_data['max_missing_days_first_and_last'], 'miss_days_2':form2.cleaned_data['max_missing_days_differences']}
                else:
                    #set headers
                    for k in range(3):
                        header[k] = set_sodthr_headers(k, el_type, '0101', '0731',  '1231', start_year, \
                        end_year, 10, 10, 'BELOW', 'latest','earliest')
                    app_args = {'app_name':app_name,'data':data,'dates':dates,'elements':elements,\
                    'station_ids':station_ids,'station_names':station_names,'el_type':el_type, 'custom_tables':False}
                context['header'] = header
                results = run_data_app(**app_args)
            elif app_name == 'Sodxtrmts':
                context['element'] = form2.cleaned_data['element']
                context['max_missing_days'] = form2.cleaned_data['max_missing_days']
                context['start_month'] = WRCCData.NUMBER_TO_MONTH_NAME[form2.cleaned_data['start_month']]
                mon_start = int(form2.cleaned_data['start_month'].lstrip('0'))
                month_list = []
                for mon_idx in range(mon_start -1,12):
                    month_list.append(months[mon_idx])
                for mon_idx in range(mon_start-1):
                    month_list.append(months[mon_idx])
                month_list.append('ANN')
                context['month_list'] = month_list
                context['frequency_analysis'] = WRCCData.DISPLAY_PARAMS[form2.cleaned_data['frequency_analysis']]
                context['statistic'] = WRCCData.DISPLAY_PARAMS[form2.cleaned_data['statistic']]
                context['departure_from_averages'] = WRCCData.DISPLAY_PARAMS[form2.cleaned_data['departures_from_averages']]
                app_args = {
                    'app_name':app_name,
                    'data':data,
                    'dates':dates,
                    'elements':elements,
                    'station_ids':station_ids,
                    'station_names':station_names,
                    'element':form2.cleaned_data['element'],
                    'max_missing_days':form2.cleaned_data['max_missing_days'],
                    'start_month': form2.cleaned_data['start_month'],
                    'statistic_period':'monthly',
                    'statistic': form2.cleaned_data['statistic'],
                    'frequency_analysis': form2.cleaned_data['frequency_analysis'],
                    'departures_from_averages':form2.cleaned_data['departures_from_averages']
                }
                if form2.cleaned_data['frequency_analysis'] == 'T':
                    context['frequency_analysis_type'] = form2.cleaned_data['frequency_analysis_type']
                    app_args['frequency_analysis_type'] = form2.cleaned_data['frequency_analysis_type']
                if form2.cleaned_data['statistic'] == 'ndays':
                    app_args['less_greater_or_between'] = form2.cleaned_data['less_greater_or_between']
                    if form2.cleaned_data['less_greater_or_between'] == 'b':
                        app_args['threshold_low_for_between'] = form2.cleaned_data['threshold_low_for_between']
                        app_args['threshold_high_for_between'] = form2.cleaned_data['threshold_high_for_between']
                    else:
                        app_args['threshold_for_less_or_greater'] = form2.cleaned_data['threshold_for_less_or_greater']
                if form2.cleaned_data['element'] in ['hdd', 'gdd', 'cdd']:
                    app_args['base_temperature'] = form2.cleaned_data['base_temperature']
                context['app_arg'] = app_args
                results = WRCCDataApps.Sodxtrmts(**app_args)
                #context['fa_results'] = dict(fa_results)
            elif app_name == 'Sodpiii':
                lisdur = [ '6 Hrs', '12 Hrs', '1 Day', '2 Days', '3 Days', \
                        '4 Days', '5 Days', '6 Days', '7 Days', '8 Days', '9 Days', \
                        '10 Days', '15 Days', '20 Days', '25 Days', '30 Days']
                context['el_type'] = form2.cleaned_data['element']
                context['units'] = units[form2.cleaned_data['element']]
                context['start_year'] = form2.cleaned_data['start_date'][0:4]
                context['end_year'] = str(int(form2.cleaned_data['end_date'][0:4]) - 1)
                context['start_month'] = form2.cleaned_data['start_date'][4:6]
                context['end_month'] = form2.cleaned_data['end_date'][4:6]
                app_args = {'app_name':app_name,'data':data,'dates':dates,'elements':elements,\
                'station_ids':station_ids,'station_names':station_names, \
                'el_type':form2.cleaned_data['element'], 'skew':form2.cleaned_data['skew'], \
                'cv':form2.cleaned_data['cv'], 'mean': form2.cleaned_data['mean'], \
                'pct_average':form2.cleaned_data['pct_average'], \
                'value_subsequent':form2.cleaned_data['value_subsequent'], \
                'value_missing':form2.cleaned_data['value_missing'],'days':form2.cleaned_data['days']}
                if form2.cleaned_data['element'] == 'avgt':
                    app_args['ab'] = form2.cleaned_data['mean_temperatures']
                duration = {}
                if form2.cleaned_data['days'] == 'i':
                    app_args['number_of_days'] = int(form2.cleaned_data['number_of_days'])
                    duration[0] = '%i Days' % int(form2.cleaned_data['number_of_days'])
                elif form2.cleaned_data['days'] == '5':
                    for k in range(5):
                        duration[k] = lisdur[k + 2]
                elif form2.cleaned_data['days'] == 'a':
                    for k in range(len(lisdur)):
                        duration[k] = lisdur[k]
                context['duration'] = duration
                results_0, results, averages, stdevs, skews = WRCCDataApps.Sodpiii(**app_args)
                context['averages'] = averages
                context['stdevs'] = stdevs
                context['skews'] = skews
                context['results_0'] = dict(results_0)
            else:
                results = {}

            #general context
            try:
                context['results'] = dict(results)
            except:
                context['results'] = results
            context['dates'] = dates
            if app_name in ['Sodrun', 'Sodrunr', 'Soddyrec', 'Sodcnv', 'Sodlist']:
                context['start_year'] = dates[0]
                context['end_year'] = dates[-1]
            elif app_name in ['Soddd', 'Sodpiii', 'Sodsumm']:
                context['start_year'] = dates[0][0:4]
                context['end_year'] = str(int(dates[-1][0:4]))
            else:
                context['start_year'] = dates[0][0:4]
                if app_name == 'Sodxtrmts':
                    context['end_year'] = dates[-1][0:4]
                else:
                    context['end_year'] = str(int(dates[-1][0:4])+1)
            context['num_yrs'] = int(dates[-1][0:4]) - int(dates[0][0:4])+1
            context['elements'] = dict([(k,v) for k,v in enumerate(elements)])
            context['data'] = dict(data)
            context['station_ids'] = dict([(k,v) for k,v in enumerate(station_ids)])
            context['station_names'] = dict([(k,v) for k,v in enumerate(station_names)])
        #form_2 not valid or we are done with analysis
        form2 = set_as_form(request, 'Sod')
        context['form2'] = form2
        context['form_2_ready'] = True
        station_selection = None
        #else: #form_2 is not valid
        #    print "The following errors occurred:"
        #    print form2.errors
        #    station_selection = None
    return render_to_response('wrcc_apps/%s.html' % app_name, context, context_instance=RequestContext(request))
def set_wrapper_params(stn_id, table_name):
    vd, no_vd_els = WRCCUtils.find_valid_daterange(stn_id)
    if len(vd) == 2 and vd[0] != '9999-99-99' and vd[1] != '9999-99-99':
        return [stn_id, table_name,vd[0][0:4],vd[1][0:4],5]
    return []
Beispiel #7
0
def get_station_data(form_input, program):
    '''
    Retrieves Station Data from ACIS.
    Keyword arguments:
    form_input -- parameter file for data request obtained from user of CSC pages
    program -- specifies program that is making the request.
    Returns python dictionary with keys:
        meta
        data
    '''
    request = {'data':[]}
    s_date, e_date = WRCCUtils.start_end_date_to_eight(form_input)
    #Sanity check for valid date input:
    if (s_date.lower() == 'por' or e_date.lower() == 'por') and ('station_id' not in form_input.keys()):
        error = 'Parameter error. Start/End date ="por" not supported for multi station call.'
        resultsdict['error'] = error
        return resultsdict

    variables = WRCCUtils.get_variable_list(form_input, program)
    elems_list = []
    elems_list_short  = []
    resultsdict = {}
    for el in variables:
        el_strip, base_temp = WRCCUtils.get_el_and_base_temp(el)
        elems_list_short.append(el_strip)
        if el_strip in ['gdd', 'hdd', 'cdd'] and base_temp is not None:
            d = dict(vX=WRCCData.ACIS_ELEMENTS_DICT[el_strip]['vX'], base=int(base_temp), add='f,t')
            elems_list.append(d)
        else:
            d = dict(vX=WRCCData.ACIS_ELEMENTS_DICT[el]['vX'],add='f,t')
            elems_list.append(d)
    params = {
            'sdate':s_date,
            'edate':e_date,
            'meta':'name,state,sids,ll,elev,uid,valid_daterange',
            'elems':elems_list
            }
    shape_type = None
    #Deal with POR input dates
    if 'station_id' in form_input.keys():
        sid = form_input['station_id']
        s = s_date.lower()
        e = e_date.lower()
        l = elems_list_short
        vd, no_vd_els = WRCCUtils.find_valid_daterange(sid, start_date=s, end_date=e, el_list=l, max_or_min='max')
        params['sdate'] = v[0]; params['edate'] = v[1]
        if params['sdate']  == '9999-99-99' or params['edate'] == '9999-99-99':
            error = 'No start/end date could be found for this station in the metadata database.'
            resultsdict['error'] = error
            return resultsdict
    #Set area parameter
    try:
        key = WRCCData.STN_AREA_FORM_TO_PARAM[form_input['select_stations_by']]
        val = form_input[form_input['select_stations_by']]
    except:
        key = WRCCData.STN_AREA_FORM_TO_PARAM[form_input['area_type']]
        val = form_input[form_input['area_type']]
    params[key] = val
    #Find bbox if custom shape and update params['bbox']
    if 'shape' in form_input.keys():
        shape_type,bbox = WRCCUtils.get_bbox(form_input['shape'])
        params['bbox'] = bbox
    #Data request
    try:
        req = MultiStnData(params)
    except Exception, e:
        request['error'] = 'StnData request failed. Error: %s. Pameters: %s.' %(str(e), params)
        return request
Beispiel #8
0
def set_wrapper_params(stn_id, table_name):
    vd = WRCCUtils.find_valid_daterange(stn_id)
    if len(vd) == 2 and vd[0] and vd[1]:
        return [stn_id, table_name,vd[0][0:4],vd[1][0:4],5]
    return []