如何迭代Deedle Series <datetime,series <datetime,objectseries <string>&gt;

时间:2016-04-07 00:02:01

标签: f# deedle fslab

我使用

创建了一个数据框
@Component
@AutoConfigureOrder
@ConditionalOnClass(DataSourceAutoConfiguration.class)
@ConfigurationProperties(prefix="dbdanso.flyway")
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
public class FlywayConf {
    private String url;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    @Bean
    public Boolean teste(){
        Flyway flyway = new Flyway();
        flyway.setDataSource("jdbc:postgresql://localhost:5432/portalservicos","postgres","dna44100");
        flyway.setBaselineOnMigrate(true);
        flyway.setLocations("classpath:db/migration/dbdnaso");
        flyway.migrate();
        return true;
    }

}

结果输出:                               打开高低收盘量     12/28/2014 8:00:00 PM - &gt; 62.13 62.67 62.13 62.27 3206
    12/28/2014 9:00:00 PM - &gt; 62.27 62.42 62.14 62.39 1620
    12/28/2014 10:00:00 PM - &gt; 62.4 62.41 62.16 62.21 1275
    12/28/2014 11:00:00 PM - &gt; 62.21 62.32 61.96 62.19 2791
    12/29/2014 12:00:00 AM - &gt; 62.17 62.25 62.08 62.23 1233
    12/29/2014 1:00:00 AM - &gt; 62.23 62.41 62.21 62.31 1186
    12/29/2014 2:00:00 AM - &gt; 62.32 62.32 62.07 62.21 1446
    12/29/2014 3:00:00 AM - &gt; 62.22 62.35 62.17 62.28 1335

我现在想要从上面的每小时样本中生成更高的时间范围(每日)。

我从:

开始
// Create a dataframe containing the Open, High, Low, and Close
let ohlc =
cl 
|> Frame.sliceCols ["Open"; "High"; "Low"; "Close"; "Volume"]

返回:     ohlc |> Frame.rows |> Series.resampleEquiv (fun d -> d.Date)

我想创建一个新的DataFrame,其中包含Date(键),Open,High,Low,Close和Volume列。 Open是该系列第1行中的第一个打开。高是系列中的Max High。低是系列中的最低点。关闭是系列中的最后一个关闭。卷是系列中卷的总和

类似于:

Series<DateTime,Series<DateTime,ObjectSeries<string>>>.

不是尝试使用Rows在Frame级别执行此操作,我最好尝试使用Frame使用列进行此操作吗?

UPDATE 这是完成的代码:

ohlc
|> Frame.rows
|> Series.resampleEquiv (fun d -> d.Date)
|> ??
|> ??

我无法使用:

ohlc
|> Frame.rows
|> Series.resampleEquiv (fun d -> d.Date)
|> Series.mapValues (fun s ->
   let temp = Frame.ofRows s 
   series ["Open"  => Series.firstValue temp?Open
           "High"  => defaultArg (Stats.max temp?High) nan
           "Low"   => defaultArg (Stats.min temp?Low) nan
           "Close" => Series.lastValue temp?Close 
           "Volume" => defaultArg (Some( Stats.sum temp?Volume) ) nan ] )
|> Frame.ofRows

因为这给了我一条错误消息:这个表达式应该有float类型,但是这里有float类型。我不得不包装函数Some()。不确定为什么Stats.sum需要这个,但Stat.max和Stats.min没有。

1 个答案:

答案 0 :(得分:1)

调用resampleEquiv后,最终得到一系列(表示具有相同日期的块)系列(表示具有不同时间但相同日期的值)的对象系列(表示原始的不同列)帧)。

您可以遍历顶级系列并将每个对象系列(每个块)系列中的每一个转回一个框架。然后,您可以在框架上进行聚合并返回一个新行:

source
|> Series.resampleEquiv (fun d -> d.Date.Year)
|> Series.mapValues (fun s -> 
    let temp = Frame.ofRows s
    series [ "Open" => Series.firstValue temp?Open
             "High" => defaultArg (Stats.max temp?High) nan ])
|> Frame.ofRows

我只为Open和High做过,但你可以看到这个想法:-)。在每个块上调用Frame.ofRows也应该相当快,因为​​Deedle知道块中的所有项都具有相同的索引。 (或者,您可以迭代各个行,但这会使它更长)。