首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用静态类型语言(F#)处理异构数据

使用静态类型语言(F#)处理异构数据
EN

Stack Overflow用户
提问于 2009-11-25 18:15:36
回答 3查看 1.7K关注 0票数 21

F#的一项主张是,它允许交互式脚本编写和数据操作/探索。我一直在玩弄F#,试图了解它与Matlab和R在数据分析工作中的比较。显然,F#并不具备这些生态系统的所有实际功能,但我更感兴趣的是底层语言的总体优缺点。

对我来说,最大的变化,甚至在功能风格上,是F#是静态类型的。这有一定的吸引力,但也经常感觉像一件紧身衣。例如,我还没有找到一种处理异构矩形数据的方便方法--想想R中的dataframe,假设我正在读取一个带有名称(string)和权重(float)的CSV文件。通常,我加载数据,执行一些转换,添加变量等,然后运行分析。在R中,第一部分看起来可能是:

代码语言:javascript
复制
df <- read.csv('weights.csv')
df$logweight <- log(df$weight)

在F#中,还不清楚我应该使用什么结构来完成这个任务。据我所知,我有两个选项: 1)我可以首先定义一个强类型的类(专家F# 9.10)或2),我可以使用像ArrayList这样的异构容器。静态类型的类似乎不可行,因为我需要在加载数据之后以即席方式(日志权重)添加变量。异构容器也不方便,因为每次访问变量时,我都需要解压缩它。在F#中:

代码语言:javascript
复制
let df = readCsv("weights.csv")
df.["logweight"] = log(double df.["weight"])

如果这是一次或两次,这可能是可以的,但每次使用变量时指定一个类型似乎不合理。我经常处理1000多个变量的调查,这些变量被添加/删除,分裂成新的子集,并与其他数据格式合并。

我错过了明显的第三选择吗?是否有一些有趣和轻松的方式来交互和操作异构数据?如果我需要在.Net上进行数据分析,我目前的感觉是,在所有的数据探索/转换/交互工作中,我应该使用IronPython,而对数值密集的部分只使用F#/C#。F#本质上是用于快速和肮脏的异构数据工作的错误工具吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-25 20:44:00

我认为还有其他几种选择。

(?)算子

正如Brian提到的,您可以使用(?)操作符:

代码语言:javascript
复制
type dict<'a,'b> = System.Collections.Generic.Dictionary<'a,'b>

let (?) (d:dict<_,_>) key = unbox d.[key]
let (?<-) (d:dict<_,_>) key value = d.[key] <- box value

let df = new dict<string,obj>()
df?weight <- 50.
df?logWeight <- log(df?weight)

这确实使用了对每个访问的装箱/取消装箱,有时您可能需要添加类型注释:

代码语言:javascript
复制
(* need annotation here, since we could try to unbox at any type *)
let fltVal = (df?logWeight : float)

顶层标识符

另一种可能是,您可以只使用顶级标识符,而不是动态地定义现有对象的属性( F#不支持这些属性)。

代码语言:javascript
复制
let dfLogWeight = log(dfWeight)

这具有几乎不需要指定类型的优点,尽管它可能会干扰顶级命名空间。

属性对象

最后一个需要更多类型和更丑的语法的选项是创建强类型的“属性对象”:

代码语言:javascript
复制
type 'a property = System.Collections.Generic.Dictionary<obj,'a>

let createProp() : property<'a> = new property<'a>()
let getProp o (prop:property<'a>) : 'a = prop.[o]
let setProp o (prop:property<'a>) (value:'a) = prop.[o] <- value

let df = new obj()
let (weight : property<double>) = createProp()
let (logWeight : property<double>) = createProp()

setProp df weight 50.
setProp df logWeight (getProp df weight)
let fltVal = getProp df logWeight

这需要显式地创建每个属性(并且需要一个类型注释),但在此之后就不需要类型注释了。与其他选项相比,我发现这一点的可读性要低得多,尽管也许定义一个操作符来替换getProp会在一定程度上缓解这种情况。

票数 6
EN

Stack Overflow用户

发布于 2009-11-25 21:23:40

F#本质上是用于快速和肮脏的异构数据工作的错误工具吗?

对于完全临时的探索性数据挖掘,我不推荐F#,因为类型会妨碍您。

但是,如果您的数据定义得很好,那么通过将所有类型映射到公共F#联合中,可以在同一个容器中保存不同的数据类型:

代码语言:javascript
复制
> #r "FSharp.PowerPack";;

--> Referenced 'C:\Program Files\FSharp-1.9.6.16\bin\FSharp.PowerPack.dll'

> let rawData =
    "Name: Juliet
     Age: 23
     Sex: F
     Awesome: True"

type csv =
    | Name of string
    | Age of int
    | Sex of char
    | Awesome of bool

let parseData data =
    String.split ['\n'] data
    |> Seq.map (fun s ->
        let parts = String.split [':'] s
        match parts.[0].Trim(), parts.[1].Trim() with
        | "Name", x -> Name(x)
        | "Age", x -> Age(int x)
        | "Sex", x -> Sex(x.[0])
        | "Awesome", x -> Awesome(System.Convert.ToBoolean(x))
        | data, _ -> failwithf "Unknown %s" data)
    |> Seq.to_list;;

val rawData : string =
  "Name: Juliet
     Age: 23
     Sex: F
     Awesome: True"
type csv =
  | Name of string
  | Age of int
  | Sex of char
  | Awesome of bool
val parseData : string -> csv list

> parseData rawData;;
val it : csv list = [Name "Juliet"; Age 23; Sex 'F'; Awesome true]

csv list是强类型的,您可以对它进行模式匹配,但是必须预先定义所有的联合构造函数。

我个人更喜欢这种方法,因为它比使用非类型化的ArrayList要好一个数量级。但是,我不太确定您的需求是什么,而且我也不知道有什么好的方法来表示临时变量(除了作为Map{string, obj}),所以YMMV。

票数 8
EN

Stack Overflow用户

发布于 2009-11-25 18:40:15

我不确定F#在这里是否是一个很好的工具。但是还有第三种选择--问号运算符。我已经有一段时间想写这方面的博客了;卢卡最近的PDC谈话演示了一个C# 'dynamic‘的CSV阅读器,我想用(?)操作符。看见

F#算子"?“

做个简短的描述。你可以试着往前走,自己玩,或者等我写博客。我自己也没有认真地试过,所以我不确定它到底会有多好。

编辑

我要补充的是,Luca的谈话显示了C#中的“动态”如何解决该语言的至少一部分问题。

编辑

另请参阅

http://cs.hubfs.net/forums/thread/12622.aspx

在这里我发布了一些基本的初学者CSV代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1798920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档