- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
例如,我在代码中使用了很多 pandas.DataFrames
。这是一个非常大的类,有很多部分,它有一个非常类似于功能的 API,您倾向于将它的方法调用链接在一起。
如果能够轻松地向这个现有类添加功能,同时仍然保持功能性、流畅的 API 完好无损,感觉会很好。
我想把这个类变成一些特定于领域的东西,以便删除很多在使用这个类时经常使用的特定于领域的样板代码。
假设我在梦中能够做这样的事情:
pandas.read_csv('sales.csv') \
.filter(items=['one', 'three']) \
.apply(myTransformationFunction) \
.saveToHivePartition(tablename = 'sales', partitionColumn = 'four') \
.join(pandas.read_csv('employees.csv')) \
.filter(items=['one','three','five']) \
.saveToHivePartition(tablename = 'EmployeeMetrics', partitionColumn = 'ten')
在此示例中,saveToHivePartition
是一个自定义方法,它执行大量操作以原子方式将某些内容保存到 HDFS 的正确位置,然后将该信息添加到 hive 元数据存储区。 super 有用!
显然,“简单”的答案是简单地创建一个独立的函数,我可以将 DataFrame
对象连同我需要的其他参数一起传递给该函数。每次我想执行保存时,我都需要将数据帧封装到一个变量中,然后将该变量传递到一个单独的函数中。远没有上面的例子那么干净!
接下来想到的是创建一些很酷的新 SuperDataFrame
类,它是 DataFrame
的超集。这种方法的唯一问题是:你如何构建它?我无法更改 pandas.read_csv()
以开始返回我的新类(class)。我无法将基类转换为子类。我可以让 SuperDataFrame
成为...数据框类的包装器吗?但后来我想,任何时候我想调用一个基本的 DataFrame
函数,它都必须是这样的:
SuperDataFrame(pandas.read_csv('sales.csv')) \
.df.filter .... \
.df.apply .... \
.saveToHivePartition .... \
.df.join .... \
.df.filter .... \
.saveToHivepartition ....
我什至认为这行不通,因为这假设每当 pandas 执行一个功能时,它都会就地改变 DataFrame
,我敢肯定它甚至不会这样做。
有什么想法吗?或者这只是一件坏事?
最佳答案
您可以使用 constructor-override properties确保 pandas 操作返回新类的实例。一个简单的例子:
class MyDF(pandas.DataFrame):
@property
def _constructor(self):
return MyDF
def myMethod(self):
return "I am cool"
>>> d = MyDF([[1, 2, 3], [4, 5, 6], [7, 8, 9]], columns=["A", "B", "C"])
>>> d.filter(["A", "B"]).apply(lambda c: c**2).myMethod()
'I am cool'
当然,您还必须创建自己的 Series 子类并可能定义 custom data slots如果您还希望能够处理系列。
也就是说,我不清楚您的示例是否真的证明了这一点。您已经可以在普通 DataFrames 上链接方法调用,所以如果您只想保存一些中间阶段,那么做起来并不麻烦:
data = pandas.read_csv('sales.csv') \
.filter(items=['one', 'three', 'five']) \
.apply(myTransformationFunction)
data2 = data.join(pandas.read_csv('employees.csv')) \
.filter(items=['one', 'three'])
saveToHivePartition(data, tablename='sales', partitionColumn='four')
saveToHivePartition(data2, tablename='EmployeeMetrics', partitionColumn='ten')
(由于我在对问题的评论中提到的问题,我更改了过滤器的顺序。先过滤到较小的子集,然后再过滤到较大的子集是没有意义的;较大的子集不会稍后会有,因为其中一些已经被过滤掉了。)
将事物编写为方法链的能力本身并不是一种优势。我特别怀疑像您的 .saveToHivePartition
这样的链接方法,它们可能只是因为它们的副作用而被调用。当它们以流水线方式运行时,链接方法是有意义的,每个方法都接受前一个的输入并修改它以传递给下一个。但是,只产生副作用并返回未更改对象的方法并不能使代码更具可读性。
另请注意,此解决方案特定于 pandas。通常,如果某些库中的类创建彼此的实例,则必须仔细设计库以允许以保留类之间关系的方式进行子类化。 Pandas 已使用我描述的构造函数覆盖机制完成此操作,但它并不总是那样,在此之前,很难做你想做的事情。
关于python - 扩展现有 3rd 方库的现有类的功能的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42145664/
我花了几个小时在 R-exts 手册和文档上parse_Rd() (以及引用文献中的 PDF 文档),但我 还没搞清楚是什么results=rd手段或如何使用它。我以为我可以 使用 R 代码片段动态创
这是对 this 的后续问题.我正在使用 为 __AVR_HAVE_LPMX__ 处理器 (avr25) 编写代码 GNU C (WinAVR 20100110) 版本 4.3.3 (avr)/由 G
我正在记录一个内部的、非导出的函数。 roxygen2 正在创建一个 Rd 文件,即使文档中没有 @export 标记。 roxygen2 为以下文档创建了一个 Rd 文件。我错过了什么? #
我正在记录一个内部的、非导出的函数。 roxygen2 正在创建一个 Rd 文件,即使文档中没有 @export 标记。 roxygen2 为以下文档创建了一个 Rd 文件。我错过了什么? #
如何正确指定 rd 文件的编码?我正在尝试将以下记录虚拟函数的帮助文件添加到我的包中: \name{dummy} \encoding{ISO-8859-2} \alias{dummy} \title{
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 3年前关闭。 Improve thi
结合试图为自己寻找解决方案 this question ,我发现自己陷入了尝试编写有效 Rd 标记的过程中。我想要的是添加一个名为 Raw Function Code 的部分并将函数的代码放在它下面。
我正在为一个函数填写一个 Rd 文件。 当我在 Details 部分使用\eqn{2^{x}} ,然后构建和安装包时,没有上标指数。 查看 R-exts.pdf,它以 Poisson.Rd 为例说明如
我在一家从事能源业务的研发公司工作。我们开发了一些成功的产品,但现在似乎所有的时间都花在解决与这些产品相关的问题上。我们似乎没有时间开发新产品。有没有人知道如何既能处理现有产品出现的问题,又能有时间和
我正在尝试将 R 文档文件(扩展名 .Rd)转换为纯文本。我知道 RdUtils 包含一个名为 Rdconv 的工具,但据我所知它只能从命令行使用。有没有办法从 R session 中访问 Rdcon
正如标题所说,我在生成 时遇到问题R 使用 打包文档roxygen2 . 我 99.9% 肯定已经按照说明准备了一切here and here已经。我知道几乎不可能得到像这样的主要远程诊断非病例的答案
我正在使用 Rstudio 简化 Sweave 和 R 进行数据分析,我将与其他分析师分享。为了使变量的编码更加清晰,最好有一个帮助文件这样他们可以调用?myData。并获得有用的文件,如果他们需要的
简短版本:我可以使用 roxygen 模拟 stats 包中 Normal 的文档吗? 长版本:我正在开发一个包,并试图通过在一个标题下收集许多具有公共(public)输入/参数的函数来使文档更具可读
我无法使用 RStudio 和 Roxygen2 为我的包生成 .Rd 文档文件。首先,我要提一下,我已经遇到了此处发布的类似问题,并且已经完成了以下操作: Roxygen2 阻止在文件开头以 #'
我正在通过 JS 调用 ipinfodb。最近我收到了大约 5-6 条回复(来自大约 600 条),将国家/地区代码指定为“RD”。 “RD”不是 ccTLD,我找不到任何理由将其退回。有没有人遇到过
我正在使用 roxygen 来记录 R 包。我在包的“man/macros”子目录中有一个宏文件 myMacro.Rd。该文件指定 \myMacro宏。 (该宏将 标记插入 HTML 帮助文件以更改
我有一个 Windows 批处理文件,它删除了 Windows 主目录中的一些目录。 REM clear Ivy cache on windows RD /s %Use
以下 MWE 无法编译(通过 devtools::document()): #' MWE #' #' @examples #' format('{}') # Works #' format('{')
.R 和 .rd 文件(文档)的名称是否需要与它所指的函数具有完全相同的名称? 例如,我能否在同一个 R 包中拥有一个名为“b”的函数和另一个名为“B”的函数,并将文档写入不同的 .R 和 .rd 文
实际问题 如何避免 Rd 文件名冲突 S4 泛型及其方法不一定全部定义在同一个包中(包含(某些)自定义方法的包取决于包含泛型的包)和 使用 roxygenize()从包装 roxygen2生成实际的
我是一名优秀的程序员,十分优秀!