帧窗口与系列的性能问题
Performance issues with Frame windowing vs Series
我正在使用来自 c# 的 Deedle,与对系列进行相同的操作相比,通过帧打开窗口非常慢。例如,对于尺寸相似的系列和帧,我看到 60 毫秒与 3500 毫秒(系列与帧)。
有人以前看过这个吗?
var msftRaw = Frame.ReadCsv(@"C:\Users\olivi\source\repos\ConsoleApp\MSFT.csv");
var msft = msftRaw.IndexRows<DateTime>("Date").SortRowsByKey();
var rollingFrame = msft.Window(60); // 7700 ms
var openSeries = msft.GetColumn<double>("Open");
var rollingSeries = openSeries.Window(60); // 14 ms
var oneSeriesFrame = Frame.FromColumns(new Dictionary<string, Series<DateTime, double>> { { "Open", openSeries } });
var rollingFakeFrame = oneSeriesFrame.Window(60); // 3300mm
这是处理金融时间序列数据时非常常见的操作,例如计算价格之间的滚动相关性,或者在另一个价格时间序列存在条件时计算滚动已实现波动率。
我找到了解决性能问题的方法:分别对每个系列执行滚动操作,将滚动系列加入一个框架中,使它们按日期对齐,然后在框架上编写处理函数,选择每个系列在处理函数中。
继续上面的例子:
private static double CalculateRealizedCorrelation(ObjectSeries<string> objectSeries)
{
var openSeries = objectSeries.GetAs<Series<DateTime, double>>("Open");
var closeSeries = objectSeries.GetAs<Series<DateTime, double>>("Close");
return MathNet.Numerics.Statistics.Correlation.Pearson(openSeries.Values, closeSeries.Values);
}
var rollingAgg = new Dictionary<string, Series<DateTime, Series<DateTime, double>>>();
foreach (var column in msft.ColumnKeys)
{
rollingAgg[column] = msft.GetColumn<double>(column);
}
var rollingDf = Frame.FromColumns(rollingAgg);
var rolingCorr = rollingDf.Rows.Select(kvp => CalculateRealizedCorrelation(kvp.Value));
我正在使用来自 c# 的 Deedle,与对系列进行相同的操作相比,通过帧打开窗口非常慢。例如,对于尺寸相似的系列和帧,我看到 60 毫秒与 3500 毫秒(系列与帧)。
有人以前看过这个吗?
var msftRaw = Frame.ReadCsv(@"C:\Users\olivi\source\repos\ConsoleApp\MSFT.csv");
var msft = msftRaw.IndexRows<DateTime>("Date").SortRowsByKey();
var rollingFrame = msft.Window(60); // 7700 ms
var openSeries = msft.GetColumn<double>("Open");
var rollingSeries = openSeries.Window(60); // 14 ms
var oneSeriesFrame = Frame.FromColumns(new Dictionary<string, Series<DateTime, double>> { { "Open", openSeries } });
var rollingFakeFrame = oneSeriesFrame.Window(60); // 3300mm
这是处理金融时间序列数据时非常常见的操作,例如计算价格之间的滚动相关性,或者在另一个价格时间序列存在条件时计算滚动已实现波动率。
我找到了解决性能问题的方法:分别对每个系列执行滚动操作,将滚动系列加入一个框架中,使它们按日期对齐,然后在框架上编写处理函数,选择每个系列在处理函数中。
继续上面的例子:
private static double CalculateRealizedCorrelation(ObjectSeries<string> objectSeries)
{
var openSeries = objectSeries.GetAs<Series<DateTime, double>>("Open");
var closeSeries = objectSeries.GetAs<Series<DateTime, double>>("Close");
return MathNet.Numerics.Statistics.Correlation.Pearson(openSeries.Values, closeSeries.Values);
}
var rollingAgg = new Dictionary<string, Series<DateTime, Series<DateTime, double>>>();
foreach (var column in msft.ColumnKeys)
{
rollingAgg[column] = msft.GetColumn<double>(column);
}
var rollingDf = Frame.FromColumns(rollingAgg);
var rolingCorr = rollingDf.Rows.Select(kvp => CalculateRealizedCorrelation(kvp.Value));