先日公開したQuerypyで
までやったのでバージョンを0.0.1にしました。
momotaro98さんがutilsのテストを書いてくださったついでに、READMEの開発指南にテスト関係の項目を追加しました。今後は重要な機能であったり複雑なロジックを実装した部分を意識しつつテスト済みコンポーネントを増やしていきたいです。
READMEのスクリプトが間違っていたので修正しました。
加減乗除とべき乗をつかって計算できるようになりました。
例によって以下のscores.csv
を読み込んで条件に合う学生を探し出しましょう。
名前, 解析入門, 経済学入門
山田, 80, 50
劉, 50, 80
data = Querypy.read_csv("scores.csv", "名前")
math101 = data.get_term("解析入門")
econ101 = data.get_term("経済学入門")
例えば二教科math101
, econ101
の合計点数はmath101 + econ101
と表現して実際に条件式に組み入れることができます。
data.find(math101 + econ101 >= 100)
# -> ['山田', '劉']
他にも加減乗除、べき乗すべてが同様に条件式のなかで扱えることになります。
# 解析入門のほうが点数が高い人
math101 - econ101 > 0
# 数学の点数を1.5倍の重みで評価する場合
math101 * 1.5 + econ101 >= 120
# 経済学入門のほうが10%以上点数が高い人
econ101/math101 >= 1.1
# 両方共50点との距離を測る
(math101 - 50) ** 2 + (econ101 - 50) ** >= 100
関数記号を導入することでレコードに任意の演算を施した結果をつかって条件を記述できるようになりました。
例えばGPAを以下のようなルールでつけて、GPA3以上の学生を見つけたいとしましょう:
この条件分岐を含んだ式は上のような加減乗除べき乗だけでは表現できませんが、
def get_grade_point(test_result):
if test_result >= 80:
return 4
elif test_result >= 70:
return 3
elif test_result >= 60:
return 2
else:
return 0
def get_gpa(math, econ):
return (get_grade_point(math) + get_grade_point(econ)) / 2
という関数を用意すればget_gpa(math101, econ101)
みたいな感じで計算できそうです。これを条件式に組み込みたいときはまず
from querypy.FunctionSymbol import FunctionSymbol
gpa_func_sym = FunctionSymbol(get_gpa)
という形で関数記号オブジェクト(FunctionSymbol
)を作成します。
そしてそのあとは通常どおりに条件式を不等号をつかって作成できます。
data.find(gpa_func_sym(math101, econ101) >= 3)
順序付きデータや時系列データでは 「前の項が条件Aをみたして次の項が条件Bをみたすもの」 「一時間での差分が5%以内」 など複数レコードにまたがる条件が使えると便利です。
まだこの機能の構想、設計ができていないのですぐにコードに落とし込むことはできませんが、逆になにかアイデアがあればIssueいただけると嬉しいです。
せっかくテストのルールを作ることができたのでそれを活かして製品の質を上げていきたいです。
今はかなりかぎられた条件を満たすCSVしか使うことができません。 より一般的なCSVでも検索できるよう、またJSONなどほかの形式でも扱えるようにデザインを変更していきたいです。