纽约出租车计费问题:如何加载千万行级的大数据集
机器学习案例详解的直播互动平台——
机器学习训练营(入群联系qq:2279055353)
下期直播案例预告:大数据预测商品的销售量波动趋势
这是关于“纽约出租车计费问题”的第三篇文章,重点介绍如何在Python里加载超大规模的数据集。在这个案例里,训练集train.csv
是一个55,423,855行的数据集。由于受到内存容量、计算速度等因素的限制,大多数解决方案仅仅加载了训练集的一部分数据。我们将在本篇介绍如何快速地加载训练集的所有数据进入一个数据框。
为了实现在Python里快速导入超大数据集的目的,需要两个重要的辅助工具库:dask
and tqdm
. 因此,我们首先介绍它们。
辅助工具库
Dask
Dask是一个用于并行计算的Python库。它由两部分组成:
动态任务调度:迭代地优化计算任务
大数据集合:运行在动态任务调度器顶端的并行大数据集
下面的图显示了dask的作用:
安装Dask
你能通过conda
or pip
安装dask.
Conda
Dask在Anaconda
里默认安装。你也可以使用conda命令升级dask:
conda install dask
这种安装方法附带安装了所有的dependencies
, 包括Pandas
and NumPy
.
可选地,你能使用下面的命令仅安装dask的必需部分:
conda install dask-core
Pip
你也可以使用Python包管理器Pip安装dask, 完整安装命令:
pip install "dask[complete]" # Install everything
你也可以只安装dask, 这时,如果要使用dask.array
, dask.dataframe
or dask.distributed
, 必须安装NumPy, Pandas, Tornada.
pip install dask # Install only core parts of dask
为了实现不同的功能,我们相应地安装依赖集。
pip install "dask[array]" # Install requirements for dask array
pip install "dask[bag]" # Install requirements for dask bag
pip install "dask[dataframe]" # Install requirements for dask dataframe
pip install "dask[distributed]" # Install requirements for distributed dask
tqdm
tqdm 是一个快速,可扩展的Python进度条,可以在Python长循环中添加一个进度提示信息,用户只需要封装任意的迭代器 tqdm(iterator).
tqdm的安装很简单:
pip install tqdm
加载数据集
首先,导入必需的库。
import pandas as pd
import dask.dataframe as dd
import os
from tqdm import tqdmTRAIN_PATH = '../input/train.csv'
确定行数
对于大规模的数据集,有时我们只想知道它到底有多少行。下面介绍两种快速显示精确行数的方法。
方法一
%%timewith open(TRAIN_PATH) as file:n_rows = len(file.readlines())print (f'Exact number of rows: {n_rows}')
Exact number of rows: 55423857
Wall time: 1min 1s
方法二
%%timeimport subprocessdef file_len(fname):p = subprocess.Popen(['wc', '-l', fname], stdout=subprocess.PIPE, stderr=subprocess.PIPE)result, err = p.communicate()if p.returncode != 0:raise IOError(err)return int(result.strip().split()[0])+1n_rows = file_len(TRAIN_PATH)
print (f'Exact number of rows: {n_rows}')
Exact number of rows: 55423857
Wall time: 36.9 s
加载数据集
显示训练集的前5行,查看数据类型。
df_tmp = pd.read_csv(TRAIN_PATH, nrows=5)
df_tmp.head()
df_tmp.info()
对于变量longitude
and latitude
, 我们可能不需要float64型,这种类型保留16位小数。因此,把它们转换成保留7位小数的float32型。
traintypes = {'fare_amount': 'float32','pickup_datetime': 'str', 'pickup_longitude': 'float32','pickup_latitude': 'float32','dropoff_longitude': 'float32','dropoff_latitude': 'float32','passenger_count': 'uint8'}cols = list(traintypes.keys())chunksize = 5_000_000 # 5 million rows at one go. Or try 10 million
加载批处理数据框,在程序的下方显示一个运行的进度条。
%%time
df_list = [] # list to hold the batch dataframefor df_chunk in tqdm(pd.read_csv(TRAIN_PATH, usecols=cols, dtype=traintypes, chunksize=chunksize)):# Neat trick from https://www.kaggle.com/btyuhas/bayesian-optimization-with-xgboost# Using parse_dates would be much slower!df_chunk['pickup_datetime'] = df_chunk['pickup_datetime'].str.slice(0, 16)df_chunk['pickup_datetime'] = pd.to_datetime(df_chunk['pickup_datetime'], utc=True, format='%Y-%m-%d %H:%M')# Can process each chunk of dataframe here# clean_data(), feature_engineer(),fit()# Alternatively, append the chunk to list and merge alldf_list.append(df_chunk)
# Merge all dataframes into one dataframe
train_df = pd.concat(df_list)# Delete the dataframe list to release memory
del df_list# See what we have loaded
train_df.info()
%%time
# Save into feather format, about 1.5Gb.
train_df.to_feather('nyc_taxi_data_raw.feather')
%%time
# load the same dataframe next time directly, without reading the csv file again!
train_df_new = pd.read_feather('nyc_taxi_data_raw.feather')
# print the dataframe info to verify we have indeed loaded the saved dataframe of 55 million rows
train_df_new.info()
%%time
import feather
# load the same dataframe next time directly, without reading the csv file again!
train_df_new = feather.read_dataframe('nyc_taxi_data_raw.feather')
Wall time: 1.26 s
# print the dataframe info to verify we have indeed loaded the saved dataframe of 55 million rows
train_df_new.shape
(55423856, 7)
使用dask加载数据集
使用dask和它的数据框结构,可以像在pandas里那样建立数据框。但与pandas不同的是,这种加载方式保持数据框作为数据文件的一个“指针”而非载入,除非你明确要求载入数据集。
%%time# dask's read_csv takes no time at all!
ddf = dd.read_csv(TRAIN_PATH, usecols=cols, dtype=traintypes)
Wall time: 149 ms
# no info?
ddf.info()
# nothing to describe?
ddf.describe()
# dask is lazy. It only works when it is asked explicitly
ddf.head()
纽约出租车计费问题:如何加载千万行级的大数据集相关推荐
- R语言使用keras包实现卷积自动编码器模型(Convolutional Autoencoder)、加载keras自带的mnist数据集、训练中动态生成每个epoch后模型训练的loss曲线
R语言使用keras包实现卷积自动编码器模型(Convolutional Autoencoder).加载keras自带的mnist数据集.训练中动态生成每个epoch后模型训练的loss曲线 目录
- oracle 加载数据戽_走进大数据丨 ETL - Load(数据加载)
LOAD 加载经转换和汇总的数据到目标数据仓库中,可实现SQL或批量加载数据加载(Load) 经过数据转换生成的文件的结构与数据仓库数据表的结构完全一致,可以直接通过数据加载工具,以Bulk Load ...
- pytorch学习(一)数据加载之前的预处理(UCSD数据集)
最近在做有关视频异常检测方面的实验,需要用到UCSD数据集,pytorch自定义加载自己的数据集时需要将自己的数据的路径以及标签存放到txt文档中,方便后续的数据加载. 最后我会给出生成好的UCSD数 ...
- android动态图片适配,Android适配利用webview加载后图片显示过大的问题解决
前言 最近在开发过程中,需要用webview控件来展示文章的详情页面,流程是通过请求后台数据,然后用控件加载,而后台返回的文章详情页面是直接网页端使用的,并没有对移动端进行适配,导致webview加载 ...
- [Pytorch系列-41]:卷积神经网络 - 模型参数的恢复/加载 - 搭建LeNet-5网络与MNIST数据集手写数字识别
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- Fresco加载图片内存占用过大导致OOM
Fresco加载网络图片部分设备出现显示部分图片为黑色并崩溃 1.在使用Fresco显示网络图片在天猫魔盒M17设备时,出现部分图片显示为黑色,且一段时间后程序崩溃. 尝试把setImageURI方法 ...
- Android 下拉刷新上拉加载 多种应用场景 超级大放送(上)
转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉加载,网上的Demo太多太多了,这 ...
- 移动网站性能优化:网页加载技术概览
移动网站性能优化:网页加载技术概览 2013/08/27 | 分类: IT技术 | 0 条评论 | 标签: WEB开发, 性能优化, 移动 分享到: 47 本文由 伯乐在线 - 伯乐在线读者 翻译自 ...
- Unity大场景数据加载及优化方案
前段时间,有几个虚拟仿真公司跟我请教关于大地形的加载优化问题,它们使用的引擎都是自己研发的,引擎对于开发者来说,大同小异,它们的基本构造是一样的,关键是在于解决问题的方法,正是基于这个前提写了这个课程 ...
- 前端资源预加载并展示进度条
我们经常会看到,一些站点在首次进入的时候会先显示一个进度条,等资源加载完毕后再呈现页面,大概像这样: 然后整个页面的操作就会非常流畅,因为之后没必要再等待加载资源了.尤其是在移动端,或者是页游中,这样 ...
最新文章
- C++ 函数参数传递:传值,传指针,传引用
- 网络广告投放四大技巧有哪些?怎么样投放效果最好?
- wget抓取数据,需要用户登录验证
- Windows内核加载器概念学习
- 深度强化学习-马尔科夫决策过程和表格型方法
- 优化定制化abap代码必须遵守的经典黄金规则
- Angular中怎样通过localStorage实现数据持久化-实现存储搜索历史为例
- ReactNative 问题集合
- 最新的Scrum中文指南及更新
- C语言求解圆周率近似值
- 接口与多态:模拟物流快递系统程序设计实验
- 白帽子黑客生存环境变好,顶级人才年入千万
- 项目管理知识体系指南(十一)项目采购管理
- Windows下LATEX排版论文攻略—CTeX、JabRef使用心得, 包括 IEEEtran.bst
- Dubbo的多种序列化算法
- 平分秋色? 鹿死谁手?
- 多线程对H3C网络设备、安全设备进行配置备份【包含虚拟防火墙配置备份】
- Linux的常用命令有哪些?
- 面试官出的APP测试问题
- 十一五”核高基“陷入迷途,出路何在?