提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
数据集说明(原文链接:https://blog.csdn.net/weixin_44510615/article/details/114271661)
这是一份来自深圳市政府数据开放平台的深圳通刷卡数据,时间区间为 2018-08-31 到 2018-09-01,总计 1,337,000 条记录,大小为 335 M,包含 11 个字段。为了便于分析,提前了解到2018-08-31是周五,2018-09-01是周六。
深圳通是由深圳市运输局监制、深圳市公共交通结算管理中心发行的一款即可优惠乘坐深圳市公交车,深圳地铁和商店消费的一种储值卡。
1.数据处理
源数据存的是 json 格式的数据,先使用 python 对数据做一下清洗,然后保存为 csv 数据文件。
### 解析 json 数据文件
path = r"C:\Users\Administrator\Desktop\2018record3.jsons"#定义了一个文件路径,指向存储 JSON 数据的文件。
data = []#创建一个空列表 data 来存储解析后的数据。
with open(path, 'r', encoding='utf-8') as f:
for line in f.readlines():
data += json.loads(line)['data']#打开文件,并逐行读取数据。
#使用 json.loads() 函数将每行的 JSON 字符串解析为 Python 字典,并将字典中的 'data' 键对应的值添加到 data 列表中。
data = pd.DataFrame(data)#将 data 列表转换为 pandas DataFrame,便于后续处理。
columns = ['card_no', 'deal_date', 'deal_type', 'deal_money', 'deal_value', 'equ_no', 'company_name', 'station', 'car_no', 'conn_mark', 'close_date']#定义一个列名列表 columns,包含数据集中应有的所有字段。
#使用这个列名列表对 DataFrame 进行重新排列,确保列的顺序。
data = data[columns] # 调整字段顺序
data.info()#使用 data.info() 打印 DataFrame 的概览信息,包括每列的数据类型和非空值数量。
### 输出处理
# 全部都是 交通运输 的刷卡数据
print(data['company_name'].unique())
# 删除重复值
# print(data[data.duplicated()])
data.drop_duplicates(inplace=True)
data.reset_index(drop=True, inplace=True)
# 缺失值
# 只有线路站点和车牌号两个字段存在为空,不做处理
# print(data.isnull().sum())
# 去掉脏数据
data = data[data['deal_date'] > '2018-08-31']
### 数据保存
print(data.info)#应该使用 data.info() 来调用。
# 数据保存为 csv
data.to_csv('SZTcard.csv', index=False, header=None)
该处将数据保存为’SZTcard.csv’。
2.数据预览
代码如下:
import pandas as pd
data=pd.read_csv('SZTcard.csv',header=None,names=['卡号','交易日期时间','交易类型','交易金额','交易值','设备编码','公司名称','线路站点','车牌号','联程标记','结算日期'])
data.to_csv('SZTcard.csv', index=False)
data=pd.read_csv('SZTcard.csv')
data['交易日期时间']=data['交易日期时间'].astype(str)#object就是字符串的意思
data['结算日期']=data['结算日期'].astype(str)#object就是字符串的意思
data['交易日期']=data['交易日期时间'].map(lambda x:x.split(' ')[0])#第一个
data['交易时间']=data['交易日期时间'].map(lambda x:x.split(' ')[-1])#最后一个
data['结算日期']=data['结算日期'].map(lambda x:x.split(' ')[0])
data['卡号']=data['卡号'].astype(str)#object就是字符串的意思
data['设备编码']=data['设备编码'].astype(str)#object就是字符串的意思
import numpy as np
deal_money=data.groupby('交易类型')['交易金额'].nunique()
deal_value=data.groupby('交易值')['交易金额'].nunique()
cn=data.groupby('公司名称')['交易金额'].nunique()
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
tu_1= data.groupby('公司名称').agg(cn=('卡号','count')).reset_index().sort_values(by='cn', ascending=False).head(18)
# 创建条形图
plt.figure(figsize=(27, 13))
plt.bar(tu_1['公司名称'], tu_1['cn'], color='skyblue')
plt.xlabel('公司名称')
plt.ylabel('cn')
plt.xticks(range(0, 18)) # 确保 x 轴标签显示所有小时
plt.grid(True)
plt.show()
观察公司名称也就是地铁和巴士不同线路名称的分布情况,没有杂乱不属于这里的名称,可见该数据集并没有其他非交通公司消费的数据,这里全部都是交通出行的数据。
3. 数据分析可视化
3.1 乘客主题
(整体) 通勤费用
代码如下:
import numpy as np
data['交易金额']=data['交易金额'].astype(float)#object就是字符串的意思
data['交易金额']=np.nan_to_num(data['交易金额'])
data['交易金额']
import pandas as pd
# 查询1:按日期分组,计算每天的交易数量和最小、最大交易日期
# 查询2:按公司名称分组,计算每个公司的交易数量,并按数量降序排序
query2 = data.groupby('公司名称').agg(
cn=('交易金额', 'count')
).reset_index().sort_values(by='cn', ascending=False)
# 查询3:计算整体和按交易类型分组的交易数量、总金额和平均每笔金额
total = data['交易金额'].sum() / 100
per = data['交易金额'].sum() / len(data['交易类型']) / 100
query3_grouped = data[data['交易类型'].isin(['地铁出站', '巴士'])].groupby('交易类型').agg(
cnt=('交易金额', 'count'),
total=('交易金额', 'sum'),
per=('交易金额', lambda x: x.sum()