利用python进行数据分析第十四章项目实战一及其代码解析
前言
本系列是我通过利用python进行数据分析第二版的纸质书的学习加上自己的思考而进行的实战项目。在看的过程当中一些代码,函数的使用产生了一些疑惑,所以会加上自己的理解,当然原参考一些文章,不过没有找到比较详细地有具体代码解析的文章,大多文章的内容与书中无二。这里挂一个知乎上的链接,里面的内容与书上是一样的:《利用Python进行数据分析》终章·数据分析案例·学习笔记(一) - 湖边柠檬树的文章 - 知乎 链接: https://zhuanlan.zhihu.com/p/68487640
另外这只是第一节的前半部分,后面的待更新吧,其实是我码字累了
下载问题
本书的数据集下载链接: https://github.com/wesm/pydata-book/tree/2nd-edition/datasets.
在做项目之前涉及到数据集的下载,如果你是第一次从github上下载的话,可能会遇到下面两个问题
- 下载的页面断开链接无法下载 ,即点击download之后出现空白页面,显示断开连接等,这种情况常见于第一次使用github下载的同学,这时需要使用管理员身份修改电脑上的host文件,具体做法可以自行百度。
- github中下载单个文件夹 ,单个文件直接下载即可,想直接下载一个文件夹,可以先下载svn,再在cmd,命令窗口中使用svn命令+需要下载的文件夹的网址链接(需要一定的修改的),然后进行下载即可。
参考https://www.runoob.com/w3cnote/svn-co-github-dir.html,跟https://blog.csdn.net/cf8833/article/details/98789632
项目一:从Bitly获取1.USA.gov数据
有一些书上的内容我没有打上去,如想要全书的可参考: https://zhuanlan.zhihu.com/p/68487640
- 读取文件
path="D:\pycsv\example.txt"
open(path).readline()
#readline()函数:读取一行
#由上面的结果可知,是json格式,那么我们把它的引号去掉,即为字典了,每一行的字典放入字典列表中
import json
path="D:\pycsv\example.txt"
records=[json.loads(line) for line in open(path)]
records[0]
#json.loads()可以识别出字符串中的json格式:去掉引号,并变成通用的json,所有语言都识别
#使用for循环读取每一行(字典),再接入列表records.
#records[0]取第一个元素
- 时区计数的两种方法
要找到数据集中最常出现的时区,即tz字段中最常出现的是谁,有两种方法:1.使用python进行,2.使用pandas库巧妙计数- 使用纯python方法代码进行时区计数
#目标:要找到最常出现的tz字段,即时区
#'tz'是列表records中的字典的一个键,把所有的tz字段提取出来放入一个新的列表中
time_zones=[rec['tz'] for rec in records if 'tz' in rec] #加if是因为并不是所有记录都有时区'tz'字段,如果不加会报错
#列表遍历用for rec in records,rec是字典。字典取值用rec['tz'],判断键是否在字典中用if 'tz' in rec
time_zones[:10]#看前十条数
#现在大家的时区都存储在time_zones列表当中了,那么只需要对列表中出现的不同时区计数,再排序,就可以知道最多出现的时区是谁了
#把所有出现的时区和它对应出现的总次数存入字典当中
def get_counts(sequence):
counts={}
for x in sequence:
if x in counts:
counts[x] +=1
else:
counts[x]=1
return counts
#如果列表中的时区x是第一次出现,即不在counts字典中,那么counts[时区]=1,如果已在counts中,那么counts[时区]+1
counts=get_counts(time_zones)#此时,已存入counts中
print(counts)
查看counts的基本情况
想要前十的时区和他们的计数,做一些字典技巧
def top_counts(count_dict, n=10):
value_key_pairs = [(count, tz) for tz, count in count_dict.items()]
value_key_pairs.sort()
return value_key_pairs[-n:]
#方法top_counts是将字典中对应的每一对键值对都变成一个元祖存入列表value_key_pair当中,然后sort()函数对列表进行排序.
#sort()默认按列表中的元组的第一个元素进行排序,且升序排序
top_counts(counts)
下面是方法二,使用pandas
- 使用pandas方法进行时区计数
#之前得出的records是列表(里面存储字典)
#下面使用pandas,将records转为dataframe,每一个字典变成frame的一行,每一个键变为一列
import pandas as pd
frame=pd.DataFrame(records)
frame
frame.info()
#使用info()函数查看给出样本数据的相关信息概览 :行数,列数,列索引,列非空值个数,列类型,内存占用
排序并查看前十的时区
#dataframe的一列是series,用series的value_counts方法对那一列进行排序,默认从大到小
tz_counts=frame['tz'].value_counts()
tz_counts[:10]
#看前十
用fillna()替换缺失值,()括号当中的值为所用来替换的值。并为空字符串使用布尔数组索引
clean_tz = frame['tz'].fillna('Missing')
clean_tz[clean_tz == ''] = 'Unknown'
tz_counts = clean_tz.value_counts()
tz_counts[:10]
使用seaborn包进行画图
import seaborn as sns
subset = tz_counts[:10]
sns.barplot(y=subset.index, x=subset.values)
未完待续