Skip to content

Niki-Singer/2nd_python_work

Repository files navigation

冯恩琪-25361023-第三次人工智能编程作业

1. 任务拆解与 AI 协作策略

(描述你如何将6项分析任务分步拆解给 AI?先让 AI 做数据读取,再做可视化,还是一次性让 AI 完成全部代码?) 我先和AI描述了我的基本要求和数据类型,并给出数据集前五行的数据示例易于理解,让他始终记得检查是否符合要求(原文附在后面);随后将每个任务分别投喂,并在投喂前复制已生成好的代码(再次强调以免忘记,保证代码之间兼容性),然后强调要遵守我的初始要求,再给出任务要求。 随后分别让他实现六个任务,并在其中遇到了版本不兼容的问题,还有最后一个任务输出的图片不够直观,我又让AI添加了显示数据对应的index的内容。 以下是我设定的基础要求原文(其他debug过程在源程序注释中有所体现):


数据集 ICData.csv 为制表符分隔(\t)的文本文件,字段说明如下:

现在需要你完成一个对公交ic卡刷卡数据进行分析的软件,以下是基础说明:

一、代码要求:

1.代码中只能运用Python自带的库和numpy、pandas、matplotlib 和 seaborn 四个第三方库,不允许出现任何其他不允许的第三方库;

2.我会要求你分步实现每个小功能,最后集成一个大功能,所以要求的你的代码必须有可读性、可维护性、可兼容性;

3.代码必须符合标准代码编写标准,只添加必要的注释以便读懂代码功能;

二、处理数据储存在一个叫ICData.csv的文件中,以下是对文件中的每个字段名的说明:

交易类型

交易的票种/类型编码(如6为普通票,188为特殊票等)

交易时间

刷卡时间,格式:YYYY/M/D HH:MM(本次作业的核心时间字段)

交易卡号

乘客IC卡唯一编号

刷卡类型

0表示上车刷卡

线路号

公交线路编号(如1101、1117等)

车辆编号

该次乘坐的具体车辆编号

上车站点

乘客上车的站点序号

下车站点

乘客下车的站点序号(由系统估算或下次刷卡反推)

驾驶员编号

本次运营的司机编号

运营公司编号

所属运营公司的编号

重要提示:“搭乘站点数”并非数据集直接给出的字段,需要由同一行的 上车站点 与 下车站点 两列计算得到(取绝对差值)。请在任务1数据预处理阶段构造该衍生字段。


以下是我每次喂给AI的任务需求模板 已生成代码段+ 非常好,请你接着上面的代码继续生成第五部分的代码 (请生成代码前保证你生成的代码符合第一次对话中要你编写新功能、debug时必须要严格遵守的条例,并保证第x部分代码能很好地承接上部分的代码内容), 任务要求如下: 任务x xxxxxx


2. 核心 Prompt 迭代记录

(展示一次你修改 Prompt 让 AI 代码从'不符合要求'变成'符合规范'的迭代过程) 初代 Prompt:……请你在程序最后打印20个文件的生成路径,确认全部输出成功。 AI 生成的问题:AI生成的代码显示的是txt的文件名而不是路径 优化后的 Prompt:要求中提到要 打印20个文件的生成路径,确认全部输出成功。你只是输出了文件名而没有输出路径,请修改这一不足。

3. Debug 记录

(记录一次解决报错的过程,例如:时区解析报错 / 热力图中文乱码 / ride_stops=0 导致的结果偏差) 报错现象:AI生成的代码在本机这里版本不兼容,会有中文乱码的报错 解决过程:说明了版本不兼容的问题,让AI阅读了python给出的报错,并进行修改

4. 人工代码审查(逐行中文注释)

(贴出任务4 PHF 计算的核心代码,并加上你自己的逐行中文注释)

# 贴入代码及注释

2. 时间解析

确认列名是否存在后再操作,避免KeyError

if '交易时间' in df.columns: #确认该列存在 df['交易时间'] = pd.to_datetime(df['交易时间']) #将「交易时间」列转换为pandas的datetime类型 df['hour'] = df['交易时间'].dt.hour #从中提取「小时」字段(整数),新增为hour列 else: print("错误:列名中未找到 '交易时间',请检查文件表头格式。") #处理该列不存在情况

3. 构造衍生字段

计算搭乘站点数:|下车站点 - 上车站点|

df['ride_stops'] = (df['下车站点'] - df['上车站点']).abs()

处理异常记录 (ride_stops 为 0)

initial_count = len(df) #获取当前数据框的总行数 df = df[df['ride_stops'] != 0].copy() #判断站点数是否为0,不为0的才保留,否则就不copy(删去了) dropped_rows = initial_count - len(df) #原来的减去删去后的数据集就是被删除的数据行 print(f"\n--- 异常记录处理 ---") print(f"已删除 ride_stops 为 0 的异常记录共计: {dropped_rows} 行") #打印删除行数


分钟粒度聚合和PHF 计算公式

#任务4 高峰小时系数 (PHF) 计算

print("\n--- 任务4:高峰小时系数计算 ---")

1. 自动寻找全天刷卡量最大的小时 (高峰小时)

peak_hour = hour_counts.idxmax() #寻找前面处理得出的每小时刷卡统计数据集里面,刷卡次数最多的小时(高峰小时)的索引(index/hour) peak_hour_count = int(hour_counts.max()) #寻找前面处理得出的每小时刷卡统计数据集里面,刷卡次数最多的小时(高峰小时)的次数(values/times)

print(f"高峰小时:{peak_hour:02d}:00 ~ {peak_hour+1:02d}:00,刷卡量:{peak_hour_count} 次") #输出高峰小时

2. 筛选出高峰小时内的所有刷卡数据

peak_data = pickup_df[pickup_df['hour'] == peak_hour].copy() #将高峰小时内的所有刷卡数据复制到新数据集用于后续处理

确保“交易时间”是datetime类型并设为索引

peak_data['交易时间'] = pd.to_datetime(peak_data['交易时间']) #用pandas将交易时间转化为datetime类型 peak_data.set_index('交易时间', inplace=True) #把交易时间设置为索引

3. 5分钟粒度统计 (PHF5)

将 '5T' 改为 '5min' 以兼容新版 Pandas

(注:此处是AI原始版本设置的是'T'类型,和本机版本不兼容,

后续debug时修改了这一错误)

''' 用resample('5min')把这1小时的数据按每5分钟划分成一组 再用.size():统计每个5分钟桶里有多少条数据(即有多少人刷卡)。 ''' five_min_counts = peak_data.resample('5min').size()

找出最大5分钟刷卡量及其对应时间段

max_5min_val = five_min_counts.max() #找到所有组别中最大的值 max_5min_start = five_min_counts.idxmax() #找到最大值的五分钟的开始节点(用idxmax()返回最大值对应的索引) max_5min_end = max_5min_start + pd.Timedelta(minutes=5) #(用pd.Timedelta(minutes=5)创建一个5分钟的时间增量)计算得到最大值的五分钟的结束节点(+5min)

计算 PHF5

phf5 = peak_hour_count / (12 * max_5min_val) #套公式

#按照格式输出 print(f"最大5分钟刷卡量({max_5min_start.strftime('%H:%M')}~{max_5min_end.strftime('%H:%M')}):{max_5min_val} 次") print(f"PHF5 = {peak_hour_count} / (12 × {max_5min_val}) = {phf5:.4f}")

4. 15分钟粒度统计 (PHF15)

将 '15T' 改为 '15min' 以兼容新版 Pandas

(注:此处是AI原始版本设置的是'T'类型,和本机版本不兼容,

后续debug时修改了这一错误)

''' 用resample('15min')把这1小时的数据按每15分钟划分成一组 再用.size():统计每个15分钟桶里有多少条数据(即有多少人刷卡)。 ''' fifteen_min_counts = peak_data.resample('15min').size()

找出最大15分钟刷卡量及其对应时间段

max_15min_val = fifteen_min_counts.max() #找到所有组别中最大的值 max_15min_start = fifteen_min_counts.idxmax() #找到最大值的十五分钟的开始节点(用idxmax()返回最大值对应的索引) max_15min_end = max_15min_start + pd.Timedelta(minutes=15) #(用pd.Timedelta(minutes=15)创建一个15分钟的时间增量)计算得到最大值的五分钟的结束节点(+15min)

计算 PHF15

phf15 = peak_hour_count / (4 * max_15min_val) #套公式

#按照格式输出 print(f"最大15分钟刷卡量({max_15min_start.strftime('%H:%M')}~{max_15min_end.strftime('%H:%M')}):{max_15min_val} 次") print(f"PHF15 = {peak_hour_count} / ( 4 × {max_15min_val}) = {phf15:.4f}")

--- 任务4 完成 ---

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages