20 package org.matsim.analysis;
22 import java.io.BufferedWriter;
23 import java.io.IOException;
24 import java.text.DecimalFormat;
25 import java.util.Collections;
26 import java.util.List;
27 import java.util.Vector;
29 import org.apache.logging.log4j.LogManager;
30 import org.apache.logging.log4j.Logger;
40 protected List<BinEntry>
entries =
new Vector<BinEntry>();
43 private final static Logger
log = LogManager.getLogger(
Bins.class);
45 public Bins(
double interval,
double maxVal, String desc) {
48 this.numberOfBins = (int)Math.ceil(maxVal / interval);
52 public void addValues(
double[] values,
double[] weights) {
53 for (
int index = 0; index < values.length; index++) {
54 this.
addVal(values[index], weights[index]);
58 public void addVal(
double value,
double weight) {
59 int index = (int)Math.floor(value / interval);
61 if (value >= maxVal) {
62 index = this.numberOfBins -1;
67 log.error(
"Value < 0.0 received");
71 this.bins[index] += weight;
72 this.entries.add(
new BinEntry(value, weight));
83 categories[i] = Integer.toString(i);
85 Double[] values =
new Double[this.entries.size()];
86 Double[] weights =
new Double[this.entries.size()];
88 for (
int index = 0; index < this.entries.size(); index++) {
89 values[index] = this.entries.get(index).getValue();
90 weights[index] = this.entries.get(index).getWeight();
93 DecimalFormat formatter =
new DecimalFormat(
"0.0000");
94 String s = xLabel +
" " +
95 "[interval = " + formatter.format(this.interval) + xUnit +
"]" +
96 "[number of entries = " + this.entries.size() +
"]" +
97 "[mean = " + formatter.format(this.
weightedMean(values, weights)) + xUnit +
"]" +
98 "[median = " + formatter.format(this.
median(values)) + xUnit +
"]" +
99 "[max = " + formatter.format(this.
getMax(values)) + xUnit +
"]";
102 new BarChart(desc, s ,
"#", categories);
104 chart.
saveAsPng(path + desc +
".png", 1600, 800);
108 out.write(
"Bin [interval = " + this.interval +
" " + xUnit +
"]\t" +
"#" +
"\n");
109 for (
int j = 0; j < bins.length; j++) {
110 out.write(j +
"\t" + bins[j] +
"\n");
114 }
catch (IOException e) {
132 private double median(Double [] values) {
133 List<Double> list =
new Vector<Double>();
135 Collections.addAll(list, values);
139 public double median(List<Double> values) {
141 if (values.size() == 0)
return 0.0;
143 Collections.sort(values);
144 if (values.size() % 2 != 0) {
145 return values.get((values.size()+1)/2-1);
148 double lower = values.get(values.size()/2-1);
149 double upper = values.get(values.size()/2);
150 return (lower + upper) / 2.0;
154 public double mean(List<Double> values) {
157 if (values.size() == 0)
return 0.0;
158 for (Double value : values) {
165 public double weightedMean(List<Double> values, List<Double> weights) {
166 return weightedMean(values.toArray(
new Double[values.size()]), weights.toArray(
new Double[weights.size()]));
170 double sumValues = 0.0;
171 double sumWeights = 0.0;
173 if (values.length == 0)
return 0.0;
175 if (values.length != weights.length ) {
176 log.info(
"size of weights and values not identical");
179 for (
int index = 0; index < values.length; index++) {
180 sumValues += (values[index] * weights[index]);
181 sumWeights += weights[index];
183 return sumValues / sumWeights;
186 public double getMax(List<Double> values) {
187 return getMax(values.toArray(
new Double[values.size()]));
191 double maxVal = Double.MIN_VALUE;
192 for (Double v : values) {
void setInterval(double interval)
double getMax(List< Double > values)
void plotBinnedDistribution(String path, String xLabel, String xUnit)
double median(Double [] values)
double getMax(Double[] values)
void addValues(double[] values, double[] weights)
static BufferedWriter getBufferedWriter(URL url, Charset charset, boolean append)
double weightedMean(Double[] values, Double[] weights)
double weightedMean(List< Double > values, List< Double > weights)
double median(List< Double > values)
Bins(double interval, double maxVal, String desc)
void saveAsPng(final String filename, final int width, final int height)
void addSeries(final String title, final double[] values)
void addVal(double value, double weight)
double mean(List< Double > values)
void setBins(double[] bins)