Ejemplo n.º 1
0
        //这个部分类储存了关于IData和DataView互相转换的方法

        #region 从IData加载IDataView
        #region 说明文档

        /*问:从IData转换到IDataView的过程比较复杂,
         * 需要先把IData保存为文件,然后再加载到IDataView,这是为什么?
         * 答:这是不得已为之,根源在于微软的设计存在缺陷,
         * 因为IDataView有一个DataViewSchema类型的成员,
         * 它的构造函数不公开,导致在外部无法实现IDataView,
         * 进一步导致无法使用适配器模式,如果你有更好的办法,欢迎联系作者
         *
         * 补充说明:经过查阅文档,作者发现IDataView实际上是可以被实现的,
         * 但由于作者对IDataView的结构了解不够清楚,为避免未知错误,决定暂时不重构,
         * 如果在以后随着更深入的学习,这个问题得到解决,请回来将这个API重构掉
         *
         * 问:为什么不在加载完毕后立即删除缓存, 而是要等到程序退出后才删除?
         * 答:因为IDataView是延迟加载的,如果立即删除缓存,
         * 有可能在实际加载时找不到被加载的数据*/
        #endregion
        #region 辅助成员
        #region 通过IDATAView获取Column
        /// <summary>
        /// 读取<see cref="DataFrancis.IDataView"/>的列,并将它转换为<see cref="TextLoader.Column"/>
        /// </summary>
        /// <param name="data">待转换的<see cref="IData"/></param>
        /// <returns></returns>
        private static IEnumerable <TextLoader.Column> GetColumn(IDataViewF data)
        {
            foreach (var((name, type), index, _) in data.Schema.Schema.PackIndex())
            {
                var dk = Enum.Parse(typeof(DataKind), type.Name);
                yield return(new TextLoader.Column(name, (DataKind)dk, index));
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 通过<see cref="DataFrancis.IDataView"/>来加载机器学习数据
        /// </summary>
        /// <param name="datas">待加载的数据</param>
        /// <returns></returns>
        public static IDataViewML ToIDataView(this IDataViewF datas)
        {
            var dataView = datas.ToArray().ToIDirectView();
            var file     = ToolPerfo.CreateTemporaryFile(@"txt").Path;

            CreateDataObj.PipeFromFile(file, "\t", "null").DataAdd(dataView, default);
            var op = new TextLoader.Options()
            {
                HasHeader  = true,
                Separators = new[] { '\t' },
                Columns    = GetColumn(dataView).ToArray()
            };

            return(ToolML.Context.Data.LoadFromTextFile(file, op));
        }