首页/文章/ 详情

关于Deepseek+python自动化解决路基路面excel中如一般防护、排水等划分段落的问题

3小时前浏览11
      大家一定清楚一个现状,就是比如在一般防护中其实通用图确定设计方案后,不同的填挖方边坡高度对应不同的防护形式,这个在excel中大家人为手动卡段落很费时费力,比如100km的路线去掉桥隧手快的小伙伴卡细段落也需要一整天(视个人快慢,我一般情况下需要全神贯注卡上8-10个小时左右),因此有的同仁学过计算机的通过excel的vb编程解决此问题,但由于实现结果不太理想一般仅用于初设深度,随着AI的发展,缩短了不懂编程和懂编程的起跑线距离,因此今天和大家探讨采用Deepseek+python联合自动化解决路基路面excel中如一般防护、低填浅挖等划分段落问题。以下图为例,假设防护设计方案为0-3m为植草防护,大于3m为骨架防护,编写自动化分段命令流。
       实现思路:关于如何根据Excel中的桩号和高度数据,将桩号分段,其中高度大于3米和小于等于3米的分开显示。通过遍历数据,每当高度类别变化时就分段,比如从桩号40(高度3米)到50(高度4米)时,将前一段的结束桩号设为40,下一段的起始桩号设为50。同时希望优化这个分界点,比如在桩号40(高度3米)和50(高度4米)之间,分界点应该是两者的中间值,即45。这样的话,前一段的结束桩号是45,下一段的起始桩号也是45。因此,代码在检测到高度类别变化时,需要在两个桩号之间插入中间值作为分界点。
      实现步骤:

1. 计算相邻桩号的中点:当检测到高度类别变化时,当前段的结束桩号不再是前一个桩号,而是前一个桩号和当前桩号的中点。下一段的起始桩号也是这个中点。

2. 调整段落记录的起始和结束桩号:需要修改segments字典中的start和end值,以及处理当前段的起始桩号为中点。

3. 处理数据遍历逻辑:在循环中,每当类别变化时,需要计算中点,并更新当前段和下一段的桩号。

4. 特殊情况的处理:比如最后一个桩号是否需要处理,或者在数据中间是否有缺失的桩号,但根据用户提供的数据,桩号是连续的,比如0,20,40,50,60,70,所以中间可能有间隔,但用户可能期望在相邻的两个桩号之间计算中点,即使间隔较大。

此外,还需要考虑数据的顺序是否已按桩号排序,但之前的代码已经做了排序,所以可以假设数据是按桩号升序排列的。

      整体代码逻辑为:

  • 分界点计算:当检测到高度分类变化时,取相邻桩号的平均值作为新段落的分界点。

  • 末尾处理:最后一个段落的结束桩号直接取数据末尾值(如 70),避免因无后续数据导致的中点计算缺失。

  • 输出格式化:桩号强制转换为整数,使结果更简洁(例如 45.0 显示为 45)。

      Deepseek整体思考过程为:

现在,考虑数据中的例子:

原始数据桩号:0,20,40,50,60,70

假设高度在40处是3(≤3),50处是4(>3),那么分界点是45。前一段(≤3)的结束是45,下一段(>3)的开始是45。因此,在输出时,前一段是0到45,平均高度计算到40为止的数据,加上45到50的数据吗?不,可能用户的意思是,每个段落的桩号范围是基于相邻两个数据点的中点来划分,但每个段落的高度数据仅包含原数据点的高度。例如:

在桩号40(高度3)和50(高度4)之间,分界点为45。那么,前一段(≤3)包括桩号0到40,以及分界点45之前的区间,即0到45?而下一段(>3)包括45到50?

但实际上,原数据中的桩号点可能代表该位置的高度值,而区间之间的高度变化发生在中点。因此,每个段落的桩号范围应该是从上一个中点(或起始桩号)到当前中点,而该段落的高度数据是原数据点的高度,直到当前中点前的桩号。

这可能需要更复杂的处理,因为每个段落的平均高度应该基于该段落内的所有原始数据点。但根据用户的需求,当高度类别变化时,分界点是相邻桩号的中点,而段落的范围应调整到该中点,同时该段落的平均高度仅计算到该中点前的数据点?

或者,是否应该将每个段落的数据点包括到分界点前的所有数据,然后分界点后的数据属于下一段落?

例如,在桩号40(高度3)和50(高度4)之间,分界点是45。那么,前一段落包括桩号0到45,而该段落中的数据点是0、20、40,高度分别为2,2.5,3。平均高度是(2+2.5+3)/3=2.5米。下一段落从45到70,数据点是50,60,70,高度为4,4.2,2。但这里有个问题,70的高度是2,属于≤3,所以下一段可能再次分界。

但用户提供的示例数据中,70的高度是2,属于≤3,所以在50到70之间,50到60是4.2(>3),70是2(≤3),所以中间分界点应该在60和70之间,即65。因此,段落划分应该是在50到65(>3),65到70(≤3)。

但根据用户提供的示例输出,原来的代码输出是:

高度大于3m的段落:

桩号50到60,平均4.1m

高度小于等于3m的段落:

桩号0到40,平均2.5m

桩号70到70,平均2.0m

但用户现在希望的是,桩号40到50之间的分界点是45,所以前一段落结束于45,下一段落开始于45,这样:

高度≤3m的段落:0到45,平均高度计算0、20、40的高度,即(2+2.5+3)/3=2.5m

高度>3m的段落:45到50、60,以及可能到下一个分界点?

不过,用户提供的示例数据中,桩号50的高度是4,60是4.2,70是2。所以,在50和70之间,当遇到70时高度降为2,分界点应该是(60+70)/2=65。因此,高度>3m的段落应该是45到65,包含50和60的数据,平均高度是(4+4.2)/2=4.1m,而65到70属于≤3m,平均高度是2。

但用户给出的示例输出中,原来的代码在高度>3m的段落是50到60,平均4.1m,而70单独作为≤3m的段落。但根据新的分界逻辑,应该分为:

高度>3m的段落:45到65(包含50和60的数据)

高度≤3m的段落:0到45,65到70

因此,用户希望分界点在中点,而不是在数据点之间。

现在,回到代码修改,需要在检测到类别变化时,计算中点作为分界点,并调整当前段落的结束和下一段落的起始。

修改代码的关键点:

当处理到第i个数据点时,如果当前数据点的类别与前一个不同,则计算前一个数据点的桩号(prev_zhuanghao)和当前数据点的桩号(current_zhuanghao)的中点mid_point。当前段落的结束是mid_point,下一段落的开始是mid_point。

例如,在数据点40(高度3,类别low)和50(高度4,类别high)之间,mid_point = (40+50)/2=45。因此,前一段落(low)的结束桩号是45,下一段落(high)的起始桩号是45。

对于平均高度的计算,当前段落包括从上一个段落的起始到当前mid_point之间的所有数据点。例如,前一段落包括0、20、40,因为它们在mid_point(45)之前,而50及之后的数据属于下一段落。

但这样处理的话,在遍历数据时,每个数据点需要确定它属于哪个段落。例如,数据点50属于从45开始的段落。

因此,在代码中,当检测到类别变化时:

1. 计算中点mid_point = (previous_zhuanghao + current_zhuanghao) / 2

2. 当前段落的结束是mid_point

3. 当前段落的平均高度是之前收集的current_heights的平均值

4. 开始新段落,起始桩号是mid_point,类别是新的类别,current_heights初始化为当前数据点的高度

但这里有一个问题,当前数据点(例如50)的高度属于新类别,所以应该被包含在新段落的current_heights中。因此,当类别变化时,前一段落收集的heights是到previous_zhuanghao为止的数据,而当前数据点属于新段落。

例如,在遍历到数据点50时,发现类别变化,计算mid_point=45:

- 前一段落(low)的结束桩号是45,平均高度是0、20、40的平均值(2+2.5+3)/3=2.5

- 新段落(high)的起始桩号是45,current_heights初始化为50的高度4

然后继续处理后面的数据点60(4.2,high),属于当前段落,添加到current_heights

接着数据点70(2,low),类别变化,计算mid_point=(60+70)/2=65:

- 前一段落(high)结束于65,平均高度是(4+4.2)/2=4.1

- 新段落(low)起始于65,current_heights初始化为70的高度2

最后处理完所有数据后,添加最后一个段落,结束于70

这样,最终的段落划分是:

low段:0到45,平均2.5

high段:45到65,平均4.1

low段:65到70,平均2.0

这样输出结果会更符合用户的要求。

现在需要修改代码,在检测到类别变化时,计算中点,并处理段落的起始和结束。

具体修改步骤:

1. 在循环中,当检测到category != current_category时:

a. 计算mid_point = (previous_zhuanghao + zhuanghao) / 2

b. 当前段落的结束桩号为mid_point

c. 将当前段落的平均高度计算并保存

d. 新段落的起始桩号为mid_point,current_heights初始化为当前行的height

同时,需要注意,在第一次处理时,当current_start为None时,直接初始化,起始桩号为当前行的桩号,而不是中点。因为第一个数据点没有前一个数据点,所以起始桩号是0。

例如,第一个数据点是0,高度2,类别low,current_start=0,current_heights=[2]

接着下一个数据点是20,高度2.5,类别low,继续添加到current_heights

再下一个数据点40,高度3,类别low,继续添加

下一个数据点50,高度4,类别high,此时检测到类别变化:

mid_point = (40 + 50)/2=45

当前段落的结束是45,平均高度是(2+2.5+3)/3=2.5

新段落的起始是45,current_heights=[4]

继续处理60,类别high,添加到current_heights

下一个数据点70,高度2,类别low:

mid_point=(60+70)/2=65

当前段落(high)结束于65,平均高度(4+4.2)/2=4.1

新段落起始于65,current_heights=[2]

循环结束后,添加最后一个段落,结束于70,平均高度2.0

这样,最终的段落划分符合用户的要求。

现在需要调整代码中的逻辑:

修改循环部分:

在循环中,每次处理一行数据时,如果是第一个数据点,初始化current_start为zhuanghao,current_heights添加height,current_category设置。

否则,检查当前行的category是否与current_category相同:

- 如果相同,继续添加height到current_heights

- 如果不同,计算mid_point,结束当前段落,开始新段落

此外,需要注意previous_zhuanghao的跟踪,可能需要记录前一个桩号的值。

在原来的代码中,previous_zhuanghao是在循环末尾赋值的,可能需要在处理当前行时,知道前一个桩号的值。

例如,在循环开始时,previous_zhuanghao是上一次循环的zhuanghao值,所以在处理当前行时,前一个桩号是previous_zhuanghao,而当前行的桩号是zhuanghao。

因此,当检测到类别变化时,mid_point = (previous_zhuanghao + zhuanghao)/2

修改后的代码逻辑如下:

在循环内部:

for index, row in df.iterrows():

zhuanghao = row['桩号']

height = row['高度']

category = 'high' if height > 3 else 'low'


if current_start is None:

# 初始化第一个段落

current_start = zhuanghao

current_heights.append(height)

current_category = category

previous_zhuanghao = zhuanghao  # 记录前一个桩号

else:

if category != current_category:

# 计算中点

mid_point = (previous_zhuanghao + zhuanghao) / 2

# 结束当前段落

avg_height = sum(current_heights) / len(current_heights)

segments.append({

'start': current_start,

'end': mid_point,

'avg_height': avg_height,

'category': current_category

})

# 开始新段落

current_start = mid_point

current_heights = [height]  # 当前行的高度属于新段落

current_category = category

else:

# 继续当前段落

current_heights.append(height)

# 更新前一个桩号

previous_zhuanghao = zhuanghao

# 处理最后一个段落

if current_start is not None:

# 最后一个段落的结束桩号为最后一个数据点的桩号

avg_height = sum(current_heights) / len(current_heights)

segments.append({

'start': current_start,

'end': previous_zhuanghao,  # 这里可能需要调整,因为最后一个段落的结束应该是最后一个桩号,而不是mid_point

'avg_height': avg_height,

'category': current_category})

这里可能存在一个问题:最后一个段落的结束桩号应该如何处理?因为在循环中,当类别变化时,段落的结束是mid_point,而新段落的起始是mid_point。但对于最后一个段落,没有后续的数据点,所以其结束桩号应该是最后一个数据点的桩号,而不是中点。例如,在用户的数据中,最后一个数据点是70,高度2,属于low类别,且没有后续数据点。因此,最后一个段落的结束桩号应该是70,而不是某个中点。

因此,在处理最后一个段落时,结束桩号应设为最后一个数据点的桩号,即previous_zhuanghao(因为在循环结束后,previous_zhuanghao保存的是最后一个数据点的桩号)。

这样,修改后的代码将正确生成段落:

例如:

数据点70的处理:

当处理到70时,类别是low,而current_category在之前处理60后是high吗?需要仔细跟踪。

假设数据按桩号排序后是0,20,40,50,60,70。

循环过程:

1. 处理0,current_start=0,category=low,previous_zhuanghao=0

2. 处理20,category=low,添加到current_heights,previous_zhuanghao=20

3. 处理40,category=low,添加到current_heights,previous_zhuanghao=40

4. 处理50,category=high,与current_category(low)不同:

mid_point = (40+50)/2=45

结束段落:start=0,end=45,avg=(2+2.5+3)/3=2.5

新段落start=45,current_heights=[4],category=high

previous_zhuanghao=50

5. 处理60,category=high,添加到current_heights,previous_zhuanghao=60

6. 处理70,category=low,与current_category(high)不同:

mid_point=(60+70)/2=65

结束段落:start=45,end=65,avg=(4+4.2)/2=4.1

新段落start=65,current_heights=[2],category=low

previous_zhuanghao=70

循环结束,处理最后一个段落:

start=65,end=70,avg=2.0

因此,最终段落:

low段:0-45,avg2.5

high段:45-65,avg4.1

low段:65-70,avg2.0

这样输出符合用户的要求,分界点在45和65。

因此,修改后的代码需要调整循环中的逻辑,计算mid_point作为段落的结束和下一段落的开始,并在最后处理最后一个段落时,结束桩号是最后一个数据点的桩号。

现在需要验证代码是否正确处理这些情况,特别是在最后一个段落。

可能还需要注意,在循环中,当遇到类别变化时,当前行的height被添加到新段落的current_heights中,而前一段落的heights不包含当前行的height。例如,在数据点50,高度4,属于新段落,因此前一段落(low)的heights是0、20、40,而新段落的heights开始于50的高度4。

这样,每个段落的heights仅包含该段落内的数据点,而分界点在中点,不会包含相邻的数据点。

因此,代码中的逻辑是正确的。

现在需要将代码中的段落结束设为mid_point,而新段落的起始设为mid_point,并在最后处理最后一个段落时,结束桩号是previous_zhuanghao(即最后一个数据点的桩号)。

此外,在输出时,需要将桩号格式化为整数吗?例如,mid_point可能是45.0,65.0等,可以转换为整数。

例如,在输出时:

print(f"桩号{int(seg['start'])}到{int(seg['end'])},...")

但需要注意的是,当start是45.0时,转换为int是45,end如果是65.0转换为65,如果是70则转换为70。

这样,输出结果会更整洁。

        综上思考,python对应的命令流如下,大家可以看到命令流十分简单,而且亲测有效,一定要先安装pandas哦,大家都试起来吧,AI让我们编程小白通过计算机解放生产力,一定要多交流,我们一定要多分享,记得之前有的院编了一个不错的excel东藏 西 藏,没有分享何来进步,我一直相信一句话和大家共勉:别人可以学来的都不是自己的,一定不要闭门造车,要一起进步!

              


来源:博强路基路面设计
通用pythonUM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-03-14
最近编辑:3小时前
博强路基路面
硕士 | 公路路基路面... 抬头看路,低头做事
获赞 93粉丝 286文章 66课程 5
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈