本文中项目资料来源于网易云课堂,代码为纯手工码字滴,请放心食用,不定期更新,欢迎对Python、数据分析以及编程感兴趣的同学留言沟通。

详细介绍了数十个数据分析相关的实战项目,大量使用pandas、numpy、matplotlib、seaborn以及bokeh等包,少量涉及sklearn中机器学习相关包,对一些诸如蒙特卡罗模拟思想使用代码加以实现,并详细讲述实现细节以及注意要点。

目录1 商铺数据加载及存储1.1 项目要求

1.2 原始数据展示

1.3 实际操作1.3.1 读取数据

1.3.2 数据清洗

1.3.3 拆分点评字段

1.3.4 解析数据

1 商铺数据加载及存储

1.1 项目要求成功读取“商铺数据.csv”文件

解析数据,存成列表字典格式:[{'var1':value1,'var2':value2,'var3':values,...},...,{}]

数据清洗:comment,price两个字段清洗成数字

清除字段缺失的数据

commentlist拆分成三个字段,并且清洗成数字

结果存为.pkl文件

1.2 原始数据展示

通过爬虫在某点评APP上获取一下店铺数据,包含了7个字段,字段名及其对应的含义分别是:classify(店铺类别),name(店铺名),comment(点评人数),star(星级),price(平均消费),address(地址),commentlist(特定指标评分),以下为部分数据展示:

classify | name | comment | star | price | address | commentlist

----- | ----- | ----- | ----- | ----- | ----- | -----

美食 | 望蓉城老坛酸菜鱼(合生汇店) | 我要点评 | 该商户暂无星级 | 人均 ¥125 | 翔殷路1099号合生汇5F | 口味8.3 环境8.4 服务8.5

美食 | 泰国街边料理 | 74 条点评 | 准四星商户 | 人均 ¥48 | 黄兴路合生汇B2美食集市内 | 口味7.4 环境7.6 服务7.4

美食 | 壹面如故(苏宁生活广场店) | 265 条点评 | 准四星商户 | 人均 ¥21 | 邯郸路585号苏宁生活广场B1层 | 口味7.0 环境7.2 服务7.2

因为直接获取回来的数据并未进行数据清洗,因此存在以下几个问题:文本数据存在多余的空格(或不可显示的制表符等),需要清除;

部分可以量化的指标需要转化为数值格式如星级等,另外平均消费字段中的价格也有多余的文本信息需要删除;

可选操作:通过将csv文件转存为pkl文件,不仅可以减少文件大小还可以一定程度对文件内容进行加密。

1.3 实际操作

1.3.1 读取数据

基于python有多种文件读取方式,其中较为常用的读取文本数据的方式如下所示:

with open(文件路径,'r',encoding='utf-8') as f:

for i in f.readlines():

print(i)

其中第二个参数是指定文件操作方式:r(读取,rb二进制文件读取),w(写入,wb二进制文件写入),encoding参数为文件编码格式,一般包含中文的都选用'utf-8'编码格式。

另一种读取文件的方式是采用pandas提供的读取csv、xlsx等表格文件的方式:pd.read_csv(),pd.read_excel(),此外pandas还包含多种读取文件的方式如pd.read_sql()可以直接从数据库读取特定sql查询结果的数据,这里不做展开。

本项目我们采用read_csv方式快速读取原始数据,由于windows系统打开csv文件时会在文件开头添加一些字符,因此如果在用Python读取文件前打开过原始数据,则再次读取数据后第一个字段名就不再是原来的字段了,比如说第一个字段名是classify,那么在windows上使用office等软件打开过一次的文件第一个字段名将不再是 classify ,而是前面还有一个字符,因此我们应该尽量避免直接打开csv文件,或者在读取文件后重命名字段列表,如下所示:

import os

import pandas as pd

os.chdir(os.getcwd())

data=pd.read_csv("商铺数据.csv",encoding="utf-8")

data.columns=['classify', 'name', 'comment', 'star', 'price', 'address',

'commentlist']

print(data.head())

代码中的os.chdir(os.getcwd())作用是将工作路径设置为脚本所在绝对路径,这在项目所在文件夹进行移动复制的时候尤为管用,不论文件夹在何处,只要文件夹内各文件与脚本的相对位置不变,脚本都可以正确执行,而不用手工设置工作路径。

1.3.2 数据清洗

这里的数据清洗与一般意义上的去除异常值、处理缺失值等不同,更偏向于文本数据的清洗,即将文本数据整理地更规整便于后续分析使用,这里我将按照不同的处理方式分别定义匿名函数,具体代码如下所示:

(1) 直接去除多余空格,其实本例更为简单的做法是使用pandas数据框自带的方法,df['字段1'].str.replace(' ',''),处理效果与使用apply函数调用以下匿名函数完全相同:

# 简单清洗,去除多余的空格

remove_blank=lambda x:str(x).replace(" ","") # 简单删除空格

(2) 提取评论人数,涉及字符串分割知识即str.split(特定字符):

# 清洗评论人数

remove_blank_com=lambda x:int(str(x).replace(" ","").split("条")[0]) if "条" in str(x) else None # 提取评论人数

(3) 这里想法是将中文一到五转化为阿拉伯数字1到5,并不考虑准N星与N星的区别,即星级只有整数无小数情况,具体实现过程为构建一一对应的字典,并将原始数据与字典的键进行匹配:

# 清洗星级

star={"一":1,"二":2,"三":3,"四":4,"五":5}

def get_star(x):

'''提取商户的星级'''

for i in x:

if i in star.keys():

return star[i]

else:

continue

# 无星级

return None

remove_blank_star=lambda x:get_star(str(x))

(4) 清洗价格主要是提取文本信息中的数字部分,并剔除货币符号:

# 清洗价格

remove_blank_pri=lambda x:round(float(str(x).replace(" ","").split("¥")[1]),2) if "¥" in str(x) else None # 提取价钱

除了以下的实现方式外,还可以考虑使用正则表达式进行匹配,如:

import re

pattern_price=re.compile(r'\d+\.*\d+') # 提取价格,包含整数和小数形式

remove_blank_pri=lambda x:round(float(pattern_price.findall(x)[0]),2) if pattern_price.findall(x) else None # 提取价钱

(5) 点评详情数据中有大量多余空格并且数量不一致,因此可以通过以下匿名函数实现清洗工作,该函数为经验得到无特殊思路:

# 清洗点评详情

remove_blank_comlist=lambda x:str(x).replace(" ","").replace(" ",",").replace(",,",",")

定义完匿名函数,通过apply函数即可轻松将其应用到整个数据框中,最后再去除缺失值即可,调用方法如下所示:

# 清洗 'classify', 'name', 'address'

data[['classify', 'name', 'address']]=data[['classify', 'name', 'address']].applymap(remove_blank)

data["comment"]=data["comment"].apply(remove_blank_com)

data["star"]=data["star"].apply(remove_blank_star)

data["price"]=data["price"].apply(remove_blank_pri)

data["commentlist"]=data["commentlist"].apply(remove_blank_comlist)

# 清除缺失值

data.dropna(inplace=True)

data.index=range(data.shape[0])

1.3.3 拆分点评字段

我们注意到commentlist(点评字段)包含了3个评分,因此我们需要将其拆分,为简化处理至设置3个指标——口味、环境和服务,具体代码如下所示:

# 拆分点评数据

data["口味"]=pd.Series(map(lambda x:round(float(str(x).split(",")[0][2:]),1),data["commentlist"])) # 常数不可迭代,因此不能将 0,1,2作为参数传入lambda

data["环境"]=pd.Series(map(lambda x:round(float(str(x).split(",")[1][2:]),1),data["commentlist"]))

data["服务"]=pd.Series(map(lambda x:round(float(str(x).split(",")[2][2:]),1),data["commentlist"]))

#data=data[['classify', 'name', 'comment', 'star', 'price', 'address',"口味","环境","服务"]]

print(data.head())

或者采用以下更为简洁的形式,其中enumerate()为枚举类型,返回结果为一个元组——(index,value),代表了索引位置和实际值:

def new_comm(x,i=0):

# 以逗号分割,取第i个,再截取3位之后的数字并转换数据类型

return float(str(x).split(",")[i][2:])

for j,col in enumerate(['口味','环境','服务']):

data[col]=data["commentlist"].apply(new_comm,i=j)

1.3.4 解析数据

最后解析数据较为简单,即将数据框转换为Json格式再转存pkl文件,Json格式的数据可以看做是字典列表,是网页数据常见的数据结构,具体实现过程如下:

# 2.解析数据

store_data=[]

for i in data.index:

store_data.append(dict(data.iloc[i,:]))

print(store_data)

# 保存数据

import pickle

with open("商铺数据.pkl","wb") as f:

pickle.dump(store_data,f)

# 载入数据

with open("商铺数据.pkl","rb") as f:

st=pickle.load(f)

print(st)商铺数据加载及存储​github.com

欢迎大家关注我的公众号:Allen陪你玩数据

基于python的房地产数据分析_基于Python的数据分析实战项目相关推荐

  1. 基于python的房地产数据分析_基于Python的数据分析

    转载 | CSDN 编辑 | 雷课小雷 下面来介绍一下基于Python的数据分析,主要介绍数据分析的概念.数据分析流程.Python优势.常用模块的用途以及使用Python进行数据分析的学习方法及步骤 ...

  2. python职业规划书_基于Python数据分析做职业规划

    1.Situation项目背景 为朝着数据分析方向发展,利用假期时间自学了Python,想利用所学Python知识独立完成一个包含数据挖掘.数据分析.数据可视化的项目,与此同时希望项目结果可以帮助我更 ...

  3. 用python做炒股软件-python程序源码_基于python的炒股软件

    股票模拟交易系统设计与实现 不但能够进行界面的设计,还可以实现各个窗口的关联,通过WPF实现和其余窗口的关联,而且WPF中的类不但能够和其中一个窗口进行关联,还可以跟许多功能操作接口,WPF在对窗口对 ...

  4. python 工资管理软件_基于[Python]的员工管理系统

    基于[Python]的员工管理系统 -------------------------------- 简介 使用python语言来完成一个员工管理系统,员工信息包含:员工工号,姓名, 年龄,性别,职位 ...

  5. 如何用python实现地图定位_基于 PyQt5 实现地图中定位相片拍摄位置

    项目简介:本次项目主要学习了如何查找相片中的 Exif 信息,并通过 Exif 信息中的 GPS 数据在百度地图中进行定位标点,以确定相片的拍摄地点.本次实验的目的旨在通过包含 GPS 信息的相片进行 ...

  6. 基于python的语料库数据处理_基于Python的语料库数据处理(三)

    原标题:基于Python的语料库数据处理(三) <Python玩转语料库数据>专栏· 第3篇 1393 字 | 5 分钟阅读 一起来学习用Python进行语料库数据处理吧! 一.条件判断 ...

  7. python语法元素测试_基于python全局设置id 自动化测试元素定位过程解析

    背景: 在自动化化测试过程中,不方便准确获取页面的元素,或者在重构过程中方法修改造成元素层级改变,因此通过设置id准备定位. 一.python准备工作: 功能:用自动化的方式进行批量处理. 比如,你想 ...

  8. python批量检索文献_基于Python的文献检索系统设计与实现

    基于 Python 的文献检索系统设计与实现 杜兰 ; 刘智 ; 陈琳琳 [期刊名称] <软件> [年 ( 卷 ), 期] 2020(041)001 [摘要] 毕业设计是大学本科教育的一个 ...

  9. python爱因斯坦的问题_基于Python3的趣味数学问题

    基于Python3的趣味数学问题 Pro1. 数独(Sudoku)根据九宫格盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个宫(3*3)内的数字均含1-9这9个数字. Pro2 ...

最新文章

  1. Android 自定义光标样式
  2. p3p-header解决跨域访问cookie
  3. PyQt5 技术篇-QSpinBox选值框值改变触发事件实例演示,获取QSpinBox组件的值,选值框的边界值设置方法
  4. 第二章:Java_基本语法_4 程序流程控制
  5. com.alibaba.dubbo.rpc.RpcException: Forbid consumer 192.168.184.1 access service com.foreveross.syst
  6. java国际化服务器不识别_国际化踩坑记录java.util.MissingResourceException:
  7. 2020计算机二级office高级应用,2020计算机二级ms-office高级应用试题.docx
  8. python采集代理ip_Python采集代理ip并判断是否可用和定时更新的方法
  9. C# List的克隆
  10. 《Effective Java》读书笔记三(类和接口)
  11. checkbox选中并记住状态(分页)
  12. 奇虎360开源其日志搜索引擎,可处理百万亿级的数据
  13. C/C++中类型变量转换之间的数值溢出
  14. AI中的图像识别技术的原理及过程
  15. Labjack系列-数据采集卡,USB数据采集卡与 Labview对接的编程操作
  16. 主成分分析(PCA)详解
  17. 推荐使用的热电阻Pt100测温电路
  18. 微博视频自动投稿视频社区大师软件下载
  19. zabbix 使用教程
  20. 反思:安全需要新体系

热门文章

  1. R语言入门学习——Rstudio的安装与学习
  2. Android发展史(Android各版本特性-知识篇)
  3. php正则换成js正则,php正则替换_php使用正则替换过滤掉js脚本例子
  4. 做维修的老电工为什么要学三菱PLC
  5. 基于Spring+SpringMVC+MyBatis博客系统的开发教程(十二)
  6. 仿真器+编程器+实验板与开发板的区别
  7. 公众号电商小程序运营方案
  8. 数据海洋中的“智”臻架构 开启智慧计算新纪元——浪潮OpenPOWER FP5280G2服务器全面上市...
  9. 浪潮服务器5112面板灯_浪潮英信服务器SA5112M4
  10. R语言subset函数