Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
### Added

- Added support for the new license key format. A proprietary key can now grant a subset of the library: a function your key does not include evaluates to a `#LIC!` error, and the matching parts of the API throw a `LicenseCapabilityMissingError`. `getAvailableFunctions()` and `getFunctionDetails()` describe only the functions your key includes. [#1728](https://github.com/handsontable/hyperformula/pull/1728)
- Added a new function: RANK.AVG. [#1787](https://github.com/handsontable/hyperformula/pull/1787)

### Changed

Expand Down
1 change: 1 addition & 0 deletions src/i18n/languages/csCZ.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ const dictionary: RawTranslationPackage = {
PERCENTILE: 'PERCENTIL',
'PERCENTILE.INC': 'PERCENTIL.INC',
'PERCENTILE.EXC': 'PERCENTIL.EXC',
'RANK.AVG': 'RANK.AVG',
QUARTILE: 'QUARTIL',
'QUARTILE.INC': 'QUARTIL.INC',
'QUARTILE.EXC': 'QUARTIL.EXC',
Expand Down
1 change: 1 addition & 0 deletions src/i18n/languages/daDK.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ const dictionary: RawTranslationPackage = {
PERCENTILE: 'FRAKTIL',
'PERCENTILE.INC': 'FRAKTIL.MEDTAG',
'PERCENTILE.EXC': 'FRAKTIL.UDELAD',
'RANK.AVG': 'RANK.AVG',
QUARTILE: 'KVARTIL',
'QUARTILE.INC': 'KVARTIL.MEDTAG',
'QUARTILE.EXC': 'KVARTIL.UDELAD',
Expand Down
1 change: 1 addition & 0 deletions src/i18n/languages/deDE.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ const dictionary: RawTranslationPackage = {
PERCENTILE: 'QUANTIL',
'PERCENTILE.INC': 'QUANTIL.INKL',
'PERCENTILE.EXC': 'QUANTIL.EXKL',
'RANK.AVG': 'RANK.AVG',
QUARTILE: 'QUARTILE',
'QUARTILE.INC': 'QUARTILE.INKL',
'QUARTILE.EXC': 'QUARTILE.EXKL',
Expand Down
1 change: 1 addition & 0 deletions src/i18n/languages/enGB.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ const dictionary: RawTranslationPackage = {
PERCENTILE: 'PERCENTILE',
'PERCENTILE.INC': 'PERCENTILE.INC',
'PERCENTILE.EXC': 'PERCENTILE.EXC',
'RANK.AVG': 'RANK.AVG',
QUARTILE: 'QUARTILE',
'QUARTILE.INC': 'QUARTILE.INC',
'QUARTILE.EXC': 'QUARTILE.EXC',
Expand Down
1 change: 1 addition & 0 deletions src/i18n/languages/esES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ export const dictionary: RawTranslationPackage = {
PERCENTILE: 'PERCENTIL',
'PERCENTILE.INC': 'PERCENTIL.INC',
'PERCENTILE.EXC': 'PERCENTIL.EXC',
'RANK.AVG': 'RANK.AVG',
QUARTILE: 'CUARTIL',
'QUARTILE.INC': 'CUARTIL.INC',
'QUARTILE.EXC': 'CUARTIL.EXC',
Expand Down
1 change: 1 addition & 0 deletions src/i18n/languages/fiFI.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ const dictionary: RawTranslationPackage = {
PERCENTILE: 'PROSENTTIPISTE',
'PERCENTILE.INC': 'PROSENTTIPISTE.SIS',
'PERCENTILE.EXC': 'PROSENTTIPISTE.ULK',
'RANK.AVG': 'RANK.AVG',
QUARTILE: 'NELJÄNNES',
'QUARTILE.INC': 'NELJÄNNES.SIS',
'QUARTILE.EXC': 'NELJÄNNES.ULK',
Expand Down
1 change: 1 addition & 0 deletions src/i18n/languages/frFR.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ const dictionary: RawTranslationPackage = {
PERCENTILE: 'CENTILE',
'PERCENTILE.INC': 'CENTILE.INCLURE',
'PERCENTILE.EXC': 'CENTILE.EXCLURE',
'RANK.AVG': 'RANK.AVG',
QUARTILE: 'QUARTILE',
'QUARTILE.INC': 'QUARTILE.INCLURE',
'QUARTILE.EXC': 'QUARTILE.EXCLURE',
Expand Down
1 change: 1 addition & 0 deletions src/i18n/languages/huHU.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ const dictionary: RawTranslationPackage = {
PERCENTILE: 'PERCENTILIS',
'PERCENTILE.INC': 'PERCENTILIS.TARTALMAZ',
'PERCENTILE.EXC': 'PERCENTILIS.KIZÁR',
'RANK.AVG': 'RANK.AVG',
QUARTILE: 'KVARTILIS',
'QUARTILE.INC': 'KVARTILIS.TARTALMAZ',
'QUARTILE.EXC': 'KVARTILIS.KIZÁR',
Expand Down
1 change: 1 addition & 0 deletions src/i18n/languages/idID.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ const dictionary: RawTranslationPackage = {
PERCENTILE: 'PERCENTILE',
'PERCENTILE.INC': 'PERCENTILE.INC',
'PERCENTILE.EXC': 'PERCENTILE.EXC',
'RANK.AVG': 'RANK.AVG',
QUARTILE: 'QUARTILE',
'QUARTILE.INC': 'QUARTILE.INC',
'QUARTILE.EXC': 'QUARTILE.EXC',
Expand Down
1 change: 1 addition & 0 deletions src/i18n/languages/itIT.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ const dictionary: RawTranslationPackage = {
PERCENTILE: 'PERCENTILE',
'PERCENTILE.INC': 'INC.PERCENTILE',
'PERCENTILE.EXC': 'ESC.PERCENTILE',
'RANK.AVG': 'RANK.AVG',
QUARTILE: 'QUARTILE',
'QUARTILE.INC': 'INC.QUARTILE',
'QUARTILE.EXC': 'ESC.QUARTILE',
Expand Down
1 change: 1 addition & 0 deletions src/i18n/languages/nbNO.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ const dictionary: RawTranslationPackage = {
PERCENTILE: 'PERSENTIL',
'PERCENTILE.INC': 'PERSENTIL.INK',
'PERCENTILE.EXC': 'PERSENTIL.EKS',
'RANK.AVG': 'RANK.AVG',
QUARTILE: 'KVARTIL',
'QUARTILE.INC': 'KVARTIL.INK',
'QUARTILE.EXC': 'KVARTIL.EKS',
Expand Down
1 change: 1 addition & 0 deletions src/i18n/languages/nlNL.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ const dictionary: RawTranslationPackage = {
PERCENTILE: 'PERCENTIEL',
'PERCENTILE.INC': 'PERCENTIEL.INC',
'PERCENTILE.EXC': 'PERCENTIEL.EXC',
'RANK.AVG': 'RANK.AVG',
QUARTILE: 'KWARTIEL',
'QUARTILE.INC': 'KWARTIEL.INC',
'QUARTILE.EXC': 'KWARTIEL.EXC',
Expand Down
1 change: 1 addition & 0 deletions src/i18n/languages/plPL.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ const dictionary: RawTranslationPackage = {
PERCENTILE: 'PERCENTYL',
'PERCENTILE.INC': 'PERCENTYL.PRZEDZ.ZAMK',
'PERCENTILE.EXC': 'PERCENTYL.PRZEDZ.OTW',
'RANK.AVG': 'RANK.AVG',
QUARTILE: 'KWARTYL',
'QUARTILE.INC': 'KWARTYL.PRZEDZ.ZAMK',
'QUARTILE.EXC': 'KWARTYL.PRZEDZ.OTW',
Expand Down
1 change: 1 addition & 0 deletions src/i18n/languages/ptPT.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ const dictionary: RawTranslationPackage = {
PERCENTILE: 'PERCENTIL',
'PERCENTILE.INC': 'PERCENTIL.INC',
'PERCENTILE.EXC': 'PERCENTIL.EXC',
'RANK.AVG': 'RANK.AVG',
QUARTILE: 'QUARTIL',
'QUARTILE.INC': 'QUARTIL.INC',
'QUARTILE.EXC': 'QUARTIL.EXC',
Expand Down
1 change: 1 addition & 0 deletions src/i18n/languages/ruRU.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ const dictionary: RawTranslationPackage = {
PERCENTILE: 'ПЕРСЕНТИЛЬ',
'PERCENTILE.INC': 'ПРОЦЕНТИЛЬ.ВКЛ',
'PERCENTILE.EXC': 'ПРОЦЕНТИЛЬ.ИСКЛ',
'RANK.AVG': 'RANK.AVG',
QUARTILE: 'КВАРТИЛЬ',
'QUARTILE.INC': 'КВАРТИЛЬ.ВКЛ',
'QUARTILE.EXC': 'КВАРТИЛЬ.ИСКЛ',
Expand Down
1 change: 1 addition & 0 deletions src/i18n/languages/svSE.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ const dictionary: RawTranslationPackage = {
PERCENTILE: 'PERCENTIL',
'PERCENTILE.INC': 'PERCENTIL.INK',
'PERCENTILE.EXC': 'PERCENTIL.EXK',
'RANK.AVG': 'RANK.AVG',
QUARTILE: 'KVARTIL',
'QUARTILE.INC': 'KVARTIL.INK',
'QUARTILE.EXC': 'KVARTIL.EXK',
Expand Down
1 change: 1 addition & 0 deletions src/i18n/languages/trTR.ts
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ const dictionary: RawTranslationPackage = {
PERCENTILE: 'YÜZDEBİRLİK',
'PERCENTILE.INC': 'YÜZDEBİRLİK.DHL',
'PERCENTILE.EXC': 'YÜZDEBİRLİK.HRC',
'RANK.AVG': 'RANK.AVG',
QUARTILE: 'DÖRTTEBİRLİK',
'QUARTILE.INC': 'DÖRTTEBİRLİK.DHL',
'QUARTILE.EXC': 'DÖRTTEBİRLİK.HRC',
Expand Down
7 changes: 7 additions & 0 deletions src/interpreter/functionMetadata/categories/statistical.ts
Original file line number Diff line number Diff line change
Expand Up @@ -430,6 +430,13 @@ export const STATISTICAL_DOCS: Record<string, FunctionDoc> = {
documentationUrl: 'https://hyperformula.handsontable.com/docs/guide/built-in-functions.html',
examples: ['=POISSON.DIST(3, 5, FALSE())', '=POISSON.DIST(3, 5, TRUE())'],
},
'RANK.AVG': {
category: 'Statistical',
shortDescription: 'Returns the rank of a number in a range of numbers; tied values get the average of their ranks.',
parameters: [{name: 'number', description: 'The number whose rank to find.'}, {name: 'ref', description: 'The range of numbers to rank within; non-numeric cells are ignored.'}, {name: 'order', description: 'Optional. 0 or omitted ranks in descending order; any other number ranks in ascending order.'}],
documentationUrl: 'https://hyperformula.handsontable.com/docs/guide/built-in-functions.html',
examples: ['=RANK.AVG(A2, A1:A10)', '=RANK.AVG(A2, A1:A10, 1)'],
},
'QUARTILE.EXC': {
category: 'Statistical',
shortDescription: 'Returns the quartile of a data set, based on exclusive percentile values.',
Expand Down
34 changes: 34 additions & 0 deletions src/interpreter/plugin/MedianPlugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,14 @@ export class MedianPlugin extends FunctionPlugin implements FunctionPluginTypech
{argumentType: FunctionArgumentType.NUMBER, minValue: 1},
],
},
'RANK.AVG': {
method: 'rankAvg',
parameters: [
{argumentType: FunctionArgumentType.NUMBER},
{argumentType: FunctionArgumentType.RANGE},
{argumentType: FunctionArgumentType.NUMBER, optionalArg: true, defaultValue: 0},
],
},
}

/**
Expand Down Expand Up @@ -100,4 +108,30 @@ export class MedianPlugin extends FunctionPlugin implements FunctionPluginTypech
}
)
}

/**
* Corresponds to RANK.AVG(number, ref, [order]).
*
* Returns the rank of a number in a range of numbers. Tied values get the average of the ranks they span.
* The rank is descending when order is 0 or omitted, and ascending for any other order.
*
* @param ast
* @param state
*/
public rankAvg(ast: ProcedureAst, state: InterpreterState): InterpreterValue {
return this.runFunction(ast.args, state, this.metadata('RANK.AVG'),
(value: number, range: SimpleRangeValue, order: number) => {
const vals = this.arithmeticHelper.manyToExactNumbers(range.valuesFromTopLeftCorner())
if (vals instanceof CellError) {
return vals
}
const ties = vals.filter(val => val === value).length
if (ties === 0) {
return new CellError(ErrorType.NA, ErrorMessage.ValueNotFound)
}
const ranksBefore = vals.filter(val => order === 0 ? val > value : val < value).length
return ranksBefore + (ties + 1) / 2
}
)
}
}
2 changes: 1 addition & 1 deletion src/license/functionCapabilities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ const UNGROUPED_FUNCTIONS = [
'ISREF', 'LCM', 'LOG10', 'LOGNORM.DIST', 'LOGNORM.INV', 'MAXA', 'MAXPOOL', 'MEDIANPOOL', 'MINA', 'MIRR',
'MMULT', 'MULTINOMIAL', 'NEGBINOM.DIST', 'NETWORKDAYS.INTL', 'NOMINAL', 'NORM.DIST', 'NORM.INV',
'NORM.S.DIST', 'NORM.S.INV', 'NPER', 'OCT2BIN', 'OCT2DEC', 'OCT2HEX', 'PDURATION', 'PERCENTILE.EXC',
'PHI', 'POISSON.DIST', 'QUARTILE.EXC', 'QUARTILE.INC', 'RADIANS', 'ROMAN', 'RRI', 'RSQ', 'SEC', 'SECH',
'PHI', 'POISSON.DIST', 'QUARTILE.EXC', 'QUARTILE.INC', 'RADIANS', 'RANK.AVG', 'ROMAN', 'RRI', 'RSQ', 'SEC', 'SECH',
'SERIESSUM', 'SHEET', 'SHEETS', 'SINH', 'SKEW', 'SKEW.P', 'SLOPE', 'SPLIT', 'SQRTPI', 'STANDARDIZE',
'STEYX', 'SUMX2MY2', 'SUMX2PY2', 'SYD', 'T.DIST', 'T.DIST.2T', 'T.DIST.RT', 'T.INV', 'T.INV.2T', 'T.TEST',
'TANH', 'TBILLEQ', 'TBILLPRICE', 'TBILLYIELD', 'TDIST', 'TIMEVALUE', 'UNICODE', 'VARA', 'VARPA',
Expand Down
Loading