使用 Needle 对时间序列重新采样
Resample time serie with Deedle
我想将 TimeSerie 重新采样到更大的时间粒度。我不确定在以下情况下 Deedle 中哪种方法最好。
假设我有一个从 2014-03-15 到 2014-09-15 的每日时间系列,生成如下:
var startDate = DateTime.Parse('2014-03-15');
var daily = Enumerable.Range(0, 60)
.Select(x => KeyValue.Create(startDate.AddDays(x), 15.03))
.Concat(Enumerable.Range(120, 60)
.Select(x => KeyValue.Create(startDate.AddDays(x), 15.03)))
.ToSeries();
这(或多或少)转化为从 2014-03-15 到 2014-05-15 的每日时间系列连续,然后丢失,然后从 2014-07-15 到 2014-09-15 连续。
我想将它汇总为每月时间序列,包括从 2014-03 到 2014-09,作为下划线的平均值。考虑到它是一个排序系列,我想避免昂贵的 GroupBy 并使用采样函数。
我最好的解决方案是:
var monthly = daily.ResampleEquivalence(x => x.FirstDayOfTheMonth(), s => s.Mean());
这 return 一个系列,正确,但缺少关键 2014-06 的数据。
我想使用 ResampleUniform,但在 c# 中没有提供用于计算平均值的回调函数重载...
关于如何在 C# 中模拟 F# resampleUniformInto 有什么建议吗?
不完全模拟 F# resampleUniformInto,但作为解决方法:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace resample2
{
class Program
{
static void Main(string[] args)
{
var startDate = DateTime.ParseExact("2014-03-15", "yyyy-MM-dd", CultureInfo.InvariantCulture);
var daily = Enumerable.Range(0, 60)
.Select(x => KeyValue.Create(startDate.AddDays(x), 15.03))
.Concat(Enumerable.Range(120, 60)
.Select(x => KeyValue.Create(startDate.AddDays(x), 15.03)))
.ToSeries();
var monthly = daily.ResampleEquivalence(x => x.ToString("yyyy-MM") , s => s.Mean());
monthly.Print();
var keys = Enumerable.Range(0, 360)
.Select(x => startDate.AddDays(x).Date)
.Where(x => x.Day == 1)
.Select(x=> x.ToString("yyyy-MM"));
var monthly2 = daily.ResampleEquivalence(x => x.ToString("yyyy-MM"), s => s.Mean()).Realign(keys);
monthly2.Print();
Console.ReadKey();
}
}
}
我想将 TimeSerie 重新采样到更大的时间粒度。我不确定在以下情况下 Deedle 中哪种方法最好。
假设我有一个从 2014-03-15 到 2014-09-15 的每日时间系列,生成如下:
var startDate = DateTime.Parse('2014-03-15');
var daily = Enumerable.Range(0, 60)
.Select(x => KeyValue.Create(startDate.AddDays(x), 15.03))
.Concat(Enumerable.Range(120, 60)
.Select(x => KeyValue.Create(startDate.AddDays(x), 15.03)))
.ToSeries();
这(或多或少)转化为从 2014-03-15 到 2014-05-15 的每日时间系列连续,然后丢失,然后从 2014-07-15 到 2014-09-15 连续。
我想将它汇总为每月时间序列,包括从 2014-03 到 2014-09,作为下划线的平均值。考虑到它是一个排序系列,我想避免昂贵的 GroupBy 并使用采样函数。
我最好的解决方案是:
var monthly = daily.ResampleEquivalence(x => x.FirstDayOfTheMonth(), s => s.Mean());
这 return 一个系列,正确,但缺少关键 2014-06 的数据。
我想使用 ResampleUniform,但在 c# 中没有提供用于计算平均值的回调函数重载...
关于如何在 C# 中模拟 F# resampleUniformInto 有什么建议吗?
不完全模拟 F# resampleUniformInto,但作为解决方法:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace resample2
{
class Program
{
static void Main(string[] args)
{
var startDate = DateTime.ParseExact("2014-03-15", "yyyy-MM-dd", CultureInfo.InvariantCulture);
var daily = Enumerable.Range(0, 60)
.Select(x => KeyValue.Create(startDate.AddDays(x), 15.03))
.Concat(Enumerable.Range(120, 60)
.Select(x => KeyValue.Create(startDate.AddDays(x), 15.03)))
.ToSeries();
var monthly = daily.ResampleEquivalence(x => x.ToString("yyyy-MM") , s => s.Mean());
monthly.Print();
var keys = Enumerable.Range(0, 360)
.Select(x => startDate.AddDays(x).Date)
.Where(x => x.Day == 1)
.Select(x=> x.ToString("yyyy-MM"));
var monthly2 = daily.ResampleEquivalence(x => x.ToString("yyyy-MM"), s => s.Mean()).Realign(keys);
monthly2.Print();
Console.ReadKey();
}
}
}