pv_names = [el[0] for el in pv_names]
return pv_names
- def get_single_pv(self, pv_name):
+ def sql_single_pv(self, channel_id, average=None, start=None, end=None):
+ if average:
+ assert average in ["second", "minute", "hour", "day", "week", "month", "quarter", "year"]
+ sql = "SELECT date_trunc('{}', smpl_time) AS smpl_time, avg(float_val) AS float_val ".format(average)
+ else:
+ sql = "SELECT smpl_time, float_val "
+ sql += "FROM archive.sample "
+ sql += "WHERE archive.sample.channel_id = {} ".format(channel_id)
+ if start: sql += "AND smpl_time >= '{}'::timestamp ".format(start.isoformat(sep=' '))
+ if end: sql += "AND smpl_time < '{}'::timestamp ".format(end.isoformat(sep=' '))
+ if average:
+ sql += "GROUP BY 1"
+ sql += ";"
+ return sql
+
+ def get_single_pv(self, pv_name, **kwargs):
channel_id = self.get_channel_id(pv_name)
- sql = """SELECT smpl_time, float_val FROM archive.sample
- WHERE archive.sample.channel_id = {};""".format(channel_id)
+ sql = self.sql_single_pv(channel_id, **kwargs)
df = pd.read_sql_query(sql, self.conn, index_col='smpl_time')
return df
- def plot_single_pv(self, pv_name, **kwargs):
+ def plot_single_pv(self, pv_name, average=None, start=None, end=None, **kwargs):
+ values = self.get_single_pv(pv_name, average=average, start=start, end=end)
+ values['float_val'].plot(label=pv_name, **kwargs)
+ plt.legend()
+
+ def plot_single_pv_resample(self, pv_name, interval='5min', **kwargs):
values = self.get_single_pv(pv_name)['float_val']
- low = values.resample('5min').min()
- high = values.resample('5min').max()
+ low = values.resample(interval).min()
+ high = values.resample(interval).max()
times = high.index
- values.resample('5min').mean().plot(label='mean', **kwargs)
+ values.resample(interval).mean().plot(label='mean', **kwargs)
plt.fill_between(list(times), list(low), list(high), alpha=0.3)
plt.legend()
-
\ No newline at end of file