python_20171123_二手车信息探索
2017-12-20 17:26
288 查看
## ************第一步:抓取该平台二手车的所有品牌 *************** import numpy as np import pandas as pd import matplotlib.pyplot as plt import os#貌似是自带的,不用下载包了 from sklearn.linear_model import LinearRegression plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.style.use('ggplot') # 读取数据(记得需要将csv文件先另存为UTF-8的编码,否则会报编码错误) cars = 'C:/Amy/桃花潭水/python数据分析学习/data/爬虫--二手车平台数据的获取/second_cars_info.csv' pwd = os.getcwd() os.chdir(os.path.dirname(cars)) cars = pd.read_csv(os.path.basename(cars)) N = np.sum(cars['Boarding_time']=='未上牌') ratio = N/cars.shape[0] # 由于未上牌的汽车数量占比极少,仅千分之八,这里不妨考虑将其删除 cars = cars[cars['Boarding_time']!='未上牌'] #cars = cars.loc[cars.Boarding_time != '未上牌',:] #由于上面的清洗步骤,导致一些观测被删除,此时的行索引就不再是一个连续的自然数了,故需要重新设置索引, # 以免产生不必要的错误(因为pandas模块中数据结构的行索引会自动对齐)。 # 重新设置行索引 cars.index = range(cars.shape[0]) # 取出上牌时间变量中的年和月 cars['year'] = cars['Boarding_time'].str[:4].astype('int') print(cars['year'].head()) month = cars['Boarding_time'].str.findall('年(.*?)月') # 由于month是列表构成的序列,所以需要非列表化,再序列化 print(month.head())#8 month = pd.Series(i[0] for i in month).astype('int') cars['month'] = month # 计算上牌日期距离2017年10月份的月数 cars['diff_months'] = (2017-cars.year)*12 + (10-cars.month) + 1 print(cars.head()) #行驶里程数字段的处理 ## 行驶里程数为字符串,要实现字符串转数值, #需要先将字段中的“万公里”字样去除,然后再进行数据类型的转换。 cars['Km'] = cars['Km'].str[:-3] # “百公里内”的样本量 #N = np.sum(cars['Km']=='百公里内') #Ratio = N/cars.shape[0] #print(Ratio) #行驶里程数为“百公里内”的样本量仅仅只有63条,占比为千分之六 # 我们不妨将“百公里内”的样本替换成50公里,即0.005万公里。 cars['Km'].replace('百', '.005', inplace=True) cars['Km_new'] = cars['Km'].astype('float') #cars['New_pri 4000 ce'] = cars['New_price'].str[:-1].astype('float') #N = np.sum(cars['New_price']=='暂无') #Ratio = N/cars.shape[0] #print(Ratio) cars = cars[cars['New_price']!='暂无'] cars['New_price'] = cars['New_price'].str[:-1].astype('float') #print(cars.head(3)) #经过上面的数据清洗工作,数据中有一部分被删除,也有一部分值被替换。通过数据框结构的shape方法,可知目前数据集还剩 #下11,047个样本,一共减少了234条二手车样本。最后,我们再来看看数据集的概览情况: # 数据集的概览信息 print(cars.describe()) #采用可视化方法进行数据探索 #直方图的绘制 #最关心的是二手车的价格分布吧,看看二手车的价格都落在什么范围内?首先,我们对二手车的价格 #绘制一张直方图,看看其分布形状。 max_Sec_price = np.max(cars['Sec_price']) min_Sec_price = np.min(cars['Sec_price']) plt.hist(cars['Sec_price'],# 二手车价格数据 bins=np.arange(min_Sec_price, max_Sec_price+10, 10),# 以10万元为组距 color='steelblue') plt.title('二手车价格分布直方图') plt.xlabel('价格') plt.ylabel('频数') plt.tick_params(top='off', right='off') plt.show() plt.hist(cars['Sec_price'],# 二手车价格数据 bins=np.arange(min_Sec_price, max_Sec_price+10, 10),# 以10万元为组距 normed=True, cumulative=True, color='steelblue') # 添加水平参考线 plt.axhline(y=.5, color='blue', linestyle='--', linewidth=2) plt.axhline(y=.8, color='red',linestyle='--', linewidth=2) # 设置坐标轴标签和标题 plt.title('二手车价格累积分布直方图') plt.xlabel('价格') plt.ylabel('累积频率') plt.xticks(np.arange(min_Sec_price, max_Sec_price, 50)) # 去除图形顶部边界和右边界的刻度 plt.tick_params(top='off', right='off') # 图形显示 plt.show() #条形图的绘制 #上面的直方图,其实质反映的就是等间距的条形图。如果需要自定义价格范围,然后基于这个范围再作条形图的绘制,该如何操 #作呢?这里需要借助于pandas模块中的cut函数,将连续的数值切割成不同的数据段: # 指定任意的切割点,将数据分段 price_cuts = pd.cut(cars['Sec_price'], bins=[min_Sec_price,3,5,8,10,15,20,30,50,max_Sec_price]) # 按照数据段,进行数据的统计,即频数统计 price_stats = price_cuts.value_counts() x = range(len(price_stats))#是9个区间段 #print(x)#range(0, 9) # 将索引用作绘图的刻度标签 label = price_stats.index fig = plt.figure(figsize=(10, 6)) plt.bar(x,# x轴数据 price_stats,# y轴数据 align='center',# 刻度居中对齐 color='steelblue', alpha=.8) # x轴刻度标签 plt.xticks(x, label) # 设置y轴的刻度范围 plt.ylim(0, 2200) plt.title('二手车价格区间条形图') plt.xlabel('价格区间') plt.ylabel('频数') plt.tick_params(top='off', right='off') # 占比用于绘图的数值标签 percent = [str(round(i*100,2))+'%' for i in price_stats/price_stats.sum()] # 为每个条形图添加数值标签 for x,y,z in zip(x,price_stats,percent): plt.text(x, y+30,'%s' %z,ha='center') # 为了避免x轴日期刻度标签的重叠,设置x轴刻度自动展现,并且45度倾斜 fig.autofmt_xdate(rotation=45) plt.show() #饼图的绘制 #关心完了二手车的价格,是不是该关心一下这辆车跑了多少路了?毕竟二手车的价格跟行驶里程数也是有关系的嘛。 # 我们按照二手车网站的筛选条件,将行驶里程数分割为5段, # 即1万公里以内、1~3万公里、3~5万公里、5~10万公里及10万公里以上。 Km_min = cars['Km_new'].min() Km_max = cars['Km_new'].max() Km_cuts = pd.cut(cars['Km_new'], bins=[Km_min,1,3,5,10,Km_max]) Km_stats = Km_cuts.value_counts() # 将横、纵坐标轴标准化处理,保证饼图是一个正圆,否则为椭圆 plt.axes(aspect='equal') # 自定义颜色 colors = ['#9999ff','#ff9999','#7777aa','#2442aa','#dd5555'] # 提取出索引作为标签,将分段的类别作为标签 #Km_stats.values为每一个类别的计数 labels = Km_stats.index plt.pie(Km_stats.values, labels=labels, colors=colors, autopct='%.1f%%', # 设置百分比的格式,这里保留一位小数 counterclock = False, # 设置为顺时针方向 wedgeprops = {'linewidth': 1.5, 'edgecolor':'green'},# 设置饼图内外边界的属性值 textprops = {'fontsize':12, 'color':'k'}) # 设置文本标签的属性值 plt.title('二手车行驶公里数分布(万公里)') plt.show() #散点图的绘制 #影响二手车价格的因素可能二手车的行驶时长、行驶公里数和汽车品牌,直观感觉, # 二手车的价格应该与行驶时长、行驶公里数成反向关系, # 即行驶时长或行驶公里数越大,则二手车的价格应该越便宜。 # 接下来我们来探索一下,是不是这么个道理,由于二手车的品牌也严重影响价格,故这里以奥迪和大众为例,绘制散点图。 # 取出奥迪和大众两种车辆 some_cars = cars[cars['Brand'].isin(['奥迪','大众'])] #some_cars = cars.loc[cars['Brand']=='奥迪',:] labels = some_cars['Brand'].unique() colors = ['blue', 'red'] for i in range(len(labels)): plt.scatter(some_cars.loc[some_cars['Brand']==labels[i],'Km_new'], some_cars.loc[some_cars['Brand'] == labels[i], 'Sec_price'], label=labels[i], c=colors[i], s=20,# 设置点的大小 marker='o', # 设置点的形状 alpha=0.9, # 设置点的透明度 linewidths=0.3, # 设置散点边界的粗细 edgecolors='k', # 设置散点边界的颜色 ) plt.title('二手车行驶公里数与价格的关系') plt.xlabel('行驶公里数') plt.ylabel('价格') plt.tick_params(top='off', right='off') plt.legend() plt.show() # 取出奥迪车的数据子集 aodi_cars = cars[cars['Brand']=='奥迪'] reg = LinearRegression() reg.fit(aodi_cars['diff_months'].reshape(-1,1), aodi_cars['Sec_price']) pred = reg.predict(aodi_cars['diff_months'].reshape(-1,1)) plt.scatter(aodi_cars['diff_months'], aodi_cars['Sec_price'], marker='o', c='steelblue', s=20, linewidths=.5, alpha=.7, label='观测点') plt.plot(aodi_cars['diff_months'], pred, color='red', linewidth=2, label='回归线') plt.title('二手车的行驶时长与价格的关系') plt.xlabel('行驶时长(月)') plt.ylabel('价格(万元)') plt.tick_params(top='off', right='off') plt.legend(loc='best')# 显示图形 plt.show()
相关文章推荐
- Python爬虫——使用 lxml 解析器爬取汽车之家二手车信息
- Python爬虫之requests+正则表达式抓取猫眼电影top100以及瓜子二手网二手车信息(四)
- Python探索之爬取电商售卖信息代码示例
- python多进程爬取天气信息
- Python网络爬虫与信息提取(一) requests库
- Python探索之路(七)---python中文编码
- python 爬虫之校园招聘信息
- [Python] 抓取聚划算页面商品分析页面获取商品信息并以XML格式保存到本地
- Python读取图片EXIF信息类库介绍和使用实例
- python爬去易车网某地市经销商信息
- python通过wmi获取windows下进程的信息
- Python批量获取京东商品列表信息
- 用Python爬取智联招聘信息做职业规划
- python基础——获取对象信息
- 通过python的paramiko抓取多台服务器信息,并通过html格式发送邮件到群组
- linux系统下 python获取 内存、cpu、负载、网络流量、硬盘等信息
- Python之简单抓取豆瓣读书信息
- python获取网络文件信息藏
- Python案例:GUI版的用户注册信息管理系统
- 使用Python抓取网页信息