def createmeteo(request, well): ''' Create datasources with meteo data for a well ''' def docreate(name,closest,gen,start): instance = gen.get_class()() ploc, created = project.projectlocatie_set.get_or_create(name = name, defaults = {'description': name, 'location': closest.location}) mloc, created = ploc.meetlocatie_set.get_or_create(name = name, defaults = {'description': name, 'location': closest.location}) if created: logger.info('Meetlocatie {} aangemaakt'.format(name)) ds, created = mloc.datasources.get_or_create(name = name, defaults = {'description': name,'generator': gen, 'user': user, 'timezone': 'UTC', 'url': instance.url + '?stns={stn}&start={start}'.format(stn=closest.nummer,start=start)}) if created: ds.download() ds.update_parameters() for p in ds.parameter_set.filter(name__in=candidates): try: series, created = p.series_set.get_or_create(name = p.name, description = p.description, unit = p.unit, user = request.user) series.replace() except Exception as e: logger.error('ERROR creating series %s: %s' % (p.name, e)) user = request.user candidates = ['PG', 'EV24', 'RD', 'RH', 'P', 'T'] ploc = ProjectLocatie.objects.get(name=well.name) project = ploc.project gen = Generator.objects.get(classname__icontains='KNMI.meteo') closest = Station.closest(well.location) name = 'Meteostation {} (dagwaarden)'.format(closest.naam) docreate(name,closest,gen,'20140501') gen = Generator.objects.get(classname__icontains='KNMI.neerslag') closest = NeerslagStation.closest(well.location) name = 'Neerslagstation {}'.format(closest.naam) docreate(name,closest,gen,'20140501') gen = Generator.objects.get(classname__icontains='KNMI.uur') closest = Station.closest(well.location) name = 'Meteostation {} (uurwaarden)'.format(closest.naam) docreate(name,closest,gen,'2014050101')
def get_context_data(self, **kwargs): context = super(WellChartView, self).get_context_data(**kwargs) well = Well.objects.get(pk=context['pk']) name = unicode(well) options = { 'rangeSelector': { 'enabled': True, 'inputEnabled': True, }, 'navigator': {'adaptToUpdatedData': True, 'enabled': True}, 'chart': {'type': 'arearange', 'zoomType': 'x'}, 'title': {'text': name}, 'xAxis': {'type': 'datetime'}, 'yAxis': [{'title': {'text': 'Grondwaterstand\n(m tov NAP)'}} ], 'tooltip': {'valueSuffix': ' m', 'valueDecimals': 2, 'shared': True, }, 'legend': {'enabled': True}, 'plotOptions': {'line': {'marker': {'enabled': False}}}, 'credits': {'enabled': True, 'text': 'acaciawater.com', 'href': 'http://www.acaciawater.com', }, } series = [] xydata = [] for screen in well.screen_set.all(): name = unicode(screen) data = screen.to_pandas(ref='nap') if data.size > 0: xydata = zip(data.index.to_pydatetime(), data.values) series.append({'name': name, 'type': 'line', 'data': xydata, 'lineWidth': 1, 'color': '#0066FF', 'zIndex': 2, }) mean = pd.expanding_mean(data) std = pd.expanding_std(data) a = (mean - std).dropna() b = (mean + std).dropna() ranges = zip(a.index.to_pydatetime(), a.values, b.values) series.append({'name': 'spreiding', 'data': ranges, 'type': 'arearange', 'lineWidth': 0, 'color': '#0066FF', 'fillOpacity': 0.2, 'linkedTo' : ':previous', 'zIndex': 0, }) data = screen.to_pandas(ref='nap',kind='HAND') if data.size > 0: hand = zip(data.index.to_pydatetime(), data.values) series.append({'name': 'handpeiling', 'type': 'scatter', 'data': hand, 'zIndex': 3, 'marker': {'symbol': 'circle', 'radius': 6, 'lineColor': 'white', 'lineWidth': 2, 'fillColor': 'red'}, }) if len(xydata)>0: mv = [] mv.append((xydata[0][0], screen.well.maaiveld)) mv.append((xydata[-1][0], screen.well.maaiveld)) series.append({'name': 'maaiveld', 'type': 'line', 'lineWidth': 2, 'color': '#009900', 'dashStyle': 'Dash', 'data': mv, 'zIndex': 4, }) # neerslag toevoegen try: closest = Station.closest(well.location) name = 'Meteostation {} (dagwaarden)'.format(closest.naam) neerslag = Series.objects.get(name='RH',mlocatie__name=name) data = neerslag.to_pandas(start=xydata[0][0], stop=xydata[-1][0]) / 10.0 # 0.1 mm -> mm data = zip(data.index.to_pydatetime(), data.values) series.append({'name': 'Neerslag '+ closest.naam, 'type': 'column', 'data': data, 'yAxis': 1, 'pointRange': 24 * 3600 * 1000, # 1 day 'pointPadding': 0.01, 'pointPlacement': 0.5, 'zIndex': 1, 'color': 'orange', 'borderColor': '#cc6600', }) options['yAxis'].append({'title': {'text': 'Neerslag (mm)'}, 'opposite': 1, 'min': 0, }) except: pass options['series'] = series context['options'] = json.dumps(options, default=lambda x: int(time.mktime(x.timetuple())*1000)) context['object'] = well return context
def createmeteo(request, well): ''' Create datasources with meteo data for a well ''' def find(f, seq): """Return first item in sequence where f(item) == True.""" for item in seq: if f(item): return item def docreate(name, closest, gen, start, candidates): instance = gen.get_class()() ploc, created = well.ploc.project.projectlocatie_set.get_or_create( name=name, defaults={ 'description': name, 'location': closest.location }) mloc, created = ploc.meetlocatie_set.get_or_create(name=name, defaults={ 'description': name, 'location': closest.location }) if created: logger.info('Meetlocatie {} aangemaakt'.format(name)) ds, created = mloc.datasource_set.update_or_create( name=name, defaults={ 'description': name, 'generator': gen, 'user': user, 'timezone': 'UTC', 'url': instance.url + '?stns={stn}&start={start}'.format( stn=closest.nummer, start=start) }) if created: ds.download() ds.update_parameters() series_set = [] for key, value in candidates.items(): try: series = None p = ds.parameter_set.get(name=key) series_name = '{} {}'.format(value, closest.naam) series, created = p.series_set.get_or_create(name=series_name, mlocatie=mloc, defaults={ 'description': p.description, 'unit': p.unit, 'user': request.user }) if created: series.replace() except Parameter.DoesNotExist: logger.warning('Parameter %s not found in datasource %s' % (key, ds.name)) except Exception as e: logger.error('ERROR creating series %s: %s' % (key, e)) series_set.append(series) return series_set user = request.user #candidates = ['PG', 'EV24', 'RD', 'RH', 'P', 'T'] if not hasattr(well, 'meteo'): MeteoData.objects.create(well=well) meteo = well.meteo gen = Generator.objects.get(classname__icontains='KNMI.meteo') closest = Station.closest(well.location) name = 'Meteostation {} (dagwaarden)'.format(closest.naam) res = docreate(name, closest, gen, '20190101', { 'TG': 'Temperatuur', 'RH': 'Neerslag', 'EV24': 'Verdamping' }) if res: meteo.temperatuur = find(lambda s: s.name.startswith('Temperatuur'), res) meteo.neerslag = find(lambda s: s.name.startswith('Neerslag'), res) meteo.verdamping = find(lambda s: s.name.startswith('Verdamping'), res) gen = Generator.objects.get(classname__icontains='KNMI.neerslag') closest = NeerslagStation.closest(well.location) name = 'Neerslagstation {}'.format(closest.naam) docreate(name, closest, gen, '20190101', {'RD': 'Neerslag'}) gen = Generator.objects.get(classname__icontains='KNMI.uur') closest = Station.closest(well.location) name = 'Meteostation {} (uurwaarden)'.format(closest.naam) res = docreate(name, closest, gen, '2019010101', { 'P': 'Luchtdruk', 'RH': 'Neerslag' }) if res: meteo.baro = find(lambda s: s.name.startswith('Lucht'), res) #meteo.neerslag = find(lambda s: s.name.startswith('Neer'),res) meteo.save()