SQLite ドキュメントを検索しましたが、何も見つかりませんでしたが、Google でも検索したところ、いくつかの結果が表示されました。
SQLite には標準偏差関数が組み込まれていますか?
SQLite ドキュメントを検索しましたが、何も見つかりませんでしたが、Google でも検索したところ、いくつかの結果が表示されました。
SQLite には標準偏差関数が組み込まれていますか?
SQL で分散を計算できます。
create table t (row int);
insert into t values (1),(2),(3);
SELECT AVG((t.row - sub.a) * (t.row - sub.a)) as var from t,
(SELECT AVG(row) AS a FROM t) AS sub;
0.666666666666667
ただし、標準偏差を取得するには平方根を計算する必要があります。
SQLite でサポートされている集計関数は次のとおりです。
http://www.sqlite.org/lang_aggfunc.html
STDEV はリストにありません。
ただし、このページextension-functions.c
のモジュールには STDEV 関数が含まれています。
分散式 V(X) = E(X^2) - E(X)^2 を使用します。SQL sqlite では
SELECT AVG(col*col) - AVG(col)*AVG(col) FROM table
標準偏差を取得するには、平方根 V(X)^(1/2) を取る必要があります
Welford 法( と同じextension-functions.c
) を SQLite UDF として実装しました。
$db->sqliteCreateAggregate('stdev',
function (&$context, $row, $data) // step callback
{
if (isset($context) !== true) // $context is null at first
{
$context = array
(
'k' => 0,
'm' => 0,
's' => 0,
);
}
if (isset($data) === true) // the standard is non-NULL values only
{
$context['s'] += ($data - $context['m']) * ($data - ($context['m'] += ($data - $context['m']) / ++$context['k']));
}
return $context;
},
function (&$context, $row) // fini callback
{
if ($context['k'] > 0) // return NULL if no non-NULL values exist
{
return sqrt($context['s'] / $context['k']);
}
return null;
},
1);
これは PHP ($db
は PDO オブジェクト) にありますが、別の言語に移植するのは簡単です。
SQLite はとてもクールです。<3
ちょっとしたトリック
select ((sum(value)*sum(value) - sum(value * value))/((count(*)-1)*(count(*))))
from the_table ;
あとは外でsqrtを計算するだけです。
いいえ、私はこの同じ問題を検索し、アプリケーション (PHP) で計算を行う必要がなくなりました
Python 関数にいくつかのエラー検出を追加しました
class StdevFunc:
"""
For use as an aggregate function in SQLite
"""
def __init__(self):
self.M = 0.0
self.S = 0.0
self.k = 0
def step(self, value):
try:
# automatically convert text to float, like the rest of SQLite
val = float(value) # if fails, skips this iteration, which also ignores nulls
tM = self.M
self.k += 1
self.M += ((val - tM) / self.k)
self.S += ((val - tM) * (val - self.M))
except:
pass
def finalize(self):
if self.k <= 1: # avoid division by zero
return none
else:
return math.sqrt(self.S / (self.k-1))