qとは
qとはcsv、tsvなどのファイルをデータベーステーブルのように扱い、それらに対してSQLを実行するというものです。
類似のツールとしてAWSが提供するAthenaなどがありますが、開発用PCで捌けるような比較的少数のデータに対してサクッとSQLを使いたい方などにはq
は向いているかもしれません。
インストール
開発元が公表しているインストール手段としてMac OS
、Windows
、Linux
と大方のOSに対応しているようです。
またDockerイメージ、Python APIとしても公開されています。
使用例
以降ではDocker
、Python
を使った簡単なq
のサンプルを記載します。
データにはアヤメのデータを使用します。
カラムは左からがく片の長さ
、がく片の幅
、花びらの長さ
、花びらの幅
となリます。
$ docker run --rm -it -v `pwd`:/w -w /w jupyter/datascience-notebook python -c '
from sklearn.datasets import load_iris
iris = load_iris()
data = iris.data[:15]
text = "\n".join([",".join([str(scalar) for scalar in scalars]) for scalars in data])
columns = ["SepalLength", "SepalWidth", "PetalLength", "PetalWidth"]
columntext = ",".join(columns)
with open("data.csv", "w", encoding="utf-8") as f:
f.write(columntext + "\n")
f.write(text)
'
$ cat data.csv
SepalLength,SepalWidth,PetalLength,PetalWidth
5.1,3.5,1.4,0.2
4.9,3.0,1.4,0.2
4.7,3.2,1.3,0.2
4.6,3.1,1.5,0.2
5.0,3.6,1.4,0.2
5.4,3.9,1.7,0.4
4.6,3.4,1.4,0.3
5.0,3.4,1.5,0.2
4.4,2.9,1.4,0.2
4.9,3.1,1.5,0.1
5.4,3.7,1.5,0.2
4.8,3.4,1.6,0.2
4.8,3.0,1.4,0.1
4.3,3.0,1.1,0.1
5.8,4.0,1.2,0.2
以降ではがく片の長さ
が5.0
以上かつ、花びらの長さ
が1.5
以上という条件でデータを取得します。
- CLI
$ docker run --rm -it -v `pwd`:/w -w /w eiryu/q-text-as-data -H -d ',' 'select * from data.csv where SepalLength >= 5.0 and PetalLength >= 1.5'
5.4,3.9,1.7,0.4
5.0,3.4,1.5,0.2
5.4,3.7,1.5,0.2
- Python
コンテナ化したいので、下記のDockerfile
をビルドします。
FROM python:latest
ENV PYTHONPATH /usr/local/src:$PYTHONPATH
WORKDIR /tmp/q
RUN set -eux && \
git init && \
git config core.sparsecheckout true && \
git remote add origin https://github.com/harelba/q.git && \
echo bin > .git/info/sparse-checkout && \
git pull origin master && \
pip install six && \
cp -p bin/q /usr/local/src/qtextasdata.py
イメージをビルドし、スクリプト実行します。
$ docker build -t qpy .
$ docker run --rm -it -v `pwd`:/w -w /w qpy python -c '
from qtextasdata import QTextAsData, QInputParams
q = QTextAsData()
stmt = "select * from data.csv where SepalLength >= 5.0 and PetalLength >= 1.5"
input_params = QInputParams(delimiter=",", skip_header=True)
r = q.execute(stmt, input_params)
if r.status != "ok":
raise BaseException("status: " + r.status)
for data in r.data:
print(*data, sep=",")
'
5.4,3.9,1.7,0.4
5.0,3.4,1.5,0.2
5.4,3.7,1.5,0.2
CLI、Pythonどちらとも同様に同じ結果が取得されていると思います。
最後に
上記ではqの簡単な紹介を行いました、後から考えてみるとSQLというインターフェースに拘らなければPandasでも同様のことが実現できそうです。。。
機械学習の予測結果のデバッグ用に使用できればと思います。