sparkline.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #
  2. # From pysparklines (BSD License): https://pypi.python.org/pypi/pysparklines
  3. from __future__ import annotations
  4. import math
  5. spark_chars = "▁▂▃▄▅▆▇█"
  6. # math.isfinite doesn't exist in python2, so provider our own
  7. def isfinite(f):
  8. return not (math.isinf(f) or math.isnan(f))
  9. def sparkify(series: list[float | int]) -> str:
  10. """Convert <series> to a sparkline string.
  11. Example:
  12. >>> sparkify([0.5, 1.2, 3.5, 7.3, 8.0, 12.5, 13.2, 15.0, 14.2, 11.8, 6.1, 1.9])
  13. u'▁▁▂▄▅▇▇██▆▄▂'
  14. >>> sparkify([1, 1, -2, 3, -5, 8, -13])
  15. u'▆▆▅▆▄█▁'
  16. Raises ValueError if input data cannot be converted to float.
  17. Raises TypeError if series is not an iterable.
  18. """
  19. series = [float(i) for i in series]
  20. finite_series = [x for x in series if isfinite(x)]
  21. if not finite_series:
  22. return ""
  23. minimum = min(finite_series)
  24. maximum = max(finite_series)
  25. data_range = maximum - minimum
  26. if data_range == 0.0:
  27. # Graph a baseline if every input value is equal.
  28. return "".join([spark_chars[0] if isfinite(x) else " " for x in series])
  29. coefficient = (len(spark_chars) - 1.0) / data_range
  30. return "".join(
  31. [
  32. spark_chars[int(round((x - minimum) * coefficient))] if isfinite(x) else " "
  33. for x in series
  34. ]
  35. )