|
@@ -28,15 +28,38 @@ from ..data.filter import (
|
|
|
get_filter,
|
|
|
get_query_param,
|
|
|
)
|
|
|
-from ..activities.Plot import (
|
|
|
- get_data,
|
|
|
-)
|
|
|
from .form import(
|
|
|
get_form,
|
|
|
)
|
|
|
|
|
|
matplotlib.use('agg')
|
|
|
|
|
|
+plot_style = {
|
|
|
+ "lines.color": "#ffffff",
|
|
|
+ "patch.edgecolor": "#ffffff",
|
|
|
+ "text.color": "#ffffff",
|
|
|
+ "axes.facecolor": "#7f7f7f",
|
|
|
+ "axes.edgecolor": "#ffffff",
|
|
|
+ "axes.labelcolor": "#ffffff",
|
|
|
+ "xtick.color": "#ffffff",
|
|
|
+ "ytick.color": "#ffffff",
|
|
|
+ "grid.color": "#ffffff",
|
|
|
+ "figure.facecolor": "#7f7f7f",
|
|
|
+ "figure.edgecolor": "#7f7f7f",
|
|
|
+ "savefig.facecolor": "#7f7f7f",
|
|
|
+ "savefig.edgecolor": "#7f7f7f",
|
|
|
+}
|
|
|
+
|
|
|
+def get_data(query_manager: QueryManager, unit=None, **kwargs) -> pd.DataFrame:
|
|
|
+ d = pd.DataFrame(query_manager.get_historic_prices_data(unit, **kwargs))
|
|
|
+ if d.empty:
|
|
|
+ return d
|
|
|
+ d['ts_month'] = d['ts_raw'].apply(lambda x: date(x.date().year, x.date().month,1))
|
|
|
+ d[['price','quantity']] = d[['price','quantity']].apply(
|
|
|
+ lambda y: y.apply(lambda x: x and float(x)),
|
|
|
+ )
|
|
|
+ return d
|
|
|
+
|
|
|
def abort(code, text):
|
|
|
raise HTTPError(code, text)
|
|
|
|
|
@@ -83,20 +106,7 @@ def trend_internal(conn: Connection[TupleRow], path: str, query: FormsDict):
|
|
|
pivot.columns = pivot.columns.droplevel()
|
|
|
sns.set_theme(style='darkgrid', palette='pastel', context="talk")
|
|
|
plt.style.use("dark_background")
|
|
|
- plt.rcParams.update({
|
|
|
- "lines.color": "#ffffff",
|
|
|
- "patch.edgecolor": "#ffffff",
|
|
|
- "text.color": "#ffffff",
|
|
|
- "axes.facecolor": "#7f7f7f",
|
|
|
- "axes.edgecolor": "#ffffff",
|
|
|
- "axes.labelcolor": "#ffffff",
|
|
|
- "xtick.color": "#ffffff",
|
|
|
- "ytick.color": "#ffffff",
|
|
|
- "grid.color": "#ffffff",
|
|
|
- "figure.facecolor": "#7f7f7f",
|
|
|
- "figure.edgecolor": "#7f7f7f",
|
|
|
- "savefig.facecolor": "#7f7f7f",
|
|
|
- "savefig.edgecolor": "#7f7f7f"})
|
|
|
+ plt.rcParams.update(plot_style)
|
|
|
plt.rcParams.update({"grid.linewidth":0.2, "grid.alpha":0.5})
|
|
|
plt.figure(figsize=[16, 9], layout="tight")
|
|
|
xlabel='Time'
|
|
@@ -179,53 +189,41 @@ def volume_internal(conn: Connection[TupleRow], path: str, query: FormsDict):
|
|
|
|
|
|
now = datetime.now().date()
|
|
|
data = data[data['ts_month'] == date(now.year,now.month-1,1)]
|
|
|
- pivot = data.groupby(['ts_month','group',])['price', 'quantity'].sum()
|
|
|
- pivot = pivot.reset_index().set_index('group')
|
|
|
+ group = 'group'
|
|
|
+ for g, _g in zip(
|
|
|
+ ('category', 'group'),
|
|
|
+ ('product', 'category')
|
|
|
+ ):
|
|
|
+ if g and len(data[g].unique()) != 1:
|
|
|
+ continue
|
|
|
+ group = _g
|
|
|
+ break
|
|
|
+
|
|
|
+ pivot = data.groupby([group,])[['price', 'quantity']].sum()
|
|
|
|
|
|
if pivot.empty:
|
|
|
abort(404, f"No data.")
|
|
|
|
|
|
sns.set_theme(style='darkgrid', palette='pastel', context="talk")
|
|
|
plt.style.use("dark_background")
|
|
|
- plt.rcParams.update({
|
|
|
- "lines.color": "#ffffff",
|
|
|
- "patch.edgecolor": "#ffffff",
|
|
|
- "text.color": "#ffffff",
|
|
|
- "axes.facecolor": "#7f7f7f",
|
|
|
- "axes.edgecolor": "#ffffff",
|
|
|
- "axes.labelcolor": "#ffffff",
|
|
|
- "xtick.color": "#ffffff",
|
|
|
- "ytick.color": "#ffffff",
|
|
|
- "grid.color": "#ffffff",
|
|
|
- "figure.facecolor": "#7f7f7f",
|
|
|
- "figure.edgecolor": "#7f7f7f",
|
|
|
- "savefig.facecolor": "#7f7f7f",
|
|
|
- "savefig.edgecolor": "#7f7f7f"})
|
|
|
+ plt.rcParams.update(plot_style)
|
|
|
plt.rcParams.update({"grid.linewidth":0.2, "grid.alpha":0.5})
|
|
|
plt.figure(figsize=[16, 9], layout="tight")
|
|
|
- ax = pivot.plot.pie(y='quantity', figsize=(5, 5))
|
|
|
- #ax.get_legend().remove()
|
|
|
- ax.set_title(f'Quantity ({unit})')
|
|
|
- #pie(pivot, col='price', title='Price ($)')
|
|
|
- xlabel=''
|
|
|
- ylabel=''
|
|
|
- # if pivot.columns.size > 50:
|
|
|
- # ax = sns.scatterplot(data=pivot, markers=True)
|
|
|
- # else:
|
|
|
- # ax = sns.lineplot(data=pivot, markers=True)
|
|
|
- # legend = plt.figlegend(
|
|
|
- # loc='upper center', ncol=6,
|
|
|
- # title_fontsize="14", fontsize="12", labelcolor='#ffffff',
|
|
|
- # framealpha=0.5
|
|
|
- # )
|
|
|
- # legend.set_title(title="Products")
|
|
|
- ax.legend().set_visible(False)
|
|
|
-
|
|
|
- ax.set_xlabel(xlabel, fontsize="14")
|
|
|
- ax.set_ylabel(ylabel, fontsize="14")
|
|
|
- ax.axes.tick_params(labelsize="12", which='both')
|
|
|
- for _, spine in ax.spines.items():
|
|
|
- spine.set_color('#ffffff')
|
|
|
+ axes = pivot.plot.pie(subplots=True, figsize=(11, 5))
|
|
|
+
|
|
|
+ for ax, title in zip(axes, (
|
|
|
+ f'Expenditure ($)',
|
|
|
+ f'Quantity ({unit})',
|
|
|
+ )):
|
|
|
+ ax.set_title(title)
|
|
|
+ xlabel=''
|
|
|
+ ylabel=''
|
|
|
+ ax.legend().set_visible(False)
|
|
|
+ ax.legend().set_visible(False)
|
|
|
+
|
|
|
+ ax.set_xlabel(xlabel, fontsize="14")
|
|
|
+ ax.set_ylabel(ylabel, fontsize="14")
|
|
|
+ ax.axes.tick_params(labelsize="12", which='both')
|
|
|
|
|
|
progress.update({ "stage": "Rendering chart", "percent": "50"})
|
|
|
yield template("done") + template("progress", **progress)
|