28 : mStatistics( stats )
41 mFirst = std::numeric_limits<double>::quiet_NaN();
42 mLast = std::numeric_limits<double>::quiet_NaN();
48 mMin = std::numeric_limits<double>::max();
49 mMax = -std::numeric_limits<double>::max();
76 for (
const double value : values )
90 mMin = std::min( mMin, value );
91 mMax = std::max( mMax, value );
95 mValueCount.insert( value, mValueCount.value( value, 0 ) + 1 );
97 if ( mRequiresAllValueStorage )
103 bool convertOk =
false;
104 if ( !value.isValid() || value.isNull() )
108 const double val = value.toDouble( &convertOk );
120 mFirst = std::numeric_limits<double>::quiet_NaN();
121 mLast = std::numeric_limits<double>::quiet_NaN();
122 mMin = std::numeric_limits<double>::quiet_NaN();
123 mMax = std::numeric_limits<double>::quiet_NaN();
124 mMean = std::numeric_limits<double>::quiet_NaN();
125 mMedian = std::numeric_limits<double>::quiet_NaN();
126 mStdev = std::numeric_limits<double>::quiet_NaN();
127 mSampleStdev = std::numeric_limits<double>::quiet_NaN();
128 mMinority = std::numeric_limits<double>::quiet_NaN();
129 mMajority = std::numeric_limits<double>::quiet_NaN();
130 mFirstQuartile = std::numeric_limits<double>::quiet_NaN();
131 mThirdQuartile = std::numeric_limits<double>::quiet_NaN();
135 mMean = mSum / mCount;
139 double sumSquared = 0;
140 const auto constMValues = mValues;
141 for (
const double value : constMValues )
143 const double diff = value - mMean;
144 sumSquared += diff * diff;
146 mStdev = std::pow( sumSquared / mValues.count(), 0.5 );
147 mSampleStdev = std::pow( sumSquared / ( mValues.count() - 1 ), 0.5 );
155 std::sort( mValues.begin(), mValues.end() );
156 const bool even = ( mCount % 2 ) < 1;
159 mMedian = ( mValues[mCount / 2 - 1] + mValues[mCount / 2] ) / 2.0;
163 mMedian = mValues[( mCount + 1 ) / 2 - 1];
170 if ( ( mCount % 2 ) < 1 )
172 const int halfCount = mCount / 2;
173 const bool even = ( halfCount % 2 ) < 1;
176 mFirstQuartile = ( mValues[halfCount / 2 - 1] + mValues[halfCount / 2] ) / 2.0;
180 mFirstQuartile = mValues[( halfCount + 1 ) / 2 - 1];
185 const int halfCount = mCount / 2 + 1;
186 const bool even = ( halfCount % 2 ) < 1;
189 mFirstQuartile = ( mValues[halfCount / 2 - 1] + mValues[halfCount / 2] ) / 2.0;
193 mFirstQuartile = mValues[( halfCount + 1 ) / 2 - 1];
201 if ( ( mCount % 2 ) < 1 )
203 const int halfCount = mCount / 2;
204 const bool even = ( halfCount % 2 ) < 1;
207 mThirdQuartile = ( mValues[ halfCount + halfCount / 2 - 1] + mValues[ halfCount + halfCount / 2] ) / 2.0;
211 mThirdQuartile = mValues[( halfCount + 1 ) / 2 - 1 + halfCount ];
216 const int halfCount = mCount / 2 + 1;
217 const bool even = ( halfCount % 2 ) < 1;
220 mThirdQuartile = ( mValues[ halfCount + halfCount / 2 - 2 ] + mValues[ halfCount + halfCount / 2 - 1 ] ) / 2.0;
224 mThirdQuartile = mValues[( halfCount + 1 ) / 2 - 2 + halfCount ];
231 QList<int> valueCounts = mValueCount.values();
235 mMinority = mValueCount.key( *std::min_element( valueCounts.begin(), valueCounts.end() ) );
239 mMajority = mValueCount.key( *std::max_element( valueCounts.begin(), valueCounts.end() ) );
280 return mValueCount.count();
282 return mFirstQuartile;
284 return mThirdQuartile;
286 return mThirdQuartile - mFirstQuartile;
302 return QObject::tr(
"Count" );
304 return QObject::tr(
"Count (missing)" );
306 return QObject::tr(
"Sum" );
308 return QObject::tr(
"Mean" );
310 return QObject::tr(
"Median" );
312 return QObject::tr(
"St dev (pop)" );
314 return QObject::tr(
"St dev (sample)" );
316 return QObject::tr(
"Minimum" );
318 return QObject::tr(
"Maximum" );
320 return QObject::tr(
"Range" );
322 return QObject::tr(
"Minority" );
324 return QObject::tr(
"Majority" );
326 return QObject::tr(
"Variety" );
328 return QObject::tr(
"Q1" );
330 return QObject::tr(
"Q3" );
332 return QObject::tr(
"IQR" );
334 return QObject::tr(
"First" );
336 return QObject::tr(
"Last" );
348 return QStringLiteral(
"count" );
350 return QStringLiteral(
"countmissing" );
352 return QStringLiteral(
"sum" );
354 return QStringLiteral(
"mean" );
356 return QStringLiteral(
"median" );
358 return QStringLiteral(
"stdev" );
360 return QStringLiteral(
"stdevsample" );
362 return QStringLiteral(
"min" );
364 return QStringLiteral(
"max" );
366 return QStringLiteral(
"range" );
368 return QStringLiteral(
"minority" );
370 return QStringLiteral(
"majority" );
372 return QStringLiteral(
"variety" );
374 return QStringLiteral(
"q1" );
376 return QStringLiteral(
"q3" );
378 return QStringLiteral(
"iqr" );
380 return QStringLiteral(
"first" );
382 return QStringLiteral(
"last" );
void addVariant(const QVariant &value)
Adds a single value to the statistics calculation.
void calculate(const QList< double > &values)
Calculates summary statistics for a list of values.
Statistic
Enumeration of flags that specify statistics to be calculated.
@ InterQuartileRange
Inter quartile range (IQR)
@ Median
Median of values.
@ Variety
Variety (count of distinct) values.
@ First
First value (since QGIS 3.6)
@ Last
Last value (since QGIS 3.6)
@ Minority
Minority of values.
@ ThirdQuartile
Third quartile.
@ Majority
Majority of values.
@ CountMissing
Number of missing (null) values.
@ Range
Range of values (max - min)
@ StDevSample
Sample standard deviation of values.
@ FirstQuartile
First quartile.
@ StDev
Standard deviation of values.
void addValue(double value)
Adds a single value to the statistics calculation.
static QString shortName(QgsStatisticalSummary::Statistic statistic)
Returns a short, friendly display name for a statistic, suitable for use in a field name.
double statistic(QgsStatisticalSummary::Statistic stat) const
Returns the value of a specified statistic.
QgsStatisticalSummary(QgsStatisticalSummary::Statistics stats=QgsStatisticalSummary::All)
Constructor for QgsStatisticalSummary.
void reset()
Resets the calculated values.
void setStatistics(QgsStatisticalSummary::Statistics stats)
Sets flags which specify which statistics will be calculated.
void finalize()
Must be called after adding all values with addValues() and before retrieving any calculated statisti...
static QString displayName(QgsStatisticalSummary::Statistic statistic)
Returns the friendly display name for a statistic.