我正在学习 F#。我正在尝试将 a 转换Map<string, seq<DateTime * float>>
为 Deedle 数据框(http://bluemountaincapital.github.io/Deedle/tutorial.html#creating)。
我已经准备了以下代码:
let folderFnct (aFrame:Frame) colName datesAndValues =
let newSerie = Series(Seq.map (fun x -> fst x) datesAndValues, Seq.map (fun y -> snd y) datesAndValues)
let newFrame = aFrame.Join([colName], [newSerie], kind=JoinKind.Inner)
newFrame
let mapToDeedleFrame myMap frame =
Map.fold ( fun s ticker datesAndValues -> folderFnct s ticker datesAndValues) frame myMap
mapToDeedleFrame
使用现有框架折叠地图。文件夹功能folderFnct
:
- 取帧
- 使用 Map 键作为框架中的列名,并且
- 处理这些值 (
<DateTime * float>
),使其成为一系列。
问题在于:
let newFrame = aFrame.Join([colName], [newSerie], kind=JoinKind.Inner)
在哪里:
未定义字段、构造函数或成员“Join”
我已经确定了该问题的三个潜在原因:
- 为什么
aFrame.Join
没有定义?我尝试明确指定的类型aFrame
- 我怎样才能喂到
mapToDeedleFrame
一个空的框架? - 我应该在为空
folderFnct
的情况下进行模式匹配吗?aFrame
非常感谢!
编辑 1
根据 Tomas 的建议,这就是我到目前为止所做的。
let folderFnct (aFrame:Frame<'a, 'b>) columnName (seqOfTuples: seq<'a*'b>) =
let newSerie = Series(Seq.map (fun x -> fst x) seqOfTuples, Seq.map (fun y -> snd y) seqOfTuples)
let otherFrame = Frame([columnName], [newSerie])
let newFrame = aFrame.Join((otherFrame), kind=JoinKind.Inner)
newFrame
let mapToDeedleFrame myMap frame =
Map.fold ( fun state k vals -> folderFnct state k vals) frame myMap
缺少的最后一步是:我如何快速将一个空框架(也许避免创建一个虚拟框架)传递给mapToDeedleFrame
?我已经尝试[]
过
let frame = mapToDeedleFrame mapTS []
这可能是一个愚蠢的问题,但我是 F# 的新手,我想知道Empty
该语言中是否有内置类型。
跟进问题
在我阅读的源文件中(https://github.com/BlueMountainCapital/Deedle/blob/master/src/Deedle/Frame.fs):
member frame.Join<'V>(colKey, series:Series<'TRowKey, 'V>, kind, lookup) =
let otherFrame = Frame([colKey], [series])
frame.Join(otherFrame, kind, lookup)
而在屏幕上弹出的功能描述中:
从上图中我猜想 Frame 的类型与 colKey 相同,而据我了解,colKey 只是通过意式连接添加的数据框列的键。作为一个完整的菜鸟,我很困惑..
编辑 2
我重写了代码:
let seriesListMapper (colName:string, series:Series<'a, 'b>) =
[colName => series] |> frame
let frameListReducer (accFrame: Frame<'a, 'b>) (aFrame: Frame<'a, 'b>) =
accFrame.Join(aFrame, kind=JoinKind.Outer)
let seriesListToFrame (seriesList: List<string * Series<'a, 'b>>) =
seriesList |> List.map (fun elem -> seriesListMapper elem) |> List.reduce(fun acc elem -> frameListReducer acc elem)
问题是:
let frame = seriesListToFrame seriesList
返回 frame 作为 Frame,而 seriesList 是(string *Series<DateTime, float>) list
我认为问题在于:
let seriesListMapper (colName:string, series:Series<'a, 'b>) =
[colName => series] |> frame
实际上seriesListMapper
表示为
seriesListMapper: colName:string * series:Series<'a, 'b> -> Frame<'a, string>
我不明白这些值如何以及为什么转换为string
from float
。
一件有趣的事情是,绘制框架frame.Format()
实际上证实了数据看起来是正确的。只是这种“奇怪”的转换为string
.