# Metalfow_ProgPy **Repository Path**: ruoqing428/Metaflow_ProgPy ## Basic Information - **Project Name**: Metalfow_ProgPy - **Description**: 如何学习使用Metaflow和ProgPy - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-02-06 - **Last Updated**: 2025-02-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Metalfow_ProgPy ## 介绍 本项目旨在利用开源项目Metaflow和ProgPy构建用于进行模型状态估计和未来预测的框架。 ## 为什么使用Metaflow和ProgPy ###Metaflow Metaflow是一个集建模、部署、版本控制、编排、计算以及数据于一体的库,十分便于开发。 1. 几乎可以将任何Python库于Metaflow一起使用,Metaflow让它们在大部分环境中都可以使用。 2. Metaflow支持高度可用的生产级工作流编排和其他部署模式。 3. Metaflow 会自动记录所有的流程、实验以及产物。 4. Metaflow 让构建工作流程并在本地进行测试变得更加便捷。 5. Metaflow 借助你的云账户和 Kubernetes 集群来实现可扩展性,可以实现远程控制和云端计算。 6. 除了管理工作流内部的数据流,Metaflow 还提供了从数据仓库和数据湖中访问数据的模式。 ###ProgPy ProgPy的关键在Prognostics,也即预测。在ProgPy中预测的定义是“对一个系统或系统集合的未来性能,以及一个或多个关注事件发生的时间进行预测” 在ProgPy库中,有可以用于评估和预测的模型,也有评估模型和预测模型,可以用于一些基础的模型评估和模型预测。 ## 安装方法 1. Metaflow安装 详情见[Metaflow的学习笔记](https://gitee.com/ruoqing428/Metaflow_ProgPy/blob/master/Metaflow/Metaflow%E5%AD%A6%E4%B9%A0%E8%BF%87%E7%A8%8B.pdf) 2. ProgPy安装 详情见[ProgPy的学习笔记](https://gitee.com/ruoqing428/Metaflow_ProgPy/blob/master/ProgPy/ProgPy%E5%AD%A6%E4%B9%A0%E8%BF%87%E7%A8%8B.pdf) 注:Metaflow不支持Windows系统,需使用macOS或Linux系统,安装使用的过程同在[Metaflow的学习笔记](https://gitee.com/ruoqing428/Metaflow_ProgPy/blob/master/Metaflow/Metaflow%E5%AD%A6%E4%B9%A0%E8%BF%87%E7%A8%8B.pdf) ## 基本案例 1. 在[Metaflow案例](https://gitee.com/ruoqing428/Metaflow_ProgPy/tree/master/Metaflow)中有部分Metaflow基础使用方法的案例可供参考 2. 在[ProgPy案例](https://gitee.com/ruoqing428/Metaflow_ProgPy/tree/master/ProgPy)中有部分ProgPy基础使用以及一些模型和状态估计以及预测算法的使用案例 3. 在[ProgFlow](https://gitee.com/ruoqing428/Metaflow_ProgPy/tree/master/ProgFlow)中有两个我自己尝试的将ProgPy搭建到Metaflow上的案例,基本的搭建是可以完成的,但过程中确有问题出现 ## 出现问题 ### ProgPy 1. PorgPy中的状态估计模型和预测模型都只接受模型输入,而不接受数据形式的输入,所以如果想要使用滤波器和预测器进行预测评估的话,就需要使用模型,或者将数据转化为模型;对于数据集也可以进行处理,如[dataset](https://gitee.com/ruoqing428/Metaflow_ProgPy/blob/master/ProgPy/dataset.py)案例中所示。 2. 在尝试运行ProgPy的basic_example案例中,使用Particle_Filter时,会出现 RuntimeWarning: divide by zero encountered in divide x = np.asarray((x - loc)/scale, dtype=dtyp) 和 RuntimeWarning: invalid value encountered in cast num_copies = (np.floor(N*np.asarray(weights))).astype(int) 的警告,得到的结果也是和理论计算得到的结果有一定的误差; 使用UnscentedKalman_Filter时,会出现 UserWarning: Use UncertainData type if estimating filtering with uncertain data. warn("Use UncertainData type if estimating filtering with uncertain data.") 的警告,得到的结果同样也会存在不小的误差,,目前具体问题和解决方法仍在学习中 ### ProgPy+Metaflow 1. 在进行Metaflow和ProgPy结合的尝试时,发现使用PF(粒子滤波器)对ThrownObject模型进行预测时可以正常进行预测,而使用UKF(无迹卡尔曼滤波器)进行预测时,会出现 AttributeError: Can't pickle local object 'UnscentedKalmanFilter.__init__..measure' 应该是因为在Metaflow中每一个需要传递的对象都需要被序列化,但ProgPy中的UnscentedKalmanFilter实例包含无法序列化的局部函数 这也就意味着如果想要在Metaflow中使用UKF,有两种方法: 第一种是不降UKF实例序列化,让该实例作为局部变量使用,但这样会导致在这一步中的结果无法在后续步骤中进行预测和与其他模型的比较,因此并不适用 第二种是尝试修改ProgPy库中的UnscentedKalmanFilter类 总结就是UKF并不适合在Metaflow这个框架下使用 尝试使用第二种解决办法,首先找到unscented_kalman_filter.py文件,将其中的 measure 和 state_transition 提升为类方法,再修改filterpy的 UnscentedKalmanFilter 初始化逻辑,确保在初始化 self.filter 时,将 measure 和 state_transition 绑定到实例方法。 修改后的代码在[UKF修改方案](https://gitee.com/ruoqing428/Metaflow_ProgPy/blob/master/ProgFlow/unscented%20kalman%20filter.py)中,做出的修改在注释中写出。 ## 后续探索发展 这个项目的创建主要是为了使用Metaflow框架,构建一个状态估计和未来预测的模型,在后续可以借鉴ProgPy的建模方式,自己进行模型建立 在建立模型时有几点可以借鉴的 1. 要做到既能面向对象也能面向过程,做到可以直接通过数据进行估计预测,也可以对模型进行估计预测 2. 避免在构造函数中出现无法被Pickle序列化的局部函数