如何用Deedle在C#中实现Python Pandas的OHLC重采样及列命名
解决方案:用Deedle实现Pandas式的OHLC重采样逻辑
1. 读取CSV并自定义列名
Deedle读取无表头的CSV时,可通过Frame.ReadCsv的columns参数直接指定列名,避免默认的Column0/Column1这类自动命名:
using Deedle; using System; // 定义与原Python代码对应的列名 string[] columnNames = { "id", "price", "qty", "quoteQty", "time", "makerBuy", "bestPrice" }; var df = Frame.ReadCsv("ETHUSDT-trades-2022-12-16.csv", hasHeaders: false, columns: columnNames);
2. 转换时间戳并设置为索引
将毫秒级Unix时间戳转换为DateTime类型,再将其设为DataFrame的索引(对应原Python的set_index操作):
// 把time列的毫秒时间戳转换为DateTime var timeSeries = df["time"].Select(x => DateTimeOffset.FromUnixTimeMilliseconds((long)x).DateTime); // 将time列设为索引,并移除原列 df = df.IndexRowsWith(timeSeries).DropColumn("time");
3. 按240分钟周期重采样生成OHLC数据
使用Deedle的ResampleTime方法按固定时间间隔重采样,通过Aggregate方法指定OHLC四个维度的聚合逻辑:
// 获取价格列(转成double类型确保数值计算正常) var priceSeries = df["price"].Cast<double>(); // 按240分钟周期重采样,生成OHLC数据 var ohlcFrame = priceSeries.ResampleTime(TimeSpan.FromMinutes(240)) .Aggregate( open: s => s.FirstValue(), high: s => s.Max(), low: s => s.Min(), close: s => s.LastValue() ); // 打印结果 ohlcFrame.Print();
完整整合代码
using Deedle; using System; class Program { static void Main() { // 1. 读取CSV并设置列名 string[] columnNames = { "id", "price", "qty", "quoteQty", "time", "makerBuy", "bestPrice" }; var df = Frame.ReadCsv("ETHUSDT-trades-2022-12-16.csv", hasHeaders: false, columns: columnNames); // 2. 转换时间戳并设置为索引 var timeSeries = df["time"].Select(x => DateTimeOffset.FromUnixTimeMilliseconds((long)x).DateTime); df = df.IndexRowsWith(timeSeries).DropColumn("time"); // 3. 重采样生成OHLC var priceSeries = df["price"].Cast<double>(); var ohlcFrame = priceSeries.ResampleTime(TimeSpan.FromMinutes(240)) .Aggregate( open: s => s.FirstValue(), high: s => s.Max(), low: s => s.Min(), close: s => s.LastValue() ); ohlcFrame.Print(); } }
关键对应关系说明
- 原Python的
names参数 → Deedle的columns参数,用于自定义列名 - 原Python的
pd.to_datetime(df["time"], unit="ms")→DateTimeOffset.FromUnixTimeMilliseconds,实现毫秒时间戳转DateTime - 原Python的
df.set_index("time")→df.IndexRowsWith(timeSeries),将时间列设为索引 - 原Python的
resample("240T").agg(...)→ResampleTime(TimeSpan.FromMinutes(240)).Aggregate(...),按固定周期聚合生成OHLC
内容的提问来源于stack exchange,提问作者nop
相关产品推荐
相关产品推荐

