在上一个问题中(使用静态类型语言处理异构数据 https://stackoverflow.com/questions/1798920/working-with-heterogenous-data-in-a-statically-typed-language-f),我询问了 F# 如何处理数据分析中的标准任务,例如操作非类型化 CSV 文件。动态语言擅长执行基本任务,例如
data = load('income.csv')
data.log_income = log(income)
在 F# 中,最优雅的方法似乎是问号 (?) 运算符。不幸的是,在这个过程中,我们失去了静态类型,并且仍然需要类型注释。
F# 未来最令人兴奋的功能之一是类型提供者 http://strangelights.com/blog/archive/2010/11/15/the-future-of-f-type-providers.aspx。在类型安全性损失最小的情况下,CSV 类型提供程序可以通过动态检查文件来提供类型。
但数据分析通常并不止于此。我们经常通过操作管道转换数据并创建新的数据集。我的问题是,如果我们主要操作数据,类型提供程序可以提供帮助吗?例如:
open CSV // Type provider
let data = CSV(file='income.csv') // Type provider magic (syntax?)
let log_income = log(data.income) // works!
这可以工作,但会污染全局名称空间。考虑添加列通常比创建新变量更自然。有什么办法可以做吗?
let data.logIncome = log(data.income) // won't work, sadly.
当目标是创建新的衍生数据集或清理数据集时,类型提供程序是否提供了使用 (?) 运算符的方法?
也许是这样的:
let newdata = colBind data {logIncome = log(data.income)} // ugly, does it work?
还有其他想法吗?