mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 23:21:59 +00:00
changed method name, updated pocketfft repo reference
This commit is contained in:
parent
62d69946eb
commit
ad99cb902f
2
.gitmodules
vendored
2
.gitmodules
vendored
@ -356,4 +356,4 @@
|
|||||||
url = https://github.com/aklomp/base64.git
|
url = https://github.com/aklomp/base64.git
|
||||||
[submodule "contrib/pocketfft"]
|
[submodule "contrib/pocketfft"]
|
||||||
path = contrib/pocketfft
|
path = contrib/pocketfft
|
||||||
url = https://gitlab.mpcdf.mpg.de/mtr/pocketfft.git
|
url = https://github.com/mreineck/pocketfft.git
|
||||||
|
2
contrib/pocketfft
vendored
2
contrib/pocketfft
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 128707fc745348d9dae5f1e37cd289aa31571dce
|
Subproject commit 9efd4da52cf8d28d14531d14e43ad9d913807546
|
@ -1,21 +1,23 @@
|
|||||||
---
|
---
|
||||||
slug: /en/sql-reference/functions/time-series-functions
|
slug: /en/sql-reference/functions/time-series-functions
|
||||||
sidebar_position: 140
|
sidebar_position: 172
|
||||||
sidebar_label: Time Series
|
sidebar_label: Time Series
|
||||||
---
|
---
|
||||||
|
|
||||||
# Time Series Functions
|
# Time Series Functions
|
||||||
|
|
||||||
Below functions are used for time series anlaysis.
|
Below functions are used for time series analysis.
|
||||||
|
|
||||||
## seriesPeriodDetect
|
## seriesPeriodDetectFFT
|
||||||
|
|
||||||
Finds the period of the given time series data
|
Finds the period of the given time series data using FFT
|
||||||
|
Detect Period in time series data using FFT.
|
||||||
|
FFT - Fast Fourier transform (https://en.wikipedia.org/wiki/Fast_Fourier_transform)
|
||||||
|
|
||||||
**Syntax**
|
**Syntax**
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
seriesPeriodDetect(series);
|
seriesPeriodDetectFFT(series);
|
||||||
```
|
```
|
||||||
|
|
||||||
**Arguments**
|
**Arguments**
|
||||||
@ -33,7 +35,7 @@ Type: [Float64](../../sql-reference/data-types/float.md).
|
|||||||
Query:
|
Query:
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
SELECT seriesPeriodDetect([1,4,6,1,4,6,1,4,6,1,4,6]) AS print_0;
|
SELECT seriesPeriodDetectFFT([1, 4, 6, 1, 4, 6, 1, 4, 6, 1, 4, 6, 1, 4, 6, 1, 4, 6, 1, 4, 6]) AS print_0;
|
||||||
```
|
```
|
||||||
|
|
||||||
Result:
|
Result:
|
||||||
|
@ -435,7 +435,9 @@ dbms_target_link_libraries(PRIVATE ch_contrib::zstd)
|
|||||||
target_link_libraries (clickhouse_common_io PUBLIC ch_contrib::zstd)
|
target_link_libraries (clickhouse_common_io PUBLIC ch_contrib::zstd)
|
||||||
target_link_libraries (clickhouse_common_io PUBLIC ch_contrib::xz)
|
target_link_libraries (clickhouse_common_io PUBLIC ch_contrib::xz)
|
||||||
|
|
||||||
target_link_libraries(clickhouse_common_io PUBLIC ch_contrib::pocketfft)
|
if (TARGET ch_contrib::pocketfft)
|
||||||
|
target_link_libraries(clickhouse_common_io PUBLIC ch_contrib::pocketfft)
|
||||||
|
endif ()
|
||||||
|
|
||||||
if (TARGET ch_contrib::icu)
|
if (TARGET ch_contrib::icu)
|
||||||
dbms_target_link_libraries (PRIVATE ch_contrib::icu)
|
dbms_target_link_libraries (PRIVATE ch_contrib::icu)
|
||||||
|
@ -43,7 +43,6 @@ list (APPEND PRIVATE_LIBS
|
|||||||
boost::filesystem
|
boost::filesystem
|
||||||
divide_impl
|
divide_impl
|
||||||
ch_contrib::xxHash
|
ch_contrib::xxHash
|
||||||
ch_contrib::pocketfft
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if (TARGET ch_rust::blake3)
|
if (TARGET ch_rust::blake3)
|
||||||
|
@ -1,9 +1,15 @@
|
|||||||
|
#ifdef __clang__
|
||||||
#pragma clang diagnostic push
|
#pragma clang diagnostic push
|
||||||
#pragma clang diagnostic ignored "-Wshadow"
|
#pragma clang diagnostic ignored "-Wshadow"
|
||||||
#pragma clang diagnostic ignored "-Wextra-semi-stmt"
|
#pragma clang diagnostic ignored "-Wextra-semi-stmt"
|
||||||
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
|
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "pocketfft_hdronly.h"
|
#include "pocketfft_hdronly.h"
|
||||||
|
|
||||||
|
#ifdef __clang__
|
||||||
#pragma clang diagnostic pop
|
#pragma clang diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <Columns/ColumnArray.h>
|
#include <Columns/ColumnArray.h>
|
||||||
@ -28,19 +34,17 @@ extern const int ILLEGAL_COLUMN;
|
|||||||
* 4. Inverse of the dominant frequency component is the period.
|
* 4. Inverse of the dominant frequency component is the period.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class FunctionSeriesPeriodDetect : public IFunction
|
class FunctionSeriesPeriodDetectFFT : public IFunction
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static constexpr auto name = "seriesPeriodDetect";
|
static constexpr auto name = "seriesPeriodDetectFFT";
|
||||||
|
|
||||||
static FunctionPtr create(ContextPtr) { return std::make_shared<FunctionSeriesPeriodDetect>(); }
|
static FunctionPtr create(ContextPtr) { return std::make_shared<FunctionSeriesPeriodDetectFFT>(); }
|
||||||
|
|
||||||
std::string getName() const override { return name; }
|
std::string getName() const override { return name; }
|
||||||
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
size_t getNumberOfArguments() const override { return 1; }
|
||||||
|
|
||||||
bool isVariadic() const override { return false; }
|
|
||||||
|
|
||||||
bool useDefaultImplementationForConstants() const override { return true; }
|
bool useDefaultImplementationForConstants() const override { return true; }
|
||||||
|
|
||||||
bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; }
|
bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; }
|
||||||
@ -86,14 +90,15 @@ public:
|
|||||||
|
|
||||||
size_t len = src_vec.size();
|
size_t len = src_vec.size();
|
||||||
if (len < 4)
|
if (len < 4)
|
||||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Atleast four data points are needed for function {}", getName());
|
throw Exception(ErrorCodes::BAD_ARGUMENTS, "At least four data points are needed for function {}", getName());
|
||||||
|
|
||||||
std::vector<Float64> src(src_vec.begin(), src_vec.end());
|
std::vector<Float64> src(src_vec.begin(), src_vec.end());
|
||||||
std::vector<std::complex<double>> out((len / 2) + 1);
|
std::vector<std::complex<double>> out((len / 2) + 1);
|
||||||
|
|
||||||
pocketfft::shape_t shape{static_cast<size_t>(len)};
|
pocketfft::shape_t shape{len};
|
||||||
|
|
||||||
pocketfft::shape_t axes;
|
pocketfft::shape_t axes;
|
||||||
|
axes.reserve(shape.size());
|
||||||
for (size_t i = 0; i < shape.size(); ++i)
|
for (size_t i = 0; i < shape.size(); ++i)
|
||||||
axes.push_back(i);
|
axes.push_back(i);
|
||||||
|
|
||||||
@ -128,8 +133,8 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_FUNCTION(SeriesPeriodDetect)
|
REGISTER_FUNCTION(SeriesPeriodDetectFFT)
|
||||||
{
|
{
|
||||||
factory.registerFunction<FunctionSeriesPeriodDetect>();
|
factory.registerFunction<FunctionSeriesPeriodDetectFFT>();
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,9 +1,9 @@
|
|||||||
SELECT seriesPeriodDetect([139, 87, 110, 68, 54, 50, 51, 53, 133, 86, 141, 97, 156, 94, 149, 95, 140, 77, 61, 50, 54, 47, 133, 72, 152, 94, 148, 105, 162, 101, 160, 87, 63, 53, 55, 54, 151, 103, 189, 108, 183, 113, 175, 113, 178, 90, 71, 62, 62, 65, 165, 109, 181, 115, 182, 121, 178, 114, 170]);
|
SELECT seriesPeriodDetectFFT([139, 87, 110, 68, 54, 50, 51, 53, 133, 86, 141, 97, 156, 94, 149, 95, 140, 77, 61, 50, 54, 47, 133, 72, 152, 94, 148, 105, 162, 101, 160, 87, 63, 53, 55, 54, 151, 103, 189, 108, 183, 113, 175, 113, 178, 90, 71, 62, 62, 65, 165, 109, 181, 115, 182, 121, 178, 114, 170]);
|
||||||
SELECT seriesPeriodDetect([10,20,30,10,20,30,10,20,30, 10,20,30,10,20,30,10,20,30,10,20,30]);
|
SELECT seriesPeriodDetectFFT([10,20,30,10,20,30,10,20,30, 10,20,30,10,20,30,10,20,30,10,20,30]);
|
||||||
SELECT seriesPeriodDetect([10.1, 20.45, 40.34, 10.1, 20.45, 40.34,10.1, 20.45, 40.34,10.1, 20.45, 40.34,10.1, 20.45, 40.34,10.1, 20.45, 40.34,10.1, 20.45, 40.34, 10.1, 20.45, 40.34]);
|
SELECT seriesPeriodDetectFFT([10.1, 20.45, 40.34, 10.1, 20.45, 40.34,10.1, 20.45, 40.34,10.1, 20.45, 40.34,10.1, 20.45, 40.34,10.1, 20.45, 40.34,10.1, 20.45, 40.34, 10.1, 20.45, 40.34]);
|
||||||
SELECT seriesPeriodDetect([10.1, 10, 400, 10.1, 10, 400, 10.1, 10, 400,10.1, 10, 400,10.1, 10, 400,10.1, 10, 400,10.1, 10, 400,10.1, 10, 400]);
|
SELECT seriesPeriodDetectFFT([10.1, 10, 400, 10.1, 10, 400, 10.1, 10, 400,10.1, 10, 400,10.1, 10, 400,10.1, 10, 400,10.1, 10, 400,10.1, 10, 400]);
|
||||||
SELECT seriesPeriodDetect([1,2,3]); -- { serverError BAD_ARGUMENTS}
|
SELECT seriesPeriodDetectFFT([1,2,3]); -- { serverError BAD_ARGUMENTS}
|
||||||
SELECT seriesPeriodDetect(); --{ serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH}
|
SELECT seriesPeriodDetectFFT(); --{ serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH}
|
||||||
SELECT seriesPeriodDetect([]); -- { serverError ILLEGAL_COLUMN}
|
SELECT seriesPeriodDetectFFT([]); -- { serverError ILLEGAL_COLUMN}
|
||||||
SELECT seriesPeriodDetect([NULL, NULL, NULL]); -- { serverError ILLEGAL_COLUMN}
|
SELECT seriesPeriodDetectFFT([NULL, NULL, NULL]); -- { serverError ILLEGAL_COLUMN}
|
||||||
SELECT seriesPeriodDetect([10,20,30,10,202,30,NULL]); -- { serverError ILLEGAL_COLUMN }
|
SELECT seriesPeriodDetectFFT([10,20,30,10,202,30,NULL]); -- { serverError ILLEGAL_COLUMN }
|
Loading…
Reference in New Issue
Block a user