大家好,小编来为大家解答以下问题,python处理大量数据存储和读取,用什么库好,python处理大量不重复数据可视化建议,今天让我们一起来看看吧!
处理目标:读取800多个excel中存储的各个城市一段时间的企业信息(每个城市都至少有一个excel的数据),统计每个城市2012-2023年每年各个二级制造业的企业数量
数据大小:800多个excel,共计45GB大小,单个excel大小在1MB-250MB之间
需求分析:由于需要二级制造业和年份两个维度,加上excel中的行和列,不难联想到pandas中的Dataframe;除此之外还需要考虑到大量数据下,普通性能的笔记本要如何简化处理流程,缩短程序的运行时间,字符串的处理和输入、处理、输出的细节;最后代码编写成功后需要先对单个excel进行测试,再对多个excel进行测试,最后加上一些输出信息(为了监控程序的运行进度),再对整体数据跑,最终得出结果
程序设计:为了缩短程序的运行时间,所以先将所有需要的数据在内存中处理好,最后一次性输出到excel中;按照信息专家的设计模式来说,年份和制造子行业的信息都是城市所拥有的信息,所以需要城市类;其次还需要一些筛选符合条件的数据的函数;以及处理单个excel的函数和持久化存储的函数
先看处理单个excel的函数,读入excel之前就要确定excel的列有两种情况,所以先用
pd.read_excel(file_path, engine='openpyxl', nrows=1).columns.tolist()
读取出列并存为列表,将分成两中处理方式,在将excel中的数据读入时,有个很有效提高效率的方式,就是只读取需要的列,read_excel函数的usercols参数就起到这个作用,只有它含有的列才会被读入存储为dataframe;filtered_df生成的方式是原df符合要求的数据才会被保留,.str[:4]指只取前4位,.fillna('0') 指的是空置添0 ,.astype(int)指的是转换成int型变量,.between(2012,2023) 当前列在这个范围中的数据才会被保留,&连接下一个条件,当条件被写成函数时,要用df[column].apply(function_name)来应用函数,数据会被作为参数传入
再按照行业分类和年份作为列和行创建元素全为0的Dataframe,对其进行初始化;对filtered_df逐行遍历按照其中的一列数据为行,一列数据为列的原则对应在result_df上计数,最后返回result_df,这就是处理单个excel的逻辑
# 对每一个excel进行处理
def data_analyse(file_path):
print(file_path)
cols = pd.read_excel(file_path, engine='openpyxl', nrows=1).columns.tolist()
# 存在二级行业分类的excel
if '二级行业分类' in cols:
df = pd.read_excel(file_path, engine='openpyxl', usecols=['成立日期', '二级行业分类']) # 只取两列
# 只要12-23年和31个制造子行业的数据
filtered_df = df[
df['成立日期'].str[:4].fillna('0').astype(int).between(2012, 2023) & df['二级行业分类'].apply(
is_manufacture_industry)]
# 计算企业总数量
count = len(filtered_df)
# 建立行业为col和年份为index且初始元素都为0的dataframe
index_years = list(range(2012, 2024))
columns_names = manufacturing_industries
result_df = pd.DataFrame(0, index=index_years, columns=columns_names)
# 遍历符合要求的每行数据并用计数df进行计数
for index, row in filtered_df.iterrows():
year = int(row['成立日期'][:4])
sub_industry = row['二级行业分类']
result_df.at[year, sub_industry] += 1
# 对result_df的每一行求和,计算当前城市的年度制造业总量
result_df['年度制造业总量'] = result_df.sum(axis=1)
return result_df, count
# 没有二级行业分类只有所属行业的excel
else:
df = pd.read_excel(file_path, engine='openpyxl', usecols=['成立日期', '所属行业']) # 只取两列
# 只要12-23年和31个制造子行业的数据
filtered_df = df[
df['成立日期'].str[:4].fillna('0').as