SlideShare una empresa de Scribd logo
1 de 12
Descargar para leer sin conexión
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 1
PL/Pythonで独⾃の集約関数を
作ってみる
アップタイム・テクノロジーズ
永安 悟史
第6回 PostgreSQLアンカンファレンス
⽬次
• なぜPL/Pythonで集約関数なのか?
• PostgreSQLにおける集約関数の作り⽅
• PL/Pythonの関数の作り⽅
• min(),max(),avg()を実装してみる
• 単回帰分析を⾏う集約関数を実装してみる
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 2
なぜPL/Pythonで集約関数なのか?
• Pythonとデータ処理
• データ処理と集約関数
• プロシージャ・UDFによるIn-Database処理
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 3
PostgreSQLにおける集約関数の作り⽅
• CREATE AGGREGATEコマンドによる定義
– 実⾏中の内部状態を処理するUDF:sfunc
– 内部状態を保持するデータ型:state_data_type
– 最終的な結果を出⼒するUDF:ffunc
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 4
CREATE AGGREGATE myagg (arg1, arg2, ...)
(
SFUNC = sfunc,
STYPE = state_data_type,
FINALFUNC = ffunc
);
ユーザ定義の集約
https://www.postgresql.jp/document/9.4/html/xaggr.html
CREATE AGGREGATE
https://www.postgresql.jp/document/9.4/html/sql-createaggregate.html
sfunc
args
state
sfunc
args
state
ffunc
return
PL/Pythonの関数の作り⽅
• CREATE FUNCTION
– 単に中⾝がPythonスクリプトになるだけ
• データベースにアクセスする場合には plpy モジュール
– CのUDFで⾔うところのSPI関数のようなもの
– import plpy
• 注意すべきところ
– plpython.soからリンクされているPythonのバージョン
– データの相互マッピング(+エンコーディング)
– ステート変数の global 宣⾔(変更するには global が必要。後述)
– そもそも superuser しか使えない(untrusted なので)
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 5
PL/Python - Python⼿続き⾔語
https://www.postgresql.jp/document/9.4/html/plpython.html
PL/Pythonの関数の作り⽅
• 外部のPythonモジュールを使うUDFの例
– ⽇本語⾃動要約ライブラリ
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 6
⾃動要約API「summpy」を使ってPostgreSQLに⽂章の要約機能を追加する
http://pgsqldeepdive.blogspot.jp/2015/11/pgsummpy.html
CREATE FUNCTION lexrank_summarize(p text, t text, s_limit integer)
RETURNS SETOF text
AS $$
import sys
sys.path.append(p)
from summpy import lexrank
res = lexrank.summarize(unicode(t, 'utf‐8'), sent_limit=s_limit)
for s in res:
yield(s.encode('utf‐8'))
$$ LANGUAGE plpythonu;
min(),max(),avg()を実装してみる
• 組み込みのmin(), max(), avg() の機能を再現
– 集約関数名は pymin(), pymax(), pyavg()
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 7
‐‐ min()
‐‐ sがstate変数、nが入力値、最後の計算は不要なのでffuncは無し
CREATE FUNCTION float8_pymin(s float8, n float8)
RETURNS float8
AS $$
global s
if n is not None:
if s is None or n < s:
s = n
return s
$$ LANGUAGE plpython2u;
CREATE AGGREGATE pymin (float8)
(
sfunc = float8_pymin,
stype = float8
);
min(),max(),avg()を実装してみる
• avg() のPL/Python実装
– ffunc を追加して、最後に平均値を計算して出⼒
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 8
‐‐
‐‐ avg()
‐‐
CREATE FUNCTION float8_pyavg(
s float8[], n float8)
RETURNS float8[]
AS $$
global s
if n is not None:
if s is None:
# sum,count
s = [0,0]
s[0] = s[0] + n
s[1] = s[1] + 1
return s
$$ LANGUAGE plpython2u;
CREATE FUNCTION float8_pyavg_final(
s float8[])
RETURNS float8
AS $$
global s
if s is not None:
return s[0]/s[1]
return None
$$ LANGUAGE plpython2u;
CREATE AGGREGATE pyavg (float8)
(
sfunc = float8_pyavg,
stype = float8[],
finalfunc = float8_pyavg_final
);
pyagg.sql https://gist.github.com/snaga/7c3940e72fad172cca6f
単回帰分析を⾏う集約関数を実装してみる
• 単回帰分析のモデルは y = w0 + w1 * x
• データを⼆種類⽤意する(訓練⽤、評価⽤)
• 訓練⽤データのテーブルから y と x を拾う
– w0 と w1 を集約関数で計算して出⼒する
• 別のテーブルの評価⽤データの x から y を予測する
• 結果および誤差を確認する
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 9
Machine Learning: Regression - University of Washington | Coursera
https://www.coursera.org/learn/ml-regression/
単回帰分析を⾏う集約関数を実装してみる
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 10
snaga=# ¥d
List of relations
Schema |        Name         | Type  | Owner
‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐+‐‐‐‐‐‐‐
public | kc_house_data | table | snaga
public | kc_house_test_data | table | snaga
public | kc_house_train_data | table | snaga
(3 rows)
snaga=# select simple_linear_regression(price,sqft_living) from 
kc_house_train_data;
simple_linear_regression
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
{‐47116.0791388,281.958839662}
(1 row)
• デモ
snaga/SimpleLinearRegression
https://github.com/snaga/SimpleLinearRegression
単回帰分析を⾏う集約関数を実装してみる
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 11
snaga=# select sqft_living,
price,
round(‐47116.0791388 + 281.958839662 * sqft_living) as 
price_predicted,
round((((‐47116.0791388 + 281.958839662 * sqft_living) ‐ price) / 
price)::numeric, 2) as error
from kc_house_test_data;
sqft_living | price  | price_predicted | error
‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐
1430 | 310000 |          356085 |  0.15
2950 | 650000 |          784662 |  0.21
1710 | 233000 |          435034 |  0.87
(...)
2310 | 400000 |          604209 |  0.51
1020 | 402101 |          240482 | ‐0.40
(4229 rows)
• デモ
snaga/SimpleLinearRegression
https://github.com/snaga/SimpleLinearRegression
Q&A
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 12
コメント、質問など
Twitter: @snaga
E-Mail: snaga@uptime.jp

Más contenido relacionado

La actualidad más candente

組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
 

La actualidad más candente (20)

高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
BPF Internals (eBPF)
BPF Internals (eBPF)BPF Internals (eBPF)
BPF Internals (eBPF)
 
Deep Dive into the Linux Kernel - メモリ管理におけるCompaction機能について
Deep Dive into the Linux Kernel - メモリ管理におけるCompaction機能についてDeep Dive into the Linux Kernel - メモリ管理におけるCompaction機能について
Deep Dive into the Linux Kernel - メモリ管理におけるCompaction機能について
 
Vivado hls勉強会5(axi4 stream)
Vivado hls勉強会5(axi4 stream)Vivado hls勉強会5(axi4 stream)
Vivado hls勉強会5(axi4 stream)
 
Topology Managerについて / Kubernetes Meetup Tokyo 50
Topology Managerについて / Kubernetes Meetup Tokyo 50Topology Managerについて / Kubernetes Meetup Tokyo 50
Topology Managerについて / Kubernetes Meetup Tokyo 50
 
SR-IOV Networking in OpenStack - OpenStack最新情報セミナー 2016年3月
SR-IOV Networking in OpenStack - OpenStack最新情報セミナー 2016年3月SR-IOV Networking in OpenStack - OpenStack最新情報セミナー 2016年3月
SR-IOV Networking in OpenStack - OpenStack最新情報セミナー 2016年3月
 
OpenStackを利用したNFVの商用化 - OpenStack最新情報セミナー 2017年7月
OpenStackを利用したNFVの商用化 - OpenStack最新情報セミナー 2017年7月OpenStackを利用したNFVの商用化 - OpenStack最新情報セミナー 2017年7月
OpenStackを利用したNFVの商用化 - OpenStack最新情報セミナー 2017年7月
 
L3HA-VRRP-20141201
L3HA-VRRP-20141201L3HA-VRRP-20141201
L3HA-VRRP-20141201
 
ネットワークOS野郎 ~ インフラ野郎Night 20160414
ネットワークOS野郎 ~ インフラ野郎Night 20160414ネットワークOS野郎 ~ インフラ野郎Night 20160414
ネットワークOS野郎 ~ インフラ野郎Night 20160414
 
FizzBuzzで学ぶJavaの進化
FizzBuzzで学ぶJavaの進化FizzBuzzで学ぶJavaの進化
FizzBuzzで学ぶJavaの進化
 
[D20] 高速Software Switch/Router 開発から得られた高性能ソフトウェアルータ・スイッチ活用の知見 (July Tech Fest...
[D20] 高速Software Switch/Router 開発から得られた高性能ソフトウェアルータ・スイッチ活用の知見 (July Tech Fest...[D20] 高速Software Switch/Router 開発から得られた高性能ソフトウェアルータ・スイッチ活用の知見 (July Tech Fest...
[D20] 高速Software Switch/Router 開発から得られた高性能ソフトウェアルータ・スイッチ活用の知見 (July Tech Fest...
 
Vivado hls勉強会4(axi4 master)
Vivado hls勉強会4(axi4 master)Vivado hls勉強会4(axi4 master)
Vivado hls勉強会4(axi4 master)
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
 
Payloads in Solr - Erik Hatcher, Lucidworks
Payloads in Solr - Erik Hatcher, LucidworksPayloads in Solr - Erik Hatcher, Lucidworks
Payloads in Solr - Erik Hatcher, Lucidworks
 
Deploying IPv6 on OpenStack
Deploying IPv6 on OpenStackDeploying IPv6 on OpenStack
Deploying IPv6 on OpenStack
 

Destacado (8)

20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
 
Postgres Toolkitのご紹介
Postgres Toolkitのご紹介Postgres Toolkitのご紹介
Postgres Toolkitのご紹介
 
明日から使えるPostgre sql運用管理テクニック(監視編)
明日から使えるPostgre sql運用管理テクニック(監視編)明日から使えるPostgre sql運用管理テクニック(監視編)
明日から使えるPostgre sql運用管理テクニック(監視編)
 
Postgres Toolkit
Postgres ToolkitPostgres Toolkit
Postgres Toolkit
 
OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料
 
Postgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etcPostgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etc
 
PostgreSQLセキュリティ総復習
PostgreSQLセキュリティ総復習PostgreSQLセキュリティ総復習
PostgreSQLセキュリティ総復習
 
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
 

Similar a PL/Pythonで独自の集約関数を作ってみる

次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発
shoma h
 

Similar a PL/Pythonで独自の集約関数を作ってみる (20)

[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...
[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...
[db tech showcase Tokyo 2014] D21: Postgres Plus Advanced Serverはここが使える&9.4新機...
 
Extending PostgreSQL - PgDay 2012 Japan
Extending PostgreSQL - PgDay 2012 JapanExtending PostgreSQL - PgDay 2012 Japan
Extending PostgreSQL - PgDay 2012 Japan
 
PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
20140120 presto meetup
20140120 presto meetup20140120 presto meetup
20140120 presto meetup
 
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
 
Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)
 
High performance python computing for data science
High performance python computing for data scienceHigh performance python computing for data science
High performance python computing for data science
 
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
祝!PostgreSQLレプリケーション10周年!徹底紹介!!祝!PostgreSQLレプリケーション10周年!徹底紹介!!
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624
 
Fluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitFluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent Bit
 
PostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラPostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラ
 
PostreSQL監査
PostreSQL監査PostreSQL監査
PostreSQL監査
 
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
 
160705-03 RTミドルウエア講習会・名城大
160705-03 RTミドルウエア講習会・名城大160705-03 RTミドルウエア講習会・名城大
160705-03 RTミドルウエア講習会・名城大
 
次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発次世代言語 Python による PyPy を使った次世代の処理系開発
次世代言語 Python による PyPy を使った次世代の処理系開発
 
Introducing Elastic 8.1 Release - More Integration, Faster Indexing Speed, Lo...
Introducing Elastic 8.1 Release - More Integration, Faster Indexing Speed, Lo...Introducing Elastic 8.1 Release - More Integration, Faster Indexing Speed, Lo...
Introducing Elastic 8.1 Release - More Integration, Faster Indexing Speed, Lo...
 
JPUG 沖縄支部セミナー資料(2013-04-27)
JPUG 沖縄支部セミナー資料(2013-04-27)JPUG 沖縄支部セミナー資料(2013-04-27)
JPUG 沖縄支部セミナー資料(2013-04-27)
 
PostgreSQL9.3新機能紹介
PostgreSQL9.3新機能紹介PostgreSQL9.3新機能紹介
PostgreSQL9.3新機能紹介
 

Más de Uptime Technologies LLC (JP)

Uptime Database Appliance テクノロジープレビュー
Uptime Database Appliance テクノロジープレビューUptime Database Appliance テクノロジープレビュー
Uptime Database Appliance テクノロジープレビュー
Uptime Technologies LLC (JP)
 
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#135ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13
Uptime Technologies LLC (JP)
 

Más de Uptime Technologies LLC (JP) (11)

pgstattuple2: デッドタプル推定のための統計的手法
pgstattuple2: デッドタプル推定のための統計的手法pgstattuple2: デッドタプル推定のための統計的手法
pgstattuple2: デッドタプル推定のための統計的手法
 
「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited
 
PostgreSQLバックアップの基本
PostgreSQLバックアップの基本PostgreSQLバックアップの基本
PostgreSQLバックアップの基本
 
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
 
いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理
 
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
 
PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"
 
PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門
 
Uptime Database Appliance テクノロジープレビュー
Uptime Database Appliance テクノロジープレビューUptime Database Appliance テクノロジープレビュー
Uptime Database Appliance テクノロジープレビュー
 
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#135ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13
 
PostgreSQL安定運用のコツ2009 @hbstudy#5
PostgreSQL安定運用のコツ2009 @hbstudy#5PostgreSQL安定運用のコツ2009 @hbstudy#5
PostgreSQL安定運用のコツ2009 @hbstudy#5
 

PL/Pythonで独自の集約関数を作ってみる

  • 1. Copyright 2015 Uptime Technologies, LLC. All rights reserved. 1 PL/Pythonで独⾃の集約関数を 作ってみる アップタイム・テクノロジーズ 永安 悟史 第6回 PostgreSQLアンカンファレンス
  • 2. ⽬次 • なぜPL/Pythonで集約関数なのか? • PostgreSQLにおける集約関数の作り⽅ • PL/Pythonの関数の作り⽅ • min(),max(),avg()を実装してみる • 単回帰分析を⾏う集約関数を実装してみる Copyright 2015 Uptime Technologies, LLC. All rights reserved. 2
  • 3. なぜPL/Pythonで集約関数なのか? • Pythonとデータ処理 • データ処理と集約関数 • プロシージャ・UDFによるIn-Database処理 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 3
  • 4. PostgreSQLにおける集約関数の作り⽅ • CREATE AGGREGATEコマンドによる定義 – 実⾏中の内部状態を処理するUDF:sfunc – 内部状態を保持するデータ型:state_data_type – 最終的な結果を出⼒するUDF:ffunc Copyright 2015 Uptime Technologies, LLC. All rights reserved. 4 CREATE AGGREGATE myagg (arg1, arg2, ...) ( SFUNC = sfunc, STYPE = state_data_type, FINALFUNC = ffunc ); ユーザ定義の集約 https://www.postgresql.jp/document/9.4/html/xaggr.html CREATE AGGREGATE https://www.postgresql.jp/document/9.4/html/sql-createaggregate.html sfunc args state sfunc args state ffunc return
  • 5. PL/Pythonの関数の作り⽅ • CREATE FUNCTION – 単に中⾝がPythonスクリプトになるだけ • データベースにアクセスする場合には plpy モジュール – CのUDFで⾔うところのSPI関数のようなもの – import plpy • 注意すべきところ – plpython.soからリンクされているPythonのバージョン – データの相互マッピング(+エンコーディング) – ステート変数の global 宣⾔(変更するには global が必要。後述) – そもそも superuser しか使えない(untrusted なので) Copyright 2015 Uptime Technologies, LLC. All rights reserved. 5 PL/Python - Python⼿続き⾔語 https://www.postgresql.jp/document/9.4/html/plpython.html
  • 6. PL/Pythonの関数の作り⽅ • 外部のPythonモジュールを使うUDFの例 – ⽇本語⾃動要約ライブラリ Copyright 2015 Uptime Technologies, LLC. All rights reserved. 6 ⾃動要約API「summpy」を使ってPostgreSQLに⽂章の要約機能を追加する http://pgsqldeepdive.blogspot.jp/2015/11/pgsummpy.html CREATE FUNCTION lexrank_summarize(p text, t text, s_limit integer) RETURNS SETOF text AS $$ import sys sys.path.append(p) from summpy import lexrank res = lexrank.summarize(unicode(t, 'utf‐8'), sent_limit=s_limit) for s in res: yield(s.encode('utf‐8')) $$ LANGUAGE plpythonu;
  • 7. min(),max(),avg()を実装してみる • 組み込みのmin(), max(), avg() の機能を再現 – 集約関数名は pymin(), pymax(), pyavg() Copyright 2015 Uptime Technologies, LLC. All rights reserved. 7 ‐‐ min() ‐‐ sがstate変数、nが入力値、最後の計算は不要なのでffuncは無し CREATE FUNCTION float8_pymin(s float8, n float8) RETURNS float8 AS $$ global s if n is not None: if s is None or n < s: s = n return s $$ LANGUAGE plpython2u; CREATE AGGREGATE pymin (float8) ( sfunc = float8_pymin, stype = float8 );
  • 8. min(),max(),avg()を実装してみる • avg() のPL/Python実装 – ffunc を追加して、最後に平均値を計算して出⼒ Copyright 2015 Uptime Technologies, LLC. All rights reserved. 8 ‐‐ ‐‐ avg() ‐‐ CREATE FUNCTION float8_pyavg( s float8[], n float8) RETURNS float8[] AS $$ global s if n is not None: if s is None: # sum,count s = [0,0] s[0] = s[0] + n s[1] = s[1] + 1 return s $$ LANGUAGE plpython2u; CREATE FUNCTION float8_pyavg_final( s float8[]) RETURNS float8 AS $$ global s if s is not None: return s[0]/s[1] return None $$ LANGUAGE plpython2u; CREATE AGGREGATE pyavg (float8) ( sfunc = float8_pyavg, stype = float8[], finalfunc = float8_pyavg_final ); pyagg.sql https://gist.github.com/snaga/7c3940e72fad172cca6f
  • 9. 単回帰分析を⾏う集約関数を実装してみる • 単回帰分析のモデルは y = w0 + w1 * x • データを⼆種類⽤意する(訓練⽤、評価⽤) • 訓練⽤データのテーブルから y と x を拾う – w0 と w1 を集約関数で計算して出⼒する • 別のテーブルの評価⽤データの x から y を予測する • 結果および誤差を確認する Copyright 2015 Uptime Technologies, LLC. All rights reserved. 9 Machine Learning: Regression - University of Washington | Coursera https://www.coursera.org/learn/ml-regression/
  • 10. 単回帰分析を⾏う集約関数を実装してみる Copyright 2015 Uptime Technologies, LLC. All rights reserved. 10 snaga=# ¥d List of relations Schema |        Name         | Type  | Owner ‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐+‐‐‐‐‐‐‐ public | kc_house_data | table | snaga public | kc_house_test_data | table | snaga public | kc_house_train_data | table | snaga (3 rows) snaga=# select simple_linear_regression(price,sqft_living) from  kc_house_train_data; simple_linear_regression ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ {‐47116.0791388,281.958839662} (1 row) • デモ snaga/SimpleLinearRegression https://github.com/snaga/SimpleLinearRegression
  • 11. 単回帰分析を⾏う集約関数を実装してみる Copyright 2015 Uptime Technologies, LLC. All rights reserved. 11 snaga=# select sqft_living, price, round(‐47116.0791388 + 281.958839662 * sqft_living) as  price_predicted, round((((‐47116.0791388 + 281.958839662 * sqft_living) ‐ price) /  price)::numeric, 2) as error from kc_house_test_data; sqft_living | price  | price_predicted | error ‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐ 1430 | 310000 |          356085 |  0.15 2950 | 650000 |          784662 |  0.21 1710 | 233000 |          435034 |  0.87 (...) 2310 | 400000 |          604209 |  0.51 1020 | 402101 |          240482 | ‐0.40 (4229 rows) • デモ snaga/SimpleLinearRegression https://github.com/snaga/SimpleLinearRegression
  • 12. Q&A Copyright 2015 Uptime Technologies, LLC. All rights reserved. 12 コメント、質問など Twitter: @snaga E-Mail: snaga@uptime.jp