(描述你如何将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
(展示一次你修改 Prompt 让 AI 代码从'不符合要求'变成'符合规范'的迭代过程) 初代 Prompt:……请你在程序最后打印20个文件的生成路径,确认全部输出成功。 AI 生成的问题:AI生成的代码显示的是txt的文件名而不是路径 优化后的 Prompt:要求中提到要 打印20个文件的生成路径,确认全部输出成功。你只是输出了文件名而没有输出路径,请修改这一不足。
(记录一次解决报错的过程,例如:时区解析报错 / 热力图中文乱码 / ride_stops=0 导致的结果偏差) 报错现象:AI生成的代码在本机这里版本不兼容,会有中文乱码的报错 解决过程:说明了版本不兼容的问题,让AI阅读了python给出的报错,并进行修改
(贴出任务4 PHF 计算的核心代码,并加上你自己的逐行中文注释)
# 贴入代码及注释if '交易时间' in df.columns: #确认该列存在 df['交易时间'] = pd.to_datetime(df['交易时间']) #将「交易时间」列转换为pandas的datetime类型 df['hour'] = df['交易时间'].dt.hour #从中提取「小时」字段(整数),新增为hour列 else: print("错误:列名中未找到 '交易时间',请检查文件表头格式。") #处理该列不存在情况
df['ride_stops'] = (df['下车站点'] - df['上车站点']).abs()
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:高峰小时系数计算 ---")
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} 次") #输出高峰小时
peak_data = pickup_df[pickup_df['hour'] == peak_hour].copy() #将高峰小时内的所有刷卡数据复制到新数据集用于后续处理
peak_data['交易时间'] = pd.to_datetime(peak_data['交易时间']) #用pandas将交易时间转化为datetime类型 peak_data.set_index('交易时间', inplace=True) #把交易时间设置为索引
''' 用resample('5min')把这1小时的数据按每5分钟划分成一组 再用.size():统计每个5分钟桶里有多少条数据(即有多少人刷卡)。 ''' five_min_counts = peak_data.resample('5min').size()
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 = 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}")
''' 用resample('15min')把这1小时的数据按每15分钟划分成一组 再用.size():统计每个15分钟桶里有多少条数据(即有多少人刷卡)。 ''' fifteen_min_counts = peak_data.resample('15min').size()
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 = 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}")