modules.statistics 模块帮助
本章节包含 modules.statistics 包中常用「统计功能」模块的使用说明和示例,例如:
对
TableData做与 pandasdescribe等价的汇总统计,并可选抽取部分指标到ResultModel;对指定列(或列组合)做
value_counts,输出频次或占比表;对方向向量或高维特征做**球面 K 均值(Spherical K-Means)**聚类,按余弦相似度划分簇;倾向、倾角需开启
geo_dips,先转为三维单位极点再聚类;对勘察 统计指标表 按地层/岩土分组做**数理统计**(个数、极值、平均值、标准值、变异系数等),并生成蒙版表与合并 Excel(
MathematicalStatistics)。
TableDescribe
模块简介与适用场景
TableDescribe对输入TableData调用describe,生成一张「统计量 × 列」的汇总表(OutputStatTable),行为与 pandas 一致:数值列给出 count、mean、std、分位数等;文本/object 列给出 count、unique、top、freq 等。可通过
selected_pairs从描述结果中抽取「列 + 统计量」到OutputResultModel,便于写入报表字段或下游结构化输出;键支持**字段内部名**,也支持**字段标题**(会通过title_to_name解析)。典型适用场景:
勘察/试验数据入库后,快速得到各数值列的量级、缺失与分布概况;
对分类字段做 unique、top、freq 统计(需将
include设为"all"或["object"]等);只关心少数指标(如某几列的 mean、std)时,用
selected_pairs输出ResultModel,避免手写解析describe结果表。
端口说明
输入端口 -
InputTable:待描述的表格(TableData);未连接或数据为None时,两个输出均为None。输出端口 -
OutputStatTable:描述结果表(TableData);索引/行名为统计量名称,列为被描述的字段;若没有任何列可描述(结果为空),则为None。 -OutputResultModel:由selected_pairs抽取的指标集合(ResultModel);若未配置selected_pairs或没有成功抽取到任何值,则为None。
快速上手示例:默认只描述数值列
from gdisdk.modules import TableDescribe
desc = TableDescribe(mname="Describe")
desc.InputTable = my_table
desc.execute()
stat_table = desc.OutputStatTable.data
# 如需 pandas DataFrame:stat_table.dataframe
快速上手示例:包含文本列,并抽取部分指标到 ResultModel
from gdisdk.modules import TableDescribe
desc = TableDescribe(mname="Describe")
desc.include = "all"
desc.selected_pairs = {
"厚度": ["mean", "std"], # 可用字段标题
"layer_no": ["min", "max"], # 也可用内部列名
}
desc.InputTable = my_table
desc.execute()
result = desc.OutputResultModel.data
# ResultModel 中字段名为「内部列名_统计量」,如 layer_no_min
快速上手示例:只对部分列做完整 describe
from gdisdk.modules import TableDescribe
desc = TableDescribe(mname="Describe")
desc.describe_columns = ["depth", "qc"]
desc.include = None # 仍仅对其中数值列做描述
desc.InputTable = my_table
desc.execute()
stat_table = desc.OutputStatTable.data
参数说明
参数名 |
类型 |
默认值 |
说明 |
|---|---|---|---|
|
|
|
|
|
|
|
仅对这些列做 |
|
|
|
列名或列标题 → 需要的统计量名称列表;结果写入 |
行为说明
当
describe结果为空(例如筛选后无可描述列)时,OutputStatTable与OutputResultModel均为None。selected_pairs中整型类统计量(如count、unique、freq)会转为int,其余非缺失值一般转为float;缺失统计量为None。OutputResultModel中各字段的UnitField会尽量继承原列计量单位,标题形如「原列标题-统计量名」。
在 pipeline 中的使用方式
from gdisdk.pipeline import PipeLine
from gdisdk.modules import TableDescribe
pipe = PipeLine(app_name="DescribeDemo", app_title="表格描述示例")
describe = TableDescribe(mname="Describe")
# links = reader.OutputTable >> describe.InputTable
# pipe.add_links(links)
# pipe.run()
# stat_table = describe.OutputStatTable.data
# result = describe.OutputResultModel.data
更多信息
ValuesCount
模块简介与适用场景
ValuesCount对TableData做value_counts:统计指定列(或全部列)上**取值或取值组合**出现的次数,输出一张窄表(OutputCountTable)。支持
normalize=True输出占比;支持排序、升序/降序;dropna=False时可包含含缺失行的组合。subset可使用**字段内部名**或**字段标题**(经_to_field_names解析)。典型适用场景:
统计地层名称、土类编码等分类字段的频数;
多列联合计数(例如「标段 + 岩性」组合出现了多少次);
需要占比而非原始计数时,设
normalize=True``(结果中频次列名为 ``proportion)。
端口说明
输入端口 -
InputTable:输入表(TableData);为空则输出None。输出端口 -
OutputCountTable:计数结果表(TableData)。除被统计的列外,最后一列为count或proportion``(由 ``normalize决定);表名/标题由模块自动生成。
快速上手示例:单列频数
from gdisdk.modules import ValuesCount
vc = ValuesCount(mname="ValuesCount")
vc.subset = "岩土名称" # 或内部列名
vc.normalize = False
vc.sort = True
vc.ascending = False
vc.InputTable = my_table
vc.execute()
out = vc.OutputCountTable.data
快速上手示例:多列组合计数与占比
from gdisdk.modules import ValuesCount
vc = ValuesCount(mname="ValuesCount")
vc.subset = ["section_id", "soil_type"]
vc.normalize = True
vc.dropna = True
vc.InputTable = my_table
vc.execute()
out = vc.OutputCountTable.data
快速上手示例:统计所有列的组合(慎用大宽表)
from gdisdk.modules import ValuesCount
vc = ValuesCount(mname="ValuesCount")
vc.subset = None
vc.InputTable = my_table
vc.execute()
out = vc.OutputCountTable.data
参数说明
参数名 |
类型 |
默认值 |
说明 |
|---|---|---|---|
|
|
|
参与计数的列;单列传字符串,多列传列表; |
|
|
|
|
|
|
|
是否按频次/占比排序。 |
|
|
|
在 |
|
|
|
|
行为说明
多列计数时,结果通过
reset_index展开为多列 + 计数列;模块会尽量把原列的FieldMetadata拷到结果列上。计数列的元数据来自
TableSeries的field_meta;列名一般为count或proportion。
在 pipeline 中的使用方式
from gdisdk.pipeline import PipeLine
from gdisdk.modules import ValuesCount
pipe = PipeLine(app_name="ValueCountsDemo", app_title="频次统计示例")
vc = ValuesCount(mname="ValuesCount")
vc.subset = "地层名称"
# links = reader.OutputTable >> vc.InputTable
# pipe.add_links(links)
# pipe.run()
# counts = vc.OutputCountTable.data
更多信息
SphericalKMeans
模块简介与适用场景
SphericalKMeans在TableData的数值列上拟合**球面 K 均值**:以**余弦相似度**(而非欧氏距离)优化簇中心,适合已经是方向向量的数据,以及文本嵌入等落在单位超球面(或需按方向比较)的数据。默认在拟合前对每一行特征做 **L2 归一化**(
normalize=True);若数据已是单位向量,可设normalize=False避免重复计算。倾向、倾角不能按二维向量做 L2 归一化。 这两列是角度。设置
geo_dips=True后,模块把每一行换成东、北、上方向的单位极点再聚类。feature_columns依次为倾向、倾角,可用字段名或字段标题;为None时使用保留字段dip_direction、dip_angle。此时忽略normalize。feature_columns支持**字段内部名**与**字段标题**(经convert_to_field_names解析)。geo_dips=False且为None时自动选用表中**全部数值列**。参与拟合的行:在选定特征列上**任一为 NaN** 的行会被**排除**;
OutputLabelsTable仍保留原表所有行,这些行上的cluster_label为缺失。centers_in_original_scale控制**中心表**的含义。向量模式下,True``(默认)为簇内样本在原始特征尺度上的算术平均,``False为单位球上的归一化质心。geo_dips=True时,True为极点的球面平均换回的倾向和倾角(度),False为东、北、上单位极点n_east、n_north、n_up。典型适用场景:
结构面、节理的倾向和倾角分群(
geo_dips=True);已经是方向余弦或单位向量的无监督分群;
高维嵌入向量按方向聚类;
需要在表格中得到
cluster_label列及可解释的簇中心表供下游筛选或制图。
端口说明
输入端口 -
InputTable:输入表(TableData);未连接或为空时,两个输出均为None。输出端口 -
OutputLabelsTable:在**原表所有列**基础上追加整型列cluster_label``(0 起始簇编号);未参与拟合的行该列为缺失。 - ``OutputCentersTable:每簇一行;首列为cluster_id``(0 起始)。其余列在向量模式下与特征列同名;``geo_dips=True且centers_in_original_scale=True时为倾向列和倾角列;该模式下centers_in_original_scale=False时为n_east、n_north、n_up。
快速上手示例:指定特征列
from gdisdk.modules import SphericalKMeans
skm = SphericalKMeans(mname="SphericalKMeans")
skm.feature_columns = ["fx", "fy", "fz"]
skm.n_clusters = 3
skm.random_state = 0
skm.InputTable = my_table
skm.execute()
labeled = skm.OutputLabelsTable.data
centers = skm.OutputCentersTable.data
快速上手示例:自动使用全部数值列
from gdisdk.modules import SphericalKMeans
skm = SphericalKMeans(mname="SphericalKMeans")
skm.n_clusters = 5
skm.InputTable = my_table
skm.execute()
labeled = skm.OutputLabelsTable.data
快速上手示例:倾向与倾角
from gdisdk.modules import SphericalKMeans
skm = SphericalKMeans(mname="SphericalKMeans")
skm.geo_dips = True
skm.feature_columns = ["dip_direction", "dip_angle"] # 省略则使用这两个保留字段;也可写标题,如「倾向」「倾角」
skm.n_clusters = 3
skm.random_state = 0
skm.InputTable = joints_table
skm.execute()
labeled = skm.OutputLabelsTable.data
centers = skm.OutputCentersTable.data
参数说明
参数名 |
类型 |
默认值 |
说明 |
|---|---|---|---|
|
|
|
用作特征的列名或标题列表。 |
|
|
|
簇个数。 |
|
|
|
初始中心策略; |
|
|
|
不同随机种子重复运行次数,取惯性最小的一次结果。 |
|
|
|
单次运行的最大迭代次数。 |
|
|
|
中心位移 Frobenius 范数的收敛容差。 |
|
|
|
随机种子;传入整数可复现结果。 |
|
|
|
是否在拟合前对每行特征 L2 归一化到单位范数。 |
|
|
|
向量模式: |
|
|
|
|
行为说明
标签表中的
cluster_label与中心表中的cluster_id使用**同一套** 0 起始簇编号:凡cluster_label == k的样本,其簇中心为cluster_id == k的那一行(中心表按cluster_id为0 … n_clusters-1排列)。聚类仅在
dropna后的有效子集上拟合;标签列对无效行留空,不改变原表行数。空簇时,
centers_in_original_scale=True下中心行为 NaN。geo_dips=True时,空簇以及极点平均为零向量的簇,在两种中心输出下都是 NaN。geo_dips=True时,倾向在拟合前按 360 取模,标签表仍保留输入原值。倾角超出 0 到 90、两列解析到同一字段、或字段不存在时,执行抛出ValueError。产状中心是极点的球面平均换回的角度。簇跨过正北时,这与倾向的算术平均不同。
execute的返回值为OutputLabelsTable对应的 ``TableData``(与端口数据一致)。
在 pipeline 中的使用方式
from gdisdk.pipeline import PipeLine
from gdisdk.modules import SphericalKMeans
pipe = PipeLine(app_name="SkmDemo", app_title="球面K均值示例")
skm = SphericalKMeans(mname="SphericalKMeans")
skm.geo_dips = True
skm.feature_columns = ["倾向", "倾角"] # 字段名或字段标题,顺序为倾向、倾角
skm.n_clusters = 4
# links = reader.OutputTable >> skm.InputTable
# pipe.add_links(links)
# pipe.run()
# labeled = skm.OutputLabelsTable.data
# centers = skm.OutputCentersTable.data
更多信息
MathematicalStatistics
模块简介与适用场景
MathematicalStatistics``(勘察数理统计)从 ``TableCollection中读取指定的 统计指标表,按 地层编号**(优先)或 **岩土名称 分组,对选定指标列计算勘察成果常用的统计量,并输出原始明细、统计结果、参与/剔除蒙版及按地层块合并的 Excel。集合中应包含 地层表
layer_table:当指标表某行缺少地层编号或岩土名称时,模块会结合钻孔编号与试验深度(标贯/静探/动探/土工/岩石试验等表有内置深度字段规则)在地层表中反查层位与岩土名称。默认在每组、每指标列上按
eliminate_params做离群剔除后再汇总;GDIM 上用户调整蒙版后,可通过modified_mask_table_json传入修订后的蒙版表 JSON 重新统计。典型场景:从 GDIM 读入标贯/静探/土工试验等指标表与地层表,按层统计
N、qc、天然密度等;导出带删除线标记的合并统计 Excel;为RecentlyDepositedLoess等模块准备按层汇总的统计表。
端口说明
输入端口
InputTables:勘察表集合(TableCollection),须能通过get_table取到statistics_table指定的指标表及layer_table;未连接或集合为空时,四个输出均为None。
输出端口
OutputOriginalDataTable:筛选并补全层位信息后的 **原始数据表**(固定列layer_number/material_name/bore_number+ 统计指标列)。OutputStatisticsResultTable: 统计结果表;在固定列基础上增加 ``statistics_item``(统计项目),每个「地层/岩土分组 × 统计项目」一行。OutputOriginalDataMaskTable:与原始数据表 同形 的布尔蒙版;True表示该单元格参与统计,False表示被剔除(合并 Excel 中对相应数值加删除线)。OutputMergeTableExcel:上传至 GDIM 的合并统计表 Excel(GdimMinIOFile)。生成文件依赖 pipeline 的 GDIM token 与项目 ID;本地无鉴权时会ValueError。
execute() 的返回值与 OutputOriginalDataTable 一致。
输入表要求
统计指标表**(参数 ``statistics_table``):表 **name 或 title 与配置一致。需包含
statistics_columns中的列(支持列 内部名 或 字段标题)。**钻孔编号**(可选筛选
statistics_bores):指标表须存在bore_num/bore_number/钻孔编号/孔号之一。**地层编号筛选**(
statistics_layers):若配置非空,指标表须存在layer_num/layer_number/地层编号/层号之一。地层表
layer_table:用于按深度反查层位;须含钻孔列与 ``layer_bottom_depth``(或标题「地层底深度」)等字段,规则与实现一致即可。
快速上手示例:指定指标表与统计列
from gdisdk.modules import MathematicalStatistics
stats = MathematicalStatistics(mname="MathStats")
stats.InputTables = my_table_collection # 含指标表与 layer_table
stats.statistics_table = "spt_table"
stats.statistics_columns = ["标贯击数", "杆长"]
stats.statistics_bores = [] # 空列表表示不按孔号过滤
stats.statistics_layers = []
stats.execute()
original = stats.OutputOriginalDataTable.data
result = stats.OutputStatisticsResultTable.data
mask = stats.OutputOriginalDataMaskTable.data
excel_file = stats.OutputMergeTableExcel.data
参数说明
参数名 |
类型 |
默认值 |
说明 |
|---|---|---|---|
|
|
|
必填。统计指标表在集合中的 name 或 title。 |
|
|
|
仅保留这些钻孔编号的行;空列表表示不过滤。 |
|
|
|
仅保留这些地层编号的行;空列表表示不过滤(需指标表有地层列)。 |
|
|
|
必填。参与统计的指标列(内部名或标题)。 |
|
|
见下文默认项 |
**必填**(默认已给出常用六项)。可选统计项目见「统计项目说明」。 |
|
|
见下文 |
离群剔除配置; |
|
|
|
用户修订后的蒙版表( |
默认 statistics_items:统计个数、最小值、最大值、平均值、标准值、变异系数。
默认 eliminate_params:
eliminate_method:None``(不剔除);可选 ``戈罗伯斯、m倍标准差法、肖维勒。confidence_in_testing_critical_value:``0.05``(戈罗伯斯检验用)。testing_critical_value:None``(``m倍标准差法时 必填)。test_type:单边检验或双边检验。
统计项目说明
模块支持的 statistics_items 取值(须与下表中文名完全一致):
统计项目 |
含义概要 |
|---|---|
|
蒙版为 |
|
组内有效样本的极值与算术平均。 |
|
样本标准差( |
|
标准差 / |平均值|;平均值为 0 时为 |
|
按 GB 50021 统计修正系数 (gamma_s) 与变异系数计算;标准值 = 平均值 × (gamma_s)。样本数小于 6 时:标准值改用平均值并 |
|
与 平均值 相同(便于与平台习惯字段对齐)。 |
数值型统计结果一般 **保留三位小数**(统计个数 为整数)。
数据剔除说明
剔除在 每个分组 × 每个指标列 上独立进行;仅影响该列蒙版,不改变原始数据表中的数值。
戈罗伯斯:迭代剔除最离群点,直至统计量不超过临界值;样本数少于 3 时不剔除。
肖维勒:按 Chauvenet 准则反复剔除超出阈值的点。
m倍标准差法:剔除与均值之差超过
m × 标准差的点(m为testing_critical_value);单边/双边由test_type控制。筛选后指标表 无数据行 时,模块发出
GDIWarning,仍返回 空表结构 并尝试生成/上传合并 Excel(与有数据时端口类型一致)。
蒙版表与 Excel 输出
未传入
modified_mask_table_json时,蒙版初始全为True,再按eliminate_params将剔除位置置为False。传入修订蒙版后 跳过 自动剔除,直接按蒙版汇总。
合并 Excel 按 地层编号 分块:先输出该层全部原始数据行,再输出该层全部统计结果行;地层编号、岩土名称列会对连续相同值做单元格合并;被剔除的数值在 Excel 中以 红色删除线 显示。
OutputMergeTableExcel使用工作区文件merge_statistics_table.xlsx并调用 GDIM 上传接口(app_auto_report);请在 pipeline 中配置有效InputToken/ 项目上下文。
在 pipeline 中的使用方式
from gdisdk.pipeline import PipeLine
from gdisdk.modules import GdimTableReader, MathematicalStatistics
pipe = PipeLine(app_name="MathStatsDemo", app_title="勘察数理统计示例")
reader = GdimTableReader(mname="ReadTables")
stats = MathematicalStatistics(mname="MathStats")
stats.statistics_table = "spt_table"
stats.statistics_columns = ["标贯击数"]
# reader.InputToken = (token, proj_id, host)
# reader.table_fields = ["标贯试验数据表", "地层数据表"]
# links = reader.OutputTables >> stats.InputTables
# pipe.add_links(links)
# pipe.run()
# result = stats.OutputStatisticsResultTable.data
更多信息
新近堆积黄土判别等下游模块对 统计结果表 的形态要求,见 modules.geoSurvey 模块帮助 中
RecentlyDepositedLoess一节。