(论文阅读-分析引擎)Modin

一、简介

  • 目标是在不改变的Dataframe语义的情况下支持可扩展的dataframe操作。

  • 什么是机会主义评价?Opportunistic Evaluation?

  • Exploratory data analysis(EDA):总结、理解并从数据集中获取价值的过程。

  • MPI:MPI是高性能计算常用的实现方式,它的全名叫做Message Passing Interface。顾名思义,它是一个实现了消息传递接口的库。并行计算之MPI篇 · XTAO Achelous

  • OpenMP:OpenMP(Open Multi-Processing)是一套支持跨平台共享内存方式的多线程并发的编程API,使用C,C++Fortran语言,可以在大多数的处理器体系和操作系统中运行,包括Solaris, AIX, HP-UX, GNU/Linux, Mac OS X, 和Microsoft Windows。包括一套编译器指令、库和一些能够影响运行行为的环境变量。https://zh.m.wikipedia.org/zh-hans/OpenMP

  • lazy执行和eager执行的区别:lazy执行可以根据完整的数据流图进行优化,但eager执行对于数据科学家交互式执行的体验更好。lazy执行的框架Spark、Dask,eager执行的框架pandas等,但这样的框架通常无法做分布式计算(Modin就是为了解决这个问题)。

  • dataframe用户和可扩展数据工具例如mysql用户的行为差距,会影响到数据框架系统的性能。dataframe用户通常会用一种增量、迭代和交互式的方式构建查询。这本身就带来了关系型数据库所不具备的多种挑战,特别是围绕查询规划和查询优化。

  • Modin架构

  • Modin提出了一个机会主义评估Opportunistic evaluation的概念,利用用户的思考时间在dataframe语句上去的进展。机会主义评估利用用户的思考时间,去保证CPU在努力实现结果,以节省数据科学家的时间。这样的执行方式比lazy执行快8倍。这里的结果表明,传统的计算范式在交互式环境中并不是最优的,而机会主义评估是实现高效交互式数据科学的一个良好开端。

二、Dataframe系统的需求

  • 在交互式工作流中,dataframe用户经常花费大量时间来检查结果,并思考接下来应该做什么。

  • 在检查结果时,通常会检查前缀(前k行)和后缀(最后k行),以确保一系列的操作符按照预期执行。我们在第2.5节中探讨数据框架前缀和后缀计算的独特挑战。

  • 可组合性是数据框架最重要的特征之一,因为它允许用户逐步测试并分块建立更大的工作流程。

  • data science lifecycle:

  • dataframe的以下特点使之成为数据探索的一个有吸引力的选择:

    • 一个直观的数据模型,包含了对列和行的隐性排序,并对称地处理它们。

    • 一种查询语言,连接各种数据分析模式,包括关系型(如过滤、连接)、线性代数(如转置)和电子表格型(如透视)运算符。

    • 一个递增的可组合的查询语法,鼓励简单表达式的简单和快速验证,以及它们的迭代细化和组合成复杂的查询;

    • 以及在主机语言(如Python)中的本地嵌入,具有熟悉的命令式语义。

  • 通过数据科学家的操作习惯我们可以了解到,dataframe的常见使用情况具有以下这些特点:

    • 大多数操作后会立刻进行视觉检查(可视化)

    • 每个操作都是在之前的结果基础上递增的

    • 通过用户定义的函数进行点和批量更新

    • 具有用于处

## 数据预处理 Python 代码(带注释) ```python # -*- coding: utf-8 -*- import pandas as pd import numpy as np # 1. 读取Excel数据 file_path = '数据整理.xlsx' df = pd.read_excel(file_path, sheet_name='Sheet1', header=2) # 第三行为列名 # 2. 查看原始数据结构 print("原始列名:", df.columns.tolist()) print("\n前几行数据:") print(df.head()) # 3. 重命名列名,去除多余空格和符号,便于调用 column_mapping = { '省份': 'province', '年份': 'year', '农村居民人均可支配收入': 'income', '农村地区小微支行机构万人密度': 'branch', '本省数字金融普及率': 'digital', '财政支农水平': 'agri', '公路密度': 'road', '经济发展水平(人均GDP)': 'gdp', '互联网普及率': 'internet', '农村机械化水平': 'mech', '农村平均受教育年限': 'edu' } df = df.rename(columns=column_mapping) # 4. 清洗财政支农水平 agri:去除百分号并转为浮点数 df['agri'] = df['agri'].astype(str).str.replace('%', '', regex=False) df['agri'] = pd.to_numeric(df['agri'], errors='coerce') / 100 # 转换为小数形式 # 5. 创建区域分组变量 group def assign_group(province): eastern_group = ["江苏", "浙江", "上海", "广东"] western_south_group = ["重庆", "四川", "贵州", "云南"] if province in eastern_group: return 0 # 江浙沪粤地区 elif province in western_south_group: return 1 # 西南地区 else: return np.nan df['group'] = df['province'].apply(assign_group) # 添加组别标签说明 group_labels = {0: "江浙沪粤地区", 1: "西南地区"} df['group_label'] = df['group'].map(group_labels) # 6. 检查缺失值与数据类型 print("\n数据基本信息:") print(df.info()) print("\n各省份所属分组检查:") print(df[['province', 'group_label']].drop_duplicates()) # 7. 对关键变量取自然对数(缓解异方差) df['ln_income'] = np.log(df['income']) df['ln_branch'] = np.log(df['branch'] + 1e-8) # 加极小数避免 log(0) df['ln_digital'] = np.log(df['digital']) df['ln_gdp'] = np.log(df['gdp']) df['ln_road'] = np.log(df['road']) df['ln_mech'] = np.log(df['mech']) # 8. 处理其他控制变量 # internet 已是比例形式(如0.37),无需额外处理 # edu 教育年限保持原样 # 9. 设置面板索引 df.set_index(['province', 'year'], inplace=True) # 10. 排序并重置索引(可选) df.sort_values(by=['group', 'province', 'year'], inplace=True) # 11. 保存清洗后的数据为新文件 output_file = 'processed_data_panel.csv' df.to_csv(output_file, encoding='utf-8-sig') # 12. 输出分组描述性统计(用于论文表格) desc_east = df[df['group'] == 0][['ln_income', 'ln_digital', 'ln_branch', 'ln_gdp', 'internet', 'agri', 'edu', 'ln_mech']].describe() desc_west = df[df['group'] == 1][['ln_income', 'ln_digital', 'ln_branch', 'ln_gdp', 'internet', 'agri', 'edu', 'ln_mech']].describe() with open('group_descriptive.txt', 'w', encoding='utf-8') as f: f.write("=== 江浙沪粤地区描述性统计 ===\n") f.write(desc_east.to_string()) f.write("\n\n") f.write("=== 西南地区描述性统计 ===\n") f.write(desc_west.to_string()) print(f"\n✅ 数据预处理完成!已保存至:{output_file}") print("分组描述性统计已导出至:group_descriptive.txt")
11-28
2025-06-08 12:50:31,389 WARNING __init__.py:40 -- You are using the 'pickle5' module, but the exact version is unknown (possibly carried as an internal component by another module). Please make sure you are using pickle5 >= 0.0.10 because previous versions may leak memory. --------------------------------------------------------------------------- KeyError Traceback (most recent call last) /usr/local/lib/python3.7/site-packages/modin/config/pubsub.py in get(cls) 252 try: --> 253 raw = cls._get_raw_from_config() 254 except KeyError: /usr/local/lib/python3.7/site-packages/modin/config/envvars.py in _get_raw_from_config(cls) 45 """ ---> 46 return os.environ[cls.varname] 47 /usr/local/lib/python3.7/os.py in __getitem__(self, key) 677 # raise KeyError with the original key value --> 678 raise KeyError(key) from None 679 return self.decodevalue(value) KeyError: 'MODIN_ENGINE' During handling of the above exception, another exception occurred: ImportError Traceback (most recent call last) <ipython-input-11-5fbb6ba3cbaf> in <module> 2 import modin.pandas as pd 3 from modin.config import Engine ----> 4 Engine.put("ray") # 或 Engine.put("dask") 启用分布式计算 5 6 # 优化数据类型(减少内存占用40-70%) /usr/local/lib/python3.7/site-packages/modin/config/pubsub.py in put(cls, value) 272 Config value to set. 273 """ --> 274 cls._check_callbacks(cls._put_nocallback(value)) 275 cls._value_source = ValueSource.SET_BY_USER 276 /usr/local/lib/python3.7/site-packages/modin/config/pubsub.py in _put_nocallback(cls, value) 314 raise ValueError(f"Unsupported value: {value}") 315 value = _TYPE_PARAMS[cls.type].normalize(value) --> 316 oldvalue, cls._value = cls.get(), value 317 return oldvalue 318 /usr/local/lib/python3.7/site-packages/modin/config/pubsub.py in get(cls) 253 raw = cls._get_raw_from_config() 254 except KeyError: --> 255 cls._value = cls._get_default() 256 cls._value_source = ValueSource.DEFAULT 257 else: /usr/local/lib/python3.7/site-packages/modin/config/envvars.py in _get_default(cls) 120 return "Native" 121 raise ImportError( --> 122 "Please refer to installation documentation page to install an engine" 123 ) 124 ImportError: Please refer to installation documentation page to install an engine
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值