summaryrefslogtreecommitdiff
path: root/searx/answerers/statistics.py
diff options
context:
space:
mode:
Diffstat (limited to 'searx/answerers/statistics.py')
-rw-r--r--searx/answerers/statistics.py64
1 files changed, 64 insertions, 0 deletions
diff --git a/searx/answerers/statistics.py b/searx/answerers/statistics.py
new file mode 100644
index 000000000..e6cbdd008
--- /dev/null
+++ b/searx/answerers/statistics.py
@@ -0,0 +1,64 @@
+# SPDX-License-Identifier: AGPL-3.0-or-later
+# pylint: disable=missing-module-docstring
+from __future__ import annotations
+
+from functools import reduce
+from operator import mul
+
+import babel
+import babel.numbers
+from flask_babel import gettext
+
+from searx.extended_types import sxng_request
+from searx.result_types import Answer
+from searx.result_types.answer import BaseAnswer
+
+from . import Answerer, AnswererInfo
+
+kw2func = [
+ ("min", min),
+ ("max", max),
+ ("avg", lambda args: sum(args) / len(args)),
+ ("sum", sum),
+ ("prod", lambda args: reduce(mul, args, 1)),
+]
+
+
+class SXNGAnswerer(Answerer):
+ """Statistics functions"""
+
+ keywords = [kw for kw, _ in kw2func]
+
+ def info(self):
+
+ return AnswererInfo(
+ name=gettext(self.__doc__),
+ description=gettext(f"Compute {'/'.join(self.keywords)} of the arguments"),
+ keywords=self.keywords,
+ examples=["avg 123 548 2.04 24.2"],
+ )
+
+ def answer(self, query: str) -> list[BaseAnswer]:
+
+ results = []
+ parts = query.split()
+ if len(parts) < 2:
+ return results
+
+ ui_locale = babel.Locale.parse(sxng_request.preferences.get_value('locale'), sep='-')
+
+ try:
+ args = [babel.numbers.parse_decimal(num, ui_locale, numbering_system="latn") for num in parts[1:]]
+ except: # pylint: disable=bare-except
+ # seems one of the args is not a float type, can't be converted to float
+ return results
+
+ for k, func in kw2func:
+ if k == parts[0]:
+ res = func(args)
+ res = babel.numbers.format_decimal(res, locale=ui_locale)
+ f_str = ', '.join(babel.numbers.format_decimal(arg, locale=ui_locale) for arg in args)
+ results.append(Answer(answer=f"[{ui_locale}] {k}({f_str}) = {res} "))
+ break
+
+ return results