需要源码和数据集请点赞关注收藏后评论区留言私信~~~
首先我们来讲解一下Numpy和Pandas的异同
1)Numpy是数值计算的扩展包,能够高效处理N维数组,即处理高维数组或矩阵时会方便。Pandas是python的一个数据分析包,主要是做数据处理用的,以处理二维表格为主。
2)Numpy只能存储相同类型的ndarray,Pandas能处理不同类型的数据,例如二维表格中不同列可以是不同类型的数据,一列为整数一列为字符串。
3)Numpy支持并行计算,所以TensorFlow2.0、PyTorch都能和numpy能无缝转换。Numpy底层使用C语言编写,效率远高于纯Python代码。
4)Pansdas是基于Numpy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas提供了大量快速便捷地处理数据的函数和方法。
5)Pandas和Numpy可以相互转换,DataFrame转化为ndarray只需要使用df.values即可,ndarray转化为DataFrame使用pd.DataFrame(array)即可。
通过提取每个站三个月15分钟粒度的上下客量数据,展示Pandas和Numpy的案例应用。
部分数据展示如下
初步分析数据发现数据有以下几个特点:
1、地铁数据的前六行是无效的,第七行给出了每个站点的名字;
2、每个车站是按照15分钟粒度统计客流,给出了进站、出战、进出站客流;
3、运营时间是从2:00-23:59,与地铁实际运营时间5:30-23:00不同,需要调整
下面获取车站名和车站编号
接下来定义两个函数,我们希望把所有的数据都写入两个文件夹,一个是”in.csv”存储每个站的进站数据,一个是”out.csv”存储每个站的出站数据
def process_not_exists(f): # 前五行是无用数据 file = pd.read_excel(f, skiprows = 5, skipfooter = 3, usecols = target_col) arr = file.values # 构造一个字典先存储数据 d_in = {} d_out = {} for i in stations_index: # 存储第i个车站的上下客流数据 d_in[i] = [] d_out[i] = [] # 5:30 之后的数据是从excel的50行开始,处理后的数据应从43行开始 for i in range(43,len(arr)): l = arr[i] # 获取第i行的数据 # 通过条件直接筛选掉“进出站” if l[1] == '进站': # 进站处理 for j in range(2,len(l)): d_in[j].append(l[j]) if l[1] == '出站': # 出站处理 for j in range(2,len(l)): d_out[j].append(l[j]) in_list = [] # 存储进站数据 out_list = [] # 存储出站数据 for key in d_in: # d_in 与 d_out 的key均为车站的index in_list.append(d_in[key]) out_list.append(d_out[key]) df_in = pd.DataFrame(in_list) df_in.to_csv("./data/in.csv", header = True, index = None) df_out = pd.DataFrame(out_list) df_out.to_csv("./data/out.csv", header = True, index = None) # 目标文件存在时 def process_exists(f,target_file_in,target_file_out): infile = pd.read_csv(target_file_in) outfile = pd.read_csv(target_file_out) in_arr = infile.values.tolist() out_arr = outfile.values.tolist() # 前五行是无用数据 file = pd.read_excel(f, skiprows = 5, skipfooter = 3, usecols = target_col) arr = file.values # 构造一个字典先存储数据 d_in = {} d_out = {} for i in stations_index: # 存储第i个车站的上下客流数据 d_in[i] = [] d_out[i] = [] # 5:30 之后的数据是从excel的50行开始,处理后的数据应从43行开始 for i in range(43,len(arr)): l = arr[i] # 获取第i行的数据 # 通过条件直接筛选掉“进出站” if l[1] == '进站': # 进站处理 for j in range(2,len(l)): d_in[j].append(l[j]) if l[1] == '出站': # 出站处理 for j in range(2,len(l)): d_out[j].append(l[j]) in_list = [] # 存储进站数据 out_list = [] # 存储出站数据 for key in d_in: # d_in 与 d_out 的key均为车站的index in_list.append(d_in[key]) out_list.append(d_out[key]) #合并原有数据 for i in range(len(in_arr)): in_arr[i] += in_list[i] out_arr[i] += out_list[i] # in_file df_in = pd.DataFrame(in_arr) df_in.to_csv("./data/in_test.csv",mode = 'r+', header = True, index = None) # out_file df_out = pd.DataFrame(out_arr) df_out.to_csv("./data/out_test.csv",mode = 'r+', header = True, index = None)
部分代码如下
for name in filenames: f = "./data/" + name target_file_in = "./data/in_test.csv" target_file_out = "./data/out_test.csv" # 若文件已存在 if Path(target_file_in).exists() and Path(target_file_out).exists(): print("exist") process_exists(f,target_file_in,target_file_out) #break else: print("not exist") process_not_exists(f) print("done") # 获取车站名和车站编号 nfile = pd.read_excel(f, skiprows = 5, skipfooter = 3, usecols = target_col) arrt = nfile.values stations_name = [] stations_index = [] for i in range(2,len(arrt[0])): stations_index.append(i) stations_name.append(arrt[0][i]) print(stations_name) print(stations_index) # 筛选掉 “合计”无用项,并设置target_col存储目标项 name = filenames[0] f = "./data/" + name # 前五行是无用数据 file = pd.read_excel(f, skiprows = 5, skipfooter = 3) tarr = file.values print(tarr[3]) test = tarr[0] target_col = [] for i in range(len(test)): tmp = test[i] if tmp != '合计': target_col.append(i) print(target_col)
创作不易 觉得有帮助请点赞关注收藏~~~