我使用
创建了一个数据框@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 - > 62.13 62.67 62.13 62.27 3206
12/28/2014 9:00:00 PM - > 62.27 62.42 62.14 62.39 1620
12/28/2014 10:00:00 PM - > 62.4 62.41 62.16 62.21 1275
12/28/2014 11:00:00 PM - > 62.21 62.32 61.96 62.19 2791
12/29/2014 12:00:00 AM - > 62.17 62.25 62.08 62.23 1233
12/29/2014 1:00:00 AM - > 62.23 62.41 62.21 62.31 1186
12/29/2014 2:00:00 AM - > 62.32 62.32 62.07 62.21 1446
12/29/2014 3:00:00 AM - > 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没有。
答案 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知道块中的所有项都具有相同的索引。 (或者,您可以迭代各个行,但这会使它更长)。