process.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from __future__ import print_function
  4. import shutil
  5. import fileinput
  6. def main(filename, bins, maximum):
  7. with open(filename) as f:
  8. content = f.read().split("\n")
  9. numbers = []
  10. for line in content:
  11. line = line.strip()
  12. if line != "":
  13. numbers.append(float(line))
  14. numbers = sorted(numbers)
  15. minimum = min(numbers)
  16. bin_counter = [0 for i in range(bins+1)]
  17. borders = []
  18. for i, number in enumerate(numbers):
  19. if number >= minimum + (maximum - minimum)/bins*(bins+1):
  20. bin_counter[bins] += 1
  21. elif number < minimum:
  22. bin_counter[0] += 1
  23. else:
  24. for b in range(bins):
  25. lower = minimum + (maximum - minimum)/bins*b
  26. upper = minimum + (maximum - minimum)/bins*(b+1)
  27. if lower <= number < upper:
  28. bin_counter[b] += 1
  29. break
  30. for b in range(bins):
  31. lower = minimum + (maximum - minimum)/bins*b
  32. borders.append(str(lower))
  33. borders.append("\infty")
  34. return bin_counter, borders
  35. def modify_template(bin_counter, borders):
  36. shutil.copyfile("histogram-large-1d-dataset.template.tex",
  37. "histogram-large-1d-dataset.tex")
  38. xticklabels = ", ".join(map(lambda n: "$%s$" % n, borders))
  39. coordinates = ""
  40. for i, value in enumerate(bin_counter):
  41. coordinates += "(%i, %i) " % (i, value)
  42. for line in fileinput.input("histogram-large-1d-dataset.tex",
  43. inplace=True):
  44. line = line.replace("{{xticklabels}}", xticklabels)
  45. line = line.replace("{{coordinates}}", coordinates)
  46. print(line, end='')
  47. if __name__ == '__main__':
  48. from argparse import ArgumentParser
  49. parser = ArgumentParser()
  50. parser.add_argument("-f", "--file", dest="filename",
  51. default="1ddata.txt",
  52. help="use FILE as input data", metavar="FILE")
  53. parser.add_argument("-b", "--bins", dest="bins", type=int,
  54. default=15,
  55. help="how many bins should be used")
  56. parser.add_argument("-m", "--max", dest="max", type=float,
  57. default=15000,
  58. help=("what is the maximum number "
  59. "that should get binned?"))
  60. args = parser.parse_args()
  61. bin_counter, borders = main(args.filename, args.bins, args.max)
  62. modify_template(bin_counter, borders)