python 提取前几大数据

2018-12-07 17:35:38 RedPintings 阅读数 2726

Python在大数据行业非常火爆近两年,as a pythonic,所以也得涉足下大数据分析,下面就聊聊它们。

Python数据分析与挖掘技术概述

所谓数据分析,即对已知的数据进行分析,然后提取出一些有价值的信息,比如统计平均数,标准差等信息,数据分析的数据量可能不会太大,而数据挖掘,是指对大量的数据进行分析与挖倔,得到一些未知的,有价值的信息等,比如从网站的用户和用户行为中挖掘出用户的潜在需求信息,从而对网站进行改善等。
数据分析与数据挖掘密不可分,数据挖掘是对数据分析的提升。数据挖掘技术可以帮助我们更好的发现事物之间的规律。所以我们可以利用数据挖掘技术可以帮助我们更好的发现事物之间的规律。比如发掘用户潜在需求,实现信息的个性化推送,发现疾病与病状甚至病与药物之间的规律等。

预先善其事必先利其器

我们首先聊聊数据分析的模块有哪些:

  1. numpy 高效处理数据,提供数组支持,很多模块都依赖它,比如pandas,scipy,matplotlib都依赖他,所以这个模块都是基础。所以必须先安装numpy。
  2. pandas 主要用于进行数据的采集与分析
  3. scipy 主要进行数值计算。同时支持矩阵运算,并提供了很多高等数据处理功能,比如积分,微分方程求样等。
  4. matplotlib 作图模块,结合其他数据分析模块,解决可视化问题
  5. statsmodels 这个模块主要用于统计分析
  6. Gensim 这个模块主要用于文本挖掘
  7. sklearn,keras 前者机器学习,后者深度学习。

下面就说说这些模块的基础使用。

numpy模块安装与使用

安装:
下载地址是:http://www.lfd.uci.edu/~gohlke/pythonlibs/
我这里下载的包是1.11.3版本,地址是:http://www.lfd.uci.edu/~gohlke/pythonlibs/f9r7rmd8/numpy-1.11.3+mkl-cp35-cp35m-win_amd64.whl
下载好后,使用pip install "numpy-1.11.3+mkl-cp35-cp35m-win_amd64.whl"
安装的numpy版本一定要是带mkl版本的,这样能够更好支持numpy

numpy简单使用

import numpy

x=numpy.array([11,22,33,4,5,6,7,])  #创建一维数组
x2=numpy.array([['asfas','asdfsdf','dfdf',11],['1iojasd','123',989012],["jhyfsdaeku","jhgsda"]])    #创建二维数组,注意是([])

x.sort()   #排序,没有返回值的,修改原处的值,这里等于修改了X
x.max()    # 最大值,对二维数组都管用
x.min()    # 最小值,对二维数组都管用
x1=x[1:3]   # 取区间,和python的列表没有区别

生成随机数

主要使用numpy下的random方法。

#numpy.random.random_integers(最小值,最大值,个数)  获取的是正数
data = numpy.random.random_integers(1,20000,30)   #生成整形随机数
#正态随机数  numpy.random.normal(均值,偏离值,个数)  偏离值决定了每个数之间的差 ,当偏离值大于开始值的时候,那么会产生负数的。
data1 = numpy.random.normal(3.2,29.2,10)    # 生成浮点型且是正负数的随机数

pandas

使用pip install pandas即可

直接上代码:
下面看看pandas输出的结果, 这一行的数字第几列,第一列的数字是行数,定位一个通过第一行,第几列来定位:

print(b)
      0     1     2    3    
0     1     2     3  4.0
1  sdaf  dsaf  18hd  NaN
2  1463  None  None  NaN

常用方法如下:

import pandas
a=pandas.Series([1,2,3,34,])   # 等于一维数组
b=pandas.DataFrame([[1,2,3,4,],["sdaf","dsaf","18hd"],[1463]])   # 二维数组
print(b.head())  # 默认取头部前5行,可以看源码得知
print(b.head(2))  # 直接传入参数,如我写的那样
print(b.tail())   # 默认取尾部前后5行
print(b.tail(1))     # 直接传入参数,如我写的那样

下面看看pandas对数据的统计,下面就说说每一行的信息

# print(b.describe())   # 显示统计数据信息
         3      # 3表示这个二维数组总共多少个元素
count  1.0      # 总数
mean   4.0      # 平均数
std    NaN      # 标准数
min    4.0      # 最小数
25%    4.0      # 分位数
50%    4.0      # 分位数
75%    4.0      # 分位数
max    4.0      # 最大值

转置功能:把行数转换为列数,把列数转换为行数,如下所示:

print(b.T)   # 转置
   0     1     2   
0  1  sdaf  1463
1  2  dsaf  None
2  3  18hd  None
3  4   NaN   NaN

通过pandas导入数据

pandas支持多种输入格式,我这里就简单罗列日常生活最常用的几种,对于更多的输入方式可以查看源码后者官网。

CSV文件

csv文件导入后显示输出的话,是按照csv文件默认的行输出的,有多少列就输出多少列,比如我有五列数据,那么它就在prinit输出结果的时候,就显示五列

csv_data = pandas.read_csv('F:\Learnning\CSDN-python大数据\hexun.csv')
print(csv_data)

excel表格

依赖于xlrd模块,请安装它。
老样子,原滋原味的输出显示excel本来的结果,只不过在每一行的开头加上了一个行数

excel_data = pandas.read_excel('F:\Learnning\CSDN-python大数据\cxla.xls')
print(excel_data)

读取SQL

依赖于PyMySQL,所以需要安装它。pandas把sql作为输入的时候,需要制定两个参数,第一个是sql语句,第二个是sql连接实例。

conn=pymysql.connect(host="127.0.0.1",user="root",passwd="root",db="test")
sql="select * from fortest"
e=pda.read_sql(sql,conn)

读取HTML

依赖于lxml模块,请安装它。
对于HTTPS的网页,依赖于BeautifulSoup4,html5lib模块。
读取HTML只会读取HTML里的表格,也就是只读取<table>标签包裹的内容.

html_data = pandas.read_html('F:\Learnning\CSDN-python大数据\shitman.html')   # 读取本地html文件。
html_from_online = pandas.read_html('https://book.douban.com/')  # 读取互联网的html文件
print(html_data)
print('html_from_online')

显示的是时候是通过python的列表展示,同时添加了行与列的标识

读取txt文件

输出显示的时候同时添加了行与列的标识

text_data = pandas.read_table('F:\Learnning\CSDN-python大数据\dforsay.txt')
print(text_data)

scipy

安装方法是先下载whl格式文件,然后通过pip install “包名” 安装。whl包下载地址是:http://www.lfd.uci.edu/~gohlke/pythonlibs/f9r7rmd8/scipy-0.18.1-cp35-cp35m-win_amd64.whl

matplotlib 数据可视化分析

我们安装这个模块直接使用pip install即可。不需要提前下载whl后通过 pip install安装。

下面请看代码:

from matplotlib import  pylab
import numpy
# 下面2行定义X轴,Y轴
x=[1,2,3,4,8]
y=[1,2,3,4,8]
# plot的方法是这样使用(x轴数据,y轴数据,展现形式)
pylab.plot(x,y)   # 先把x,y轴的信息塞入pylab里面,再调用show方法来画图
pylab.show()    # 这一步开始画图,默认是至线图

画出的图是这样的:
image

下面说说修改图的样式

关于图形类型,有下面几种:

  1. 直线图(默认)
  2. - 直线
  3. -- 虚线
  4. -. -.形式
  5. : 细小虚线

关于颜色,有下面几种:

  1. c-青色
  2. r-红色
  3. m-品红
  4. g-绿色
  5. b-蓝色
  6. y-黄色
  7. k-黑色
  8. w-白色

关于形状,有下面几种:

  1. s 方形
  2. * 星形
  3. p 五角形

我们还可以对图稍作修改,添加一些样式,下面修改圆点图为红色的点,代码如下:

pylab.plot(x,y,'or')   # 添加O表示画散点图,r表示red
pylab.show()

image

我们还可以画虚线图,代码如下所示:

pylab.plot(x,y,'r:')
pylab.show()

还可以给图添加上标题,x,y轴的标签,代码如下所示

pylab.plot(x,y,'pr--')   #p是图形为五角星,r为红色,--表示虚线
pylab.title('for learnning')   # 图形标题
pylab.xlabel('args')   # x轴标签
pylab.ylabel('salary')   # y轴标签
pylab.xlim(2)    # 从y轴的2开始做线
pylab.show()

image

直方图

利用直方图能够很好的显示每一段的数据。下面使用随机数做一个直方图。

data1 = numpy.random.normal(5.0,4.0,10)   # 正态随机数
pylab.hist(data1)
pylab.show()

image
Y轴为出现的次数,X轴为这个数的值(或者是范围)

还可以指定直方图类型通过histtype参数:

图形区别语言无法描述很详细,大家可以自信尝试。

  1. bar :is a traditional bar-type histogram. If multiple data
    are given the bars are aranged side by side.
  2. barstacked :is a bar-type histogram where multiple
    data are stacked on top of each other.
  3. step :generates a lineplot that is by default
    unfilled.
  4. stepfilled :generates a lineplot that is by default
    filled.

举个例子:

sty=numpy.arange(1,30,2)
pylab.hist(data1,histtype='stepfilled')
pylab.show() 

image

子图功能

什么是子图功能呢?子图就是在一个大的画板里面能够显示多张小图,每个一小图为大画板的子图。
我们知道生成一个图是使用plot功能,子图就是subplog。代码操作如下:

#subplot(行,列,当前区域)
pylab.subplot(2,2,1)   # 申明一个大图里面划分成4块(即2*2),子图使用第一个区域(坐标为x=1,y=1)
pylab.subplot(2,2,2)  # 申明一个大图里面划分成4块(即2*2),子图使用第二个区域(坐标为x=2,y=2)
x1=[1,4,6,9]
x2=[3,21,33,43]
pylab.plot(x1,x2)   # 这个plot表示把x,y轴数据塞入前一个子图中。我们可以在每一个子图后使用plot来塞入x,y轴的数据
pylab.subplot(2,1,2)  # 申明一个大图里面划分成2块(即),子图使用第二个区域(坐标为x=1,y=2)
pylab.show()

实践小例子

我们现在可以通过一堆数据来绘图,根据图能够很容易的发现异常。下面我们就通过一个csv文件来实践下,这个csv文件是某个网站的文章阅读数与评论数。
先说说这个csv的文件结构,第一列是序号,第二列是每篇文章的URL,第三列每篇文章的阅读数,第四列是每篇评论数。
我们的需求就是把评论数作为Y轴,阅读数作为X轴,所以我们需要获取第三列和第四列的数据。我们知道获取数据的方法是通过pandas的values方法来获取某一行的值,在对这一行的值做切片处理,获取下标为3(阅读数)和4(评论数)的值,但是,这里只是一行的值,我们需要是这个csv文件下的所有评论数和阅读数,那怎么办?聪明的你会说,我自定义2个列表,我遍历下这个csv文件,把阅读数和评论数分别添加到对应的列表里,这不就行了嘛。呵呵,其实有一个更快捷的方法,那么就是使用T转置方法,这样再通过values方法,就能直接获取这一评论数和阅读数了,此时在交给你matplotlib里的pylab方法来作图,那么就OK了。了解思路后,那么就写吧。

下面看看代码:


csv_data = pandas.read_csv('F:\Learnning\CSDN-python大数据\hexun.csv')
dt = csv_data.T   # 装置下,把阅读数和评论数转为行
readers=dt.values[3]   
comments = dt.values[4]
pylab.xlabel(u'reads')
pylab.ylabel(u'comments')   # 打上标签
pylab.title(u"The Article's reads and comments")
pylab.plot(readers,comments,'ob')
pylab.show()

image

 

2020-03-01 00:25:58 qq_45172832 阅读数 7938

☞☞☞点击查看更多优秀Python博客☜☜☜

 Hello大家好,我是你们的朋友JamesBin上篇文章Python自学我们分析了自学python到底有没有用,那么下面这几篇文章我们就来看看自学python的路线应该如何规划
我们的学习路线呢?下面让我们首先看一下大数据方向的路线吧!

什么是大数据

  "大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。在维克托·迈尔-舍恩伯格及肯尼斯·库克耶编写的《大数据时代》中大数据指不用随机分析法(抽样调查)这样捷径,而采用所有数据进行分析处理。大数据的5V特点(IBM提出):Volume(大量)、Velocity(高速)、Variety(多样)、Value(低价值密度)、Veracity(真实性)。

在这里插入图片描述

大数据学习大纲

大数据学习大纲:(大纲来源:https://www.zhihu.com/people/RickyFine)

  • 数据分析的思维和方法
  • Excel进阶
  • 数据库和SQL入门
  • 数理统计学
  • 数据分析软件应用
  • 数据可视化
  • 常见的业务分析模型
  • Python/R语言掌握
  • 业务理解和指标设计
  • 增长黑客:数据驱动增长

在这里插入图片描述

获取大数据

获取大数据的方法主要有一下几种:

  1. 国家数据库:中国铁路交通数据、城市监控录像等;
  2. 企业数据:淘宝交易数据、淘宝购物车收藏数据、京东购物数据;
  3. 机器设备数据:GPS导航系统数据、车仪数据等;
  4. 个人数据:个人日常生活产生的数据。

  大数据的获取主要是从已有的资源中进行数据分析,从而得到自己想要的信息,再将信息进行分析利用。在获取到数据之后最重要的步骤还是看到数据具体张什么样子,有什么特点和规律。得到特点和规律之后根据我们的而具体需求进行贴标签分类处理。只有这样我们才能从复杂的数据中得到不易发现但是价值更大的信息。
  在获取数据的时候我们需要注意的是中国相关法律的规定,特别是爬虫爬取到的数据,我们应遵守相关法律。不得做违反法律的事情。

数据分析

学习路线

我将大数据的学习路线分为以下几步:
在这里插入图片描述

第一步:了解大数据的基本概念

  我们想要学习一个新知识,首先需要的就是知道他是什么?有什么作用?
  这个过程中我们应该能够懂得一些专业术语,能够使用基本的获取数据的方法,既然学习大数据我们级应该首先知道什么是大数据,大数据是用来干什么的,以免我们对大数据不了解就开始盲目的学习,从而得不到自己想要的收获。

第二步:学习获取大数据

  大数据的获取方法众多,我们应该能够从中总结出一种适合自己,适合实际情况的方法去得到我们想要的数据,其中最常用的就是爬虫,所以我们在学习大数据之前不仅要学习好python的基本功还要学会Python中的爬虫的相关知识。爬虫是一种容易入门的爬取数据的方法,但绝对不是唯一的一种方法,所以随着我们学习的不断深入,我们就会发现python爬虫已经不能满足我们了。
  我们只学习的时候一定要注意理论与实践相结合,不可只学不练,这是学习编程最大的忌讳,所以我们在学习的时候可以结所学内容进行一定的实践,做点小项目。

第三步:学习数据处理

  将我们的数据进行储存、可视化处理,这样茶能把我们得到的数据进行可视化输出。我们得到数据后需要对数据进行清洗、探索、提取、可视化处理,其中用到的主要的Python知识如何使用Python从CSV、Excel、XML、PDF 中获取数据,和各类的可视化处理的知识。
  数据清洗,首先最数据进行筛选,选合适的方式对数据进行筛选处理,保留有用数据,剔除无用数据,这个步骤非常的关键,只有数据清洗的干净,后期我们进行可视化处理时才能更加准确简单。

第四步:数据储存

  我们需要将得到的数据和处理后的数据进行储存,以便我们后期进行使用,要想进行数据储存,我们首先需要掌握文件操作,储存的方式和类型也是多种多样,其中主要包括:保存本地、保存到数据库中。前期我们只需要掌握如何将数据进行本地保存即可,当我们学习到一定程度后再考虑如何进行其他更加方便可靠的进行数据保存。

  介绍到这数据处理部分的大纲算是讲完了,本文仅代表本人观点,如有不同意见可在评论区留言,希望对你大数据方向有所帮助。在这里插入图片描述

2017-03-03 09:49:45 u011244446 阅读数 3839
10亿个整数,随机生成,可重复,求最大的前1万个。当时我一下子就蒙了,没反应过来,何况我还正在烧着菜呢,所以我就没细想,说了一个连我都鄙视我的思路:我说导入数据库,然后用select语句选出最大的前1万个。可能我的答案连面试官都无语了,所以他就没再往下问了,不过他还是通知我明天16号早上去腾讯大厦笔试,由于我明天没空,就推迟到了17号早上10点。至此,整个电话面试就结束了。过后,我想了想,10亿个整数选前1万个大数,其实可以用:分治法+hash+多路归并排序来做,比如说,先把10亿个整数对1000取模,存储到1000个文件中,然后对每一个文件进行内部排序(比如快速排序,从大到小排序),然后再对这1000个文件进行多路归并,取出前1万个最大的数即可。
2020-01-02 20:08:59 weixin_41754309 阅读数 279

欢迎关注【无量测试之道】公众号,回复【领取资源】,
Python编程学习资源干货、
Python+Appium框架APP的UI自动化、
Python+Selenium框架Web的UI自动化、
Python+Unittest框架API自动化、

资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。

一、在工程目录中新建一个excel文件

二、使用python脚本程序将目标excel文件中的列头写入,本文省略该部分的code展示,可自行网上查询

三、以下code内容为:实现从接口获取到的数据值写入excel的整体步骤

       1、整体思路:

             (1)、根据每日调取接口的日期来作为excel文件中:列名为“收集日期”的值

             (2)、程序默认是每天会定时调取接口并获取接口的返回值并写入excel中(我使用的定时任务是:linux下的contab)

             (3)、针对接口异常未正确返回数据时,使用特殊符号如:NA代替并写入excel文件中(后期使用excel数据做分析时有用)

 

        2、完整代码如下:

import requests, xlrd, os, sys, urllib3
from datetime import date, timedelta
from xlutils.copy import copy
basedir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(basedir)
from lib.mysqldb import mysqldb
from lib.public_methods import test_login


def collect_data():
    """test_rooms.test_kpi卡片下:adr指标值收集"""
    get_all_code_sql = 'select DISTINCT test_code from test_info WHERE open_flag = 1'
    test_code_all = mysqldb("test_data").selectsql(get_all_code_sql)
    test_code_list = []
    adr_insert_data_list = []
    yesterday = (date.today() + timedelta(days=-1)).strftime("%Y-%m-%d")
    adr_insert_data_list.append(yesterday)
    for j in range(len(test_code_all)):
        test_code_list.append(test_code_all[j]["test_code"])
    for m in range(len(test_code_list)):
        url = "https://www.baidu.com/test/api/data/query.json"
        header = {
            "Content-Type": "application/json;charset=UTF-8",
            "Cookie": str(test_login())
        }
        param = {
            "code": "test_rooms.test_kpi",
            "page": 1,
            "pageSize": 1000,
            "params": {
                "start_date_year": "2019",
                "start_date_month": "9",
                "start_date_day": "16",
                "end_date_year": "2019",
                "currency_type": "usd",
                "end_date_day": "16",
                "end_date_month": "9",
                "tests": "test_001"
            }
        }
        """替换请求参数中的开始日期"""
        param["params"]["start_date_year"] = str(yesterday).split("-")[0]
        param["params"]["start_date_month"] = str(yesterday).split("-")[1]
        param["params"]["start_date_day"] = str(yesterday).split("-")[2]
        """替换请求参数中的结束日期"""
        param["params"]["end_date_year"] = param["params"]["start_date_year"]
        param["params"]["end_date_month"] = param["params"]["start_date_month"]
        param["params"]["end_date_day"] = param["params"]["start_date_day"]
        param["params"]["tests"] = test_code_list[m]
        urllib3.disable_warnings()
        result = requests.post(url=url, headers=header, json=param, verify=False).json()
        if str(result["data"]["data"]) != "None":
            """adr指标值收集"""
            indicatorList = result["data"]["data"]["test_indicator_list"]
            test_actualorLast_Forecast = result["data"]["data"]["test_actual"]
            new_indicator_actualvalue = {}
            i = 0
            while i < len(indicatorList):
                dit = {indicatorList[i]: test_actualorLast_Forecast[i]}
                new_indicator_actualvalue.update(dit)
                i += 1
            if str(new_indicator_actualvalue["adr"]) == "--":
                adr_value_result = "NA"
                adr_insert_data_list.append(adr_value_result)
            else:
                adr_value_result = new_indicator_actualvalue["adr"]
                adr_insert_data_list.append(adr_value_result)
        else:
            adr_value_result = "NA"
            adr_insert_data_list.append(adr_value_result)

    """adr指标值数据收集入excel路径"""
    workbook = xlrd.open_workbook(basedir + "/data/collect_data_center.xls")  # 打开工作簿
    sheets = workbook.sheet_names()  # 获取工作簿中的所有表格
    worksheet = workbook.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个表格
    rows_old = worksheet.nrows  # 获取表格中已存在的数据的行数
    new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象
    new_worksheet = new_workbook.get_sheet(0)  # 获取转化后工作簿中的第一个表格
    for i in range(0, 1):
        for j in range(0, len([adr_insert_data_list][i])):
            new_worksheet.write(i + rows_old, j, [adr_insert_data_list][i][j])  # 追加写入数据,注意是从i+rows_old行开始写入
    new_workbook.save(basedir + "/data/collect_data_center.xls")  # 保存工作簿
    print("adr指标值---xls格式表格【追加】写入数据成功!")

              3、从步骤2中的代码可看出代码整体分为3个部分:

                    (1)、组装接口参数;

                    (2)、调用接口将接口返回的结果集收集在list中;

                    (3)、将收集的结果写入excel中并保存;

 

               4、最终excel写入数据的样式如下截图所示:

 

tips:windows与linux下excel的路径格式需要区分下,以上代码中的"/data/collect_data_center.xls"为linux环境下路径

 

备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:

添加关注,一起共同成长吧。

2017-08-29 10:18:08 u010035907 阅读数 28801

博文1:pandas.read_csv——分块读取大文件

http://blog.csdn.net/zm714981790/article/details/51375475

今天在读取一个超大csv文件的时候,遇到困难:

  • 首先使用office打不开
  • 然后在python中使用基本的pandas.read_csv打开文件时:MemoryError
  • 最后查阅read_csv文档发现可以分块读取。
  • read_csv中有个参数chunksize,通过指定一个chunksize分块大小来读取文件,返回的是一个可迭代的对象TextFileReader,IO Tools 举例如下:
In [138]: reader = pd.read_table('tmp.sv', sep='|', chunksize=4)

In [139]: reader
Out[139]: <pandas.io.parsers.TextFileReader at 0x120d2f290>

In [140]: for chunk in reader:
   .....:     print(chunk)
   .....: 
   Unnamed: 0         0         1         2         3
0           0  0.469112 -0.282863 -1.509059 -1.135632
1           1  1.212112 -0.173215  0.119209 -1.044236
2           2 -0.861849 -2.104569 -0.494929  1.071804
3           3  0.721555 -0.706771 -1.039575  0.271860
   Unnamed: 0         0         1         2         3
0           4 -0.424972  0.567020  0.276232 -1.087401
1           5 -0.673690  0.113648 -1.478427  0.524988
2           6  0.404705  0.577046 -1.715002 -1.039268
3           7 -0.370647 -1.157892 -1.344312  0.844885
   Unnamed: 0         0        1         2         3
0           8  1.075770 -0.10905  1.643563 -1.469388
1           9  0.357021 -0.67460 -1.776904 -0.968914
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 指定iterator=True 也可以返回一个可迭代对象TextFileReader :
In [141]: reader = pd.read_table('tmp.sv', sep='|', iterator=True)

In [142]: reader.get_chunk(5)
Out[142]: 
   Unnamed: 0         0         1         2         3
0           0  0.469112 -0.282863 -1.509059 -1.135632
1           1  1.212112 -0.173215  0.119209 -1.044236
2           2 -0.861849 -2.104569 -0.494929  1.071804
3           3  0.721555 -0.706771 -1.039575  0.271860
4           4 -0.424972  0.567020  0.276232 -1.087401
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

  • 我需要打开的数据集是个csv文件,大小为3.7G,并且对于数据一无所知,所以首先打开前5行观察数据的类型,列标签等等
chunks = pd.read_csv('train.csv',iterator = True)
chunk = chunks.get_chunk(5)
print chunk
'''
             date_time  site_name  posa_continent  user_location_country  
0  2014-08-11 07:46:59          2               3                     66   
1  2014-08-11 08:22:12          2               3                     66   
2  2014-08-11 08:24:33          2               3                     66   
3  2014-08-09 18:05:16          2               3                     66   
4  2014-08-09 18:08:18          2               3                     66   
'''
博文2:python大规模数据处理技巧之一:数据常用操作

http://blog.csdn.net/asdfg4381/article/details/51689344

面对读取上G的数据,Python不能像做简单代码验证那样随意,必须考虑到相应的代码的实现形式将对效率的影响。如下所示,对pandas对象的行计数实现方式不同,运行的效率差别非常大。虽然时间看起来都微不足道,但一旦运行次数达到百万级别时,其运行时间就根本不可能忽略不计了:

p1

故接下来的几个文章将会整理下渣渣在关于在大规模数据实践上遇到的一些问题,文章中总结的技巧基本是基于pandas,有错误之处望指正。

1、外部csv文件读写


大数据量csv读入到内存


  • 分析思路:数据量非常大时,比如一份银行一个月的流水账单,可能有高达几千万的record。对于一般性能的计算机,有或者是读入到特殊的数据结构中,内存的存储可能就非常吃力了。考虑到我们使用数据的实际情况,并不需要将所有的数据提取出内存。当然读入数据库是件比较明智的做法。若不用数据库呢?可将大文件拆分成小块按块读入后,这样可减少内存的存储与计算资源
  • 注意事项:open(file.csv)与pandas包的pd.read_csv(file.csv ): python32位的话会限制内存,提示太大的数据导致内存错误。解决方法是装python64位。如果嫌python各种包安装过程麻烦,可以直接安装Anaconda2 64位版本
  • 简易使用方法:
    chunker = pd.read_csv(PATH_LOAD, chunksize = CHUNK_SIZE)
  • 1
  • 1
  • 读取需要的列:
    columns = ("date_time",  "user_id")
    chunks_train = pd.read_csv(filename, usecols = columns, chunksize = 100000)
  • 1
  • 2
  • 1
  • 2

chunker对象指向了多个分块对象,但并没有将实际数据先读入,而是在提取数据时才将数据提取进来。数据的处理和清洗经常使用分块的方式处理,这能大大降低内存的使用量,但相比会更耗时一些

  • 分块读取chunk中的每一行:
    for rawPiece in chunker_rawData:
        current_chunk_size = len(rawPiece.index)   #rawPiece 是dataframe
        for i in range(current_chunk_size ):
            timeFlag = timeShape(rawPiece.ix[i])   #获取第i行的数据
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

将数据存到硬盘


  • 直接写出到磁盘:
    data.to_csv(path_save, index = False, mode = 'w')`
  • 1
  • 1
  • 分块写出到磁盘:
  1. 对于第一个分块使用pandas包的存储IO: 
    • 保留header信息,‘w’模式写入
    • data.to_csv(path_save, index = False, mode = 'w')
  2. 接下的分块写入 
    • 去除header信息,‘a’模式写入,即不删除原文档,接着原文档后继续写
    • data.to_csv(path_save, index = False, header = False, mode = a')
  • 少量的数据写出:

少量的数据用pickle(cPickle更快)输出和读取,非常方便 ,下面分别是写出和读入

写出:

    import cPickle as pickle
    def save_trainingSet(fileLoc, X, y):
        pack = [X, y]
        with open(fileLoc, 'w') as f:
            pickle.dump(pack, f)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

读入:

    import cPickle as pickle
    def read_trainingSet(fileLoc):
        with open(fileLoc, 'r') as f:
            pack = pickle.load(f)
        return pack[0], pack[1]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

高效读取外部csv到python内部的list数据结构


  • 效率低下的方法:使用pd读入需要从pd转换到python本身的数据结构,多此一举
    userList = []
    content = pd.read_csv(filename)
    for i in range(len(content)):
        line = content.ix[i]['id']
        userList.append(line)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • 效率高的方法:直接将外部数据读入进来
    userList = []
    f = open(filename)
    content = f.readlines()
    for line in content:
        line = line.replace('\n', '').split(',')
        userList.append(line)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2、数据分析时常用数据结构之间的转化


数据集的横向与纵向合并


  • 简单地横向合并数据集:
  • 问题分析: 
    • 纵向的合并使用list并不好,因为需要去拆解list的每一个行元素,并用extend去拓展每一行的纵向元素
    • 最好使用dataframe中的concat函数:c = pd.concat([a, b], axis = 1),当axis=0时表示合并行(以行为轴)
    inx1 = DataFrame(np.random.randn(nSample_neg), columns = ['randVal'])
    inx2 = DataFrame(range(nSample_neg), columns = ['inxVal'])
    inx = pd.concat([inx1, inx2], axis = 1)
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3
  • 类似数据库的表合并:join(待完整)
    ret = ret.join(dest_small, on="srch_destination_id", how='left', rsuffix="dest")
  • 1
  • 1
  • 简单纵向合并数据集:
  • 纵向合并数据集可以考虑一下几种方法: 
    • 读取数据为list格式,使用append函数逐行读取
    • 将数据集转换为pandas中的dataframe格式,使用dataframe的merge与concat方法
  • 方法: 
    • 方法一:使用dataframe读入,使用concat把每行并起来
    • 方法二:先使用list读入并起来,最后转换成dataframe
    • 方法三:先使用list读入并起来大块的list,每块list转换成dataframe后用concat合并起来
  • 比较:方法一由于concat的静态性,每次要重新分配资源,故跑起来很慢; 方法二与三:会快很多,但具体没有测试,以下是使用方法三的代码:
    data = []
    cleanedPiece = []
    for i in range(CHUNK_SIZE):
        line = rawPiece.ix[i]
        uid = [line['user_id'], line['item_id'],
            line['behavior_type'], timeFlag]
        cleanedPiece.append(uid)
    cleanedPiece = DataFrame(cleanedPiece, columns = columns)
    data = pd.concat([data, cleanedPiece], axis = 0)