数据读取、处理与保存
该部分为数据去读取、数据处理、数据保存以及对于文件的操作
数据读取(Extract)
Functions:
|
从中gdf_dict读取数据以及文件夹名称,并构造文件夹层级,按照指定层级合并所 有数据,并打上层级标签 |
|
读取 dict {level: gpd.GeoDataFrame} 字典, 并根据[name]列包含关系提取分辨文件夹层级 |
|
常用文件读取函数,支持 .csv/.xlsx/.xls/.shp/.parquet/.pickle/.feather/.kml/.ovkml/ .geojson/.shp/.json等 |
|
从文件夹中读取所有文件并拼接成一个DataFrame |
|
读取excel文件 |
|
读取并合并所有sheet表 |
|
读取csv文件,基于 pd.read_csv,加入编码尝试 |
|
读取gdb文件夹 |
|
读取kml类文件,将其转换成DataFrame, 根据separate_folders选择是否拆分, 输出仅保留[name, geometry]字段,暂时只支持polygon和multipolygon数据 |
|
逐行读取json格式的文件 |
|
读取shapefile或geojson文件 |
|
读取shapefile文件,分别读取dbf中的属性表和shp中的geometry进行拼接 |
|
读取SPSS的.sav文件 |
- ricco.etl.extract.get_kml_df_with_level(gdf_dict: dict) GeoDataFrame
从中gdf_dict读取数据以及文件夹名称,并构造文件夹层级,按照指定层级合并所 有数据,并打上层级标签
- 参数:
gdf_dict – GeoDataFrame组成的字典,key为文件夹名称, value为对应数据:{level: gpd.GeoDataFrame}
- ricco.etl.extract.kml_df_create_level(gdf_dict: dict) dict
读取 dict {level: gpd.GeoDataFrame} 字典, 并根据[name]列包含关系提取分辨文件夹层级
- 参数:
gdf_dict – {dict} {level: gpd.GeoDataFrame} key为文件夹名称, value为对应数据
- 返回:
{‘板块名称’: 0, ‘T顶豪’: 1, ‘O1远郊品质’: 2}
- 返回类型:
文件夹层级字典,如
- ricco.etl.extract.rdf(file_path: str, *, sheet_name=0, sheet_contains: str = None, encoding: str = None, info: bool = False, dtype=None, columns: (<class 'list'>, <class 'str'>) = None, nrows: int = None, recursive: bool = True) DataFrame
常用文件读取函数,支持 .csv/.xlsx/.xls/.shp/.parquet/.pickle/.feather/.kml/.ovkml/ .geojson/.shp/.json等
- 参数:
file_path – 文件或文件夹路径
sheet_name – 数据所在sheet的名称,仅对.xlsx/.xls生效
sheet_contains – 筛选sheet名称中包含此字符串的sheet,仅对.xlsx/.xls生效
encoding – 编码
info – 是否打印数据集情况(shape & columns)
dtype – 指定读取列的类型
columns – 指定读取的列名
nrows – 指定读取的行数
recursive – 是否循环遍历更深层级的文件夹,默认为True,仅当路径为文件夹时生效
- ricco.etl.extract.rdf_by_dir(dir_path, exts=None, ignore_index=True, recursive=False, columns: (<class 'list'>, <class 'str'>) = None, info=False) DataFrame
从文件夹中读取所有文件并拼接成一个DataFrame
- 参数:
dir_path – 文件夹路径
exts – 要读取的文件扩展名
ignore_index – 是否忽略索引
recursive – 是否循环遍历更深层级的文件夹
columns – 指定列名
info – 是否打印基本信息(列名、行列数)
- ricco.etl.extract.rdxls(file_path, *, sheet_name=0, sheet_contains: str = None, dtype=None, columns: (<class 'list'>, <class 'str'>) = None, nrows: int = None) DataFrame
读取excel文件
- 参数:
file_path – 文件名
sheet_name – sheet表的名称
sheet_contains – sheet表包含的字符串
dtype – 指定读取列的类型
columns – 指定读取的列
nrows – 指定读取的行数
- ricco.etl.extract.read_all_sheets(file_path, sheet_names=None, ignore_diff_columns=False)
读取并合并所有sheet表
- 参数:
file_path – Excel文件路径
sheet_names – 要读取并合并的sheet列表,默认读取全部的sheet
ignore_diff_columns – 如果每个sheet中的字段名不一致,是否要忽略
- ricco.etl.extract.read_csv(file_path: str, *, encoding: str = None, dtype=None, columns: (<class 'list'>, <class 'str'>) = None, nrows: int = None, **kwargs)
读取csv文件,基于 pd.read_csv,加入编码尝试
- ricco.etl.extract.read_gdb(dir_path)
读取gdb文件夹
- ricco.etl.extract.read_kml(file_path, keep_level=True) GeoDataFrame
读取kml类文件,将其转换成DataFrame, 根据separate_folders选择是否拆分, 输出仅保留[name, geometry]字段,暂时只支持polygon和multipolygon数据
- 参数:
file_path – kml or ovkml文件路径
keep_level – 是否保留文件夹层级标签
- ricco.etl.extract.read_line_json(file_path, encoding='utf-8') DataFrame
逐行读取json格式的文件
- 参数:
file_path – 文件名
encoding – 文件编码,默认为utf-8
- ricco.etl.extract.read_shapefile(file_path, **kwargs)
读取shapefile或geojson文件
- ricco.etl.extract.read_shapefile_with_driver(file_path, encoding='utf-8') GeoDataFrame
读取shapefile文件,分别读取dbf中的属性表和shp中的geometry进行拼接
- ricco.etl.extract.read_spss(file_path, columns=None, nrows=None, encoding=None)
读取SPSS的.sav文件
数据处理(Transform)
Functions:
|
将日期转为当月的第一天或最后一天 |
|
提取字符串中的数值信息并转为float类型 |
|
创建新的列,默认为空 |
|
DataFrame切片生成器 |
|
将字典转为dataframe |
|
根据一个df_deleted中的数据从df中删除 |
|
展开字典为多列 |
|
展开字典为多列 |
|
将图数据展开为宽表 |
|
以自增的方式填充空值 |
|
从df中筛选出满足df_size的数据 |
|
将None/NaN/NaT等都替换为None |
|
模糊匹配。为DataFrame中的某一列从某个集合中模糊匹配匹配相似度最高的元素 |
|
判断新旧数据集中的每一条数据是否变化 |
|
优化的去重函数,为保证数据的完整性,去重时优先去除指定列中的空值 |
|
如果列的值正好在values中定义的数组中,则将该列值设置为None |
|
对整列进行四舍五入,默认绝对值大于1的数值保留两位小数,小于1 的保留4位 |
|
将列表列中列表的元素拆成多行 |
|
含有多值的列分拆成多行 |
|
DataFrame转字典 |
|
根据某一列更新dataframe里的数据 |
|
将指定的多列合并成一个字典列 :param df: 要处理的数据集 :param c_srcs: 需要包装成字典的多列, 如果不指定,则wrap所有的列 :param c_dst: 处理后的数据存储的列名称,默认为 'extra' |
- ricco.etl.transformer.convert_date(df: ~pandas.core.frame.DataFrame, columns: (<class 'str'>, <class 'list'>), mode: str = 'first') DataFrame
将日期转为当月的第一天或最后一天
- 参数:
df – 要处理的DataFrame
columns – 要转换的列
mode – ‘first’ or ‘last’
- ricco.etl.transformer.convert_to_float(df: ~pandas.core.frame.DataFrame, columns: (<class 'list'>, <class 'str'>), rex_method: str = 'mean') DataFrame
提取字符串中的数值信息并转为float类型
- 参数:
df – 要转换的DataFrame
columns – 要转换的列
rex_method – 计算mean,max,min, 默认为mean
- ricco.etl.transformer.create_columns(df: DataFrame, columns: list, value=None)
创建新的列,默认为空
- 参数:
df – DataFrame
columns – 列名
value – 值,默认为空
- ricco.etl.transformer.df_iter(df: DataFrame, *, chunksize: int | None = None, parts: int | None = None)
DataFrame切片生成器
- 参数:
df – 要切片的DataFrame
chunksize – 每次返回的大小,与parts必须指定一个
parts – 返回的次数,与chunksize必须指定一个
- ricco.etl.transformer.dict2df(data: dict, c_key='key', c_value='value', as_index=False)
将字典转为dataframe
- ricco.etl.transformer.drop_by_df(df: DataFrame, df_deleted: DataFrame) DataFrame
根据一个df_deleted中的数据从df中删除
- ricco.etl.transformer.expand_dict(df: DataFrame, c_src: str)
展开字典为多列
- ricco.etl.transformer.expand_dict_silent(df: DataFrame, c_src: str)
展开字典为多列
- ricco.etl.transformer.expand_graph(df: DataFrame, start_level, c_key='id', c_level_type='level_type', c_parent_key='parent_id', c_info=None)
将图数据展开为宽表
- 参数:
df – 要展开的图数据
start_level – 开始展开的层级,一般是最低层级
c_key – 关键列
c_level_type – 层级类型列
c_parent_key – 父级关键列
c_info – 要保留的其他列
- ricco.etl.transformer.fillna_by_adding(df: DataFrame, col: str)
以自增的方式填充空值
- ricco.etl.transformer.filter_by_df(df: DataFrame, df_sizer: DataFrame) DataFrame
从df中筛选出满足df_size的数据
- ricco.etl.transformer.fix_null(df: ~pandas.core.frame.DataFrame, columns: (<class 'str'>, <class 'list'>) = None)
将None/NaN/NaT等都替换为None
- ricco.etl.transformer.fuzz_df(df: ~pandas.core.frame.DataFrame, col: str, target_series: (<class 'list'>, <class 'pandas.core.series.Series'>), c_dst: str = None, valid_score=0) DataFrame
模糊匹配。为DataFrame中的某一列从某个集合中模糊匹配匹配相似度最高的元素
- 参数:
df – 输入的dataframe
col – 要匹配的列
target_series – 从何处匹配, list/pd.Series
c_dst – 关联后输出的列名,默认为原列名+”_target”后缀
valid_score – 相似度大于该值的才返回
- ricco.etl.transformer.is_changed(df_old: ~pandas.core.frame.DataFrame, df_new: ~pandas.core.frame.DataFrame, key_cols: (<class 'str'>, <class 'list'>) = None, value_cols: (<class 'str'>, <class 'list'>) = None, c_res: str = 'is_changed') DataFrame
判断新旧数据集中的每一条数据是否变化
- 参数:
df_old – 原始数据集
df_new – 修改后的数据集
key_cols – 关键列,不指定则以索引列为准
value_cols – 要对比的列,默认出key_cols之外的其他列
c_res – 对比结果列名,默认为“is_changed”
- ricco.etl.transformer.keep_best_unique(df: ~pandas.core.frame.DataFrame, subset: (<class 'list'>, <class 'str'>), value_cols: (<class 'str'>, <class 'list'>) = None) DataFrame
优化的去重函数,为保证数据的完整性,去重时优先去除指定列中的空值
- 参数:
df – 要去重的Dataframe
subset – 按照哪些列去重
value_cols – 优先去除那些列的空值,该列表是有顺序的
- ricco.etl.transformer.null_if_in(df, columns: (<class 'str'>, <class 'list'>), values: list)
如果列的值正好在values中定义的数组中,则将该列值设置为None
- 参数:
df –
columns – 需要检查的列,一个或多少
values – 所有需要标识为None的值
- ricco.etl.transformer.round_by_columns(df, columns: list)
对整列进行四舍五入,默认绝对值大于1的数值保留两位小数,小于1 的保留4位
- ricco.etl.transformer.split_list_to_row(df: DataFrame, column)
将列表列中列表的元素拆成多行
- ricco.etl.transformer.split_to_rows(df: DataFrame, column: str, delimiter: str = '|')
含有多值的列分拆成多行
- 参数:
df –
column – 存在多值的列
delimiter – 多个值之间的分割符
- ricco.etl.transformer.table2dict(df: ~pandas.core.frame.DataFrame, key_col: str = None, value_col: (<class 'str'>, <class 'list'>) = None, orient: str = 'dict') dict
DataFrame转字典
- 参数:
df –
key_col – 生成key的列
value_col – 生成value的列
orient – 生成dict的方式,默认 ‘dict’,还有 ‘list’, ‘series’, ‘split’, ‘records’, ‘index’
- ricco.etl.transformer.update_df(df: ~pandas.core.frame.DataFrame, new_df: ~pandas.core.frame.DataFrame, on: (<class 'str'>, <class 'list'>) = None, overwrite: bool = True, errors: str = 'ignore') DataFrame
根据某一列更新dataframe里的数据
- 参数:
df – 待升级的数据集
new_df – 用于更新的DataFrame
on – (可选参数)用于判断更新哪些行的列
overwrite –
(可选参数)控制如何处理原DataFrame在重叠位置上 非空 的值,默认为True
True: 默认值;使用 other DataFrame中的值覆盖原DataFrame中相应位置的值.
False: 只更新原DataFrame中重叠位置数据为 空 的值.
errors –
(可选参数)控制如何处理两个DataFrame同一位置都有值的行为,默认为 ‘ignore’
’ignore’: 默认值;DataFrame类型 df和other在同一个cell位置都是非NA值, 使用other中的值替换df中的值。
’raise’: target和other都在同一位置包含非NA数据将抛出ValueError异常(’Data overlaps’)。
- ricco.etl.transformer.wrap_dict(df: DataFrame, c_srcs: list | None = None, c_dst: str = 'extra')
将指定的多列合并成一个字典列 :param df: 要处理的数据集 :param c_srcs: 需要包装成字典的多列, 如果不指定,则wrap所有的列 :param c_dst: 处理后的数据存储的列名称,默认为 ‘extra’
数据保存(Load)
Functions:
|
逐行写入csv文件 |
|
根据文件扩展名,将Dataframe保存为文件 |
|
保存parquet文件,默认将shapely对象转换为wkb格式 |
|
将Dataframe保存为多个文件 |
|
将多个dataframe保存到不同的sheet中 |
- ricco.etl.load.to_csv_by_line(data: list, filename: str)
逐行写入csv文件
- 参数:
data – 要写入的数据列表
filename – 文件名
- ricco.etl.load.to_file(df: DataFrame, filepath, *, index=False, log=True, encoding=None)
根据文件扩展名,将Dataframe保存为文件
- 参数:
df – 要保存的Dataframe
filepath – 文件路径,包含扩展名
index – 是否保存索引,默认不保存
log – 是否打印保存信息
encoding – 保存文件的编码
- ricco.etl.load.to_parquet(df, filepath, index)
保存parquet文件,默认将shapely对象转换为wkb格式
- ricco.etl.load.to_parts_file(df, dirpath, chunksize=None, parts=None, to_ext='.csv', **kwargs)
将Dataframe保存为多个文件
- 参数:
df – 要拆分保存的DataFrame
dirpath – 文件保存的目录
chunksize – 拆分保存的文件大小
parts – 拆分保存的文件数量
to_ext – 文件扩展名
- ricco.etl.load.to_sheets(data: dict, filename: str, index=False)
将多个dataframe保存到不同的sheet中
- 参数:
data – 要保存的数据集,格式为:{sheet_name: DataFrame}
filename – 要保存的文件名
index – 是否保存index
文件操作(File)
Functions:
|
按列的值分组迭代df |
|
转换整个目录中的文件格式 |
|
文件格式转换,整体读取并转换,将文件整体加载到内存中再保存为另一种文件格式 |
|
gdb文件转换为csv文件 |
|
合并指定目录下的所有CSV文件到一个输出文件中,极低内存消耗 |
|
将文件拆分成小文件,并保存到to_dir中 |
|
将文件拆分为多个文件,放置在与文件同名目录下 |
|
将文件拆分为多个文件,放置在与文件同名目录下 |
|
将文件拆分为多个文件,放置在与文件同名目录下 |
|
将csv文件按指定列的值拆分为多个文件 |
- ricco.etl.file.df_iter_by_column(df: DataFrame, by, na='null')
按列的值分组迭代df
- ricco.etl.file.dir_file_to_x(from_dir, to_dir, from_ext=None, to_ext=None, recursive=False, delete=False, log=False)
转换整个目录中的文件格式
- ricco.etl.file.file_to_x(filepath, to_ext, to_dir=None, delete=False, overwrite=False, log=True, **kwargs)
文件格式转换,整体读取并转换,将文件整体加载到内存中再保存为另一种文件格式
- 参数:
filepath – 待转换的文件路径
to_ext – 要保存的文件扩展名
to_dir – 要写入的文件路径,默认存放在原目录
delete – 是否删除原文件,默认不删除
overwrite – 是否覆盖原文件,默认不覆盖
log – 是否输出文件保存、删除日志
- ricco.etl.file.gdb2csv(dir_path, output_path=None, with_geometry=True, geom_format='wkb', log=True)
gdb文件转换为csv文件
- ricco.etl.file.merge_csv_files(dir_path, output_file)
合并指定目录下的所有CSV文件到一个输出文件中,极低内存消耗
参数: - csv_dir: CSV文件所在的目录 - output_file: 合并后的输出CSV文件路径
- ricco.etl.file.reshape_files(from_dir, to_dir, from_ext=None, to_ext=None, chunksize: int = 100000, func=None, log=False, **kwargs)
将文件拆分成小文件,并保存到to_dir中
- 参数:
from_dir – 读取的目录
to_dir – 保存的目录
from_ext – 读取的扩展名,默认为None,全部读取
to_ext – 保存的扩展名,默认为None,若读取文件的扩展名唯一,则使用读文文件的扩展名,反之需要指定
chunksize – 每个文件的大小
func – 自定义处理函数
log – 是否打印日志
- ricco.etl.file.split2x(filename: str, *, chunksize: int | None = None, parts: int | None = None, to_ext='.csv', log=True, fn=None)
将文件拆分为多个文件,放置在与文件同名目录下
- 参数:
filename – 输入的文件路径
chunksize – 每份文件的数据量
parts – 输出的文件个数
to_ext – 输出的文件扩展名
log – 是否输出文件保存信息
fn – 处理函数
- ricco.etl.file.split2x_by_chunksize(filepath: str, *, chunksize: int = 50000, to_ext='.csv', log=True, fn=None, **kwargs)
将文件拆分为多个文件,放置在与文件同名目录下
- 参数:
filepath – 输入的文件路径
chunksize – 每份文件的数据量
to_ext – 输出文件扩展名
log – 是否输出文件保存信息
fn – 处理函数
- ricco.etl.file.split2x_by_parts(filename: str, *, parts: int | None = None, to_ext='.csv', log=True, fn=None)
将文件拆分为多个文件,放置在与文件同名目录下
- 参数:
filename – 文件路径
parts – 输出的文件个数
to_ext – 输出文件扩展名
log – 是否输出文件保存信息
fn – 处理函数
- ricco.etl.file.split_csv_by_column(filepath: str, by: str, *, to_dir: str | None = None, to_ext: str = '.csv', merge_file: bool = True, chunksize=100000)
将csv文件按指定列的值拆分为多个文件
- 参数:
filepath – csv文件路径
by – 根据那一列拆分
to_dir – 要保存的位置,默认与原文件同名目录
to_ext – 输出的文件扩展名
merge_file – 是否将每一类数据合并为一个文件,默认合并
chunksize – 中间文件大小,如内存不足则可适当调低
数据标准化(熵值法)
Classes:
|
Functions:
|
采用熵值法计算的总分评价 |
|
计算指标的差异系数 |
|
PCA法计算器 |
|
计算指标下任一数值在该指标中的比重 |
|
归一化处理 |
|
熵值法的正向指标的极差标准化 |
|
熵值法的负向指标的极差标准化 |
|
计算指标之间的权重关系 |
- class ricco.etl.entropy.EntropyClass(df, cols, neg_cols, key)
基类:
object
- ricco.etl.entropy.entropy(df, columns: list | None = None)
采用熵值法计算的总分评价
- 参数:
df – 非负数化处理后的数据,默认其中数值量纲都是越大越好
columns – 需要用熵值法计算权重的指标合集
- 返回:
用过熵值法得到的总分, 权重
- ricco.etl.entropy.gevalue(df: DataFrame, columns: list)
计算指标的差异系数
- ricco.etl.entropy.pca_score(df, columns: list | None = None)
PCA法计算器
- ricco.etl.entropy.pvalue(df: DataFrame, columns: list)
计算指标下任一数值在该指标中的比重
- ricco.etl.entropy.rescale(df: DataFrame, key: str, scale_min: float = 0, scale_max: float = 1, score_range: tuple = (0, 100)) DataFrame
归一化处理
- 参数:
df – 为原始待计算df
key – 需要参与计算的列名
scale_min – 下分位数, 低于该分位数的结果均取最小值
scale_max – 上分位数, 高于该分位数的结果均取最大值
score_range – 得分范围
- ricco.etl.entropy.standard_e(df: DataFrame, columns: list)
熵值法的正向指标的极差标准化
- ricco.etl.entropy.standard_e_neg(df: DataFrame, columns: list)
熵值法的负向指标的极差标准化
- ricco.etl.entropy.wvalue(df, columns: list)
计算指标之间的权重关系
图数据处理(Graph)
Functions:
|
将图结构的Dataframe转为字典格式,提高查询效率 |
|
从图数据中查询全部当前节点的全部父级节点 |
- ricco.etl.graph.get_graph_dict(graph_df: DataFrame, c_key='id', c_level_type='level_type', c_parent_key='parent_id', c_parent_type='parent_type') dict
将图结构的Dataframe转为字典格式,提高查询效率
- 参数:
graph_df – 图结构的数据
c_key – 索引列
c_level_type – 层级分类列
c_parent_key – 对应的父级索引列
c_parent_type – 对应的父级类型列
- ricco.etl.graph.query_from_graph(key, graph_data: (<class 'pandas.core.frame.DataFrame'>, <class 'dict'>), c_key='id', c_level_type='level_type', c_parent_key='parent_id', max_depth=10) dict
从图数据中查询全部当前节点的全部父级节点
- 参数:
key – 要查询的节点
graph_data – 要查询的数据集
c_key – 子节点关键列的字段名
c_level_type – 等级类型字段名
c_parent_key – 父节点字段名
max_depth – 最大深度