在之前的问题中(使用静态类型语言处理异构数据),我询问了F#如何处理数据分析中的标准任务,例如操作未经过类型定义的CSV文件。动态语言在基本任务方面表现出色,例如:
在F#中,最优雅的方法似乎是使用问号(?)运算符。不幸的是,在这个过程中,我们失去了静态类型,并且仍然需要在某些地方进行类型注释。
F#最令人兴奋的未来功能之一是类型提供程序。通过动态检查文件,CSV类型提供程序可以提供类型,而只有最小的类型安全性损失。
但数据分析通常并不止于此。我们经常通过操作管道转换数据并创建新数据集。我的问题是,如果我们大多数时间都在操作数据,那么类型提供程序能否提供帮助?例如:
data = load('income.csv')
data.log_income = log(income)
在F#中,最优雅的方法似乎是使用问号(?)运算符。不幸的是,在这个过程中,我们失去了静态类型,并且仍然需要在某些地方进行类型注释。
F#最令人兴奋的未来功能之一是类型提供程序。通过动态检查文件,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?
其他想法?