数据分析 | Numpy实战(一) - 分析某单车骑行时间

2024-03-02 01:20

本文主要是介绍数据分析 | Numpy实战(一) - 分析某单车骑行时间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于数据科学的学习,咸鱼也进行了一段时间,但是光学不练是学一点忘一点,所以咸鱼找了一些某共享单车的数据进行一点简单的数据分析。

思路整理

咸鱼也是第一次动手写数据分析相关的代码,所以咸鱼上网找了一张大致的流程图,且以此整理思路,分隔代码。

图 | 源自网络

在企业实际开发中各个步骤的代码不会像咸鱼下面的代码一样各块分隔的那么清楚,肯定是相互交织且复杂的。

实战
分析目的

看标题就知道了,分析各季度共享单车的骑行时间。

数据收集

因为这次的数据源自网络,所以先简单看下数据的结构:

可以看到数据有9个字段:

"Duration (ms)","Start date","End date","Start station number","Start station","End station number","End station","Bike number","Member type"

按照我们的目标,我们只需要第一个字段Duration(ms)

所以第一步先读取已经下载好的数据之后在第二步数据清洗中取出需要的字段:

# 数据收集
def data_collection():data_arr_list = []for data_filename in data_filenames:file = os.path.join(data_path, data_filename)data_arr = np.loadtxt(file,dtype=bytes,delimiter=',', skiprows=1).astype(str)data_arr_list.append(data_arr)return data_arr_list

这里关于numpy的用法,可以参考之前的几篇关于numpy的文章:

Data Science | Numpy基础(一)

Data Science | Numpy基础(二)

Data Science | 福利列表 | Numpy基础(三)

数据清洗

因为数据是整理后导出的数据所以不需要清洗缺失值等操作,我们直接取出需要的字段,做一些处理即可。

这里骑行时间单位为ms,所以需要转化为min需要/1000/60。

# 数据清洗
def data_clean(data_arr_list):duration_min_list = []for data_arr in data_arr_list:data_arr = data_arr[:,0]duration_ms = np.core.defchararray.replace(data_arr,'"','')duration_min = duration_ms.astype('float') / 1000 / 60duration_min_list.append(duration_min)return duration_min_list
数据分析

计算平均值在numpy中提供了计算函数,直接调用即可。

# 数据分析
def mean_data(duration_min_list):duration_mean_list = []for duration_min in duration_min_list:duration_mean = np.mean(duration_min)duration_mean_list.append(duration_mean)return duration_mean_list
结果展示

这里可视化展示使用的是matplotlib.pyplot库,咸鱼目前还没有写相关的入门文章,可以上网看下文档学习下简单使用即可,之后会有系列文章写可视化的内容。

# 数据展示
def show_data(duration_mean_list):plt.figure()name_list = ['第一季度', '第二季度', '第三季度', '第四季度']plt.bar(range(len(duration_mean_list)),duration_mean_list,tick_label = name_list)plt.show()
成果展示

单单从上面的图可以看到以炎热的夏季和凉爽的秋季为主调的二三季度的骑行时间要高于春冬为主调的一四季度,以此判断气温变化对人们使用的共享单车的影响。

一些踩过的坑
关于数据读取(一)

在python中字符串是有字节字符串和文本字符串之分的,我们通常说的字符串是指文本字符串。而使用numpy的loadtxt函数读取的字符串默认是字节字符串,输出的话字符串前面会有个b,形如b’……’。通常是需要转换的,如果不转换将会出现问题。

数据收集部分如果不注意这一点,在数据清洗部分,字段的格式就会因为Duration的值多了一个b转化上就会报错。

处理方式:

numpy.loadtxt读入的字符串总是bytes格式,总是在前面加了一个b
原因:np.loadtxt and np.genfromtxt operate in byte mode, which is the default string type in Python 2. But Python 3 uses unicode, and marks bytestrings with this b. numpy.loadtxt中也声明了:Note that generators should return byte strings for Python 3k.解决:使用numpy.loadtxt从文件读取字符串,最好使用这种方式np.loadtxt(filename, dtype=bytes).astype(str)

作者:Cameron
链接:https://www.zhihu.com/question/28690341/answer/164344688
来源:知乎

关于数据读取上的坑(二)

可以看到咸鱼在读取数据的时候使用的是numpy.loadtxt,这样的操作固然方便,但是代价就是内存直接爆掉,还好这次的数据才500M,所以不推荐大家使用我这个方法,之后会加以改进(如果我会的话

这里分享一段代码,来自慕课网bobby老师的实战课,如何使用生成器读取大文本文件:

#500G, 特殊 一行
def myreadlines(f, newline):buf = ""while True:while newline in buf:pos = buf.index(newline)yield buf[:pos]buf = buf[pos + len(newline):]chunk = f.read(4096)if not chunk:#说明已经读到了文件结尾yield bufbreakbuf += chunkwith open("input.txt") as f:for line in myreadlines(f, "{|}"):print (line)
关于matplotlib.pyplot使用上的坑

在可视化的时候,柱状图的标识是中文,在显示的时候直接显示的是方块,无法显示中文。如下:

错误示范

处理方法:

解决方式一:修改配置文件
(1)找到matplotlibrc文件(搜索一下就可以找到了)
(2)修改:font.serif和font.sans-serif,我的在205,206行
font.serif: SimHei, Bitstream Vera Serif, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
font.sans-serif: SimHei, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif解决方式二:在代码中修改
import matplotlib指定默认字体
matplotlib.rcParams[‘font.sans-serif’] = [‘SimHei’]
matplotlib.rcParams[‘font.family’]=’sans-serif’解决负号’-‘显示为方块的问题
matplotlib.rcParams[‘axes.unicode_minus’] = False
---------------------
来源:CSDN
原文:https://blog.csdn.net/weixin_40283480/article/details/81613008

如果感觉有帮助的话,不妨点个好看?

这篇关于数据分析 | Numpy实战(一) - 分析某单车骑行时间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/764477

相关文章

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一