hy中的熊猫列设置宏

问题描述

我觉得我在为顺序设置几个派生列的以下操作编写函数时是不必要的:

(defn add-cols[d]
   (do
      (setv (get d "col0") "0")
      (setv (get d "col1") (np.where (> 0 (get d "existing-col")) -1 1))
      (setv (get d "col2") (* (get d "col1") (get d "existing-col")))
      d
      ))

以上内容既不简洁也不容易理解。我希望将这种模式转换为宏有帮助。我是宏的初学者,但我正在考虑创建类似这样的东西:

(pandas-addcols d
   `col0 : "0",`col1 : (np.where ( > 0 `existing-col) -1 1),`col2 : (* `col1 `existing-col))

将感谢您对以上内容的任何帮助或指导。宏的最终形式显然也可以不同。最终,最重复的部分是多个“ setv”和“ get”调用,也许还有更优雅的删除这些调用的通用方法

解决方法

一个可以帮助解决问题的语法方法是为get使用一个较短的名称,而无需引用字符串文字。这是this library$的简单版本。另外,Hy的setv已经允许您提供多个目标值对。

(import
  [numpy :as np]
  [pandas :as pd])

(defmacro $ [obj key]
  (import [hy [HyString]])
  `(get (. ~obj loc) (,(slice None) ~(HyString key))))

(setv
  d (pd.DataFrame (dict :a [-3 1 3] :b [4 5 6]))
  ($ d col0) 0
  ($ d col1) (np.where (> 0 ($ d a)) -1 1))