SQLITE3接口 to Arrary

——从数据库加载数据到dataframe/numpy中。

调动 SQLITE3数据库

  1. import sqlite3 as sq3
  2. query = 'CREATE TABLE numbs (Date date, No1 real, No2 real)'
  3.  
  4. con = sq3.connect(path + 'numbs.db')
  5. con.execute(query)
  6. con.commit()

commit 命令

COMMIT 命令是用于把事务调用的更改保存到数据库中的事务命令。

COMMIT 命令把自上次 COMMIT 或 ROLLBACK 命令以来的所有事务保存到数据库

返回值处理

返回所有值,就用 fetchall()。

  1. con.execute('SELECT * FROM numbs').fetchmany(10)
  2.  
  3. pointer = con.execute('SELECT * FROM numbs')
  4. for i in range(3):
  5. print(pointer.fetchone())

  6. Output:
    -------------------------------------------------
  7. ('2017-11-18 11:18:51.443295', 0.12, 7.3)
  8. ('2017-11-18 11:18:51.466328', 0.9791, -0.01914)
  9. ('2017-11-18 11:18:51.466580', -0.88736, 0.19104)

保存到NumPy

第一步、通过初始化直接格式变换即可。

  1. query = 'SELECT * FROM numbers WHERE No1 > 0 AND No2 < 0'
  2.  
  3. res = np.array( con.execute(query).fetchall() ).round(3)

第二步、可视化数据 by resampling,也就是少取一些点。

  1. res = res[::100] # every 100th result
  2. import matplotlib.pyplot as plt
  3. %matplotlib inline
  4. plt.plot(res[:, 0], res[:, 1], 'ro')
  5. plt.grid(True);
    plt.xlim(-0.5, 4.5);
    plt.ylim(-4.5, 0.5)
  6. # tag: scatter_query
  7. # title: Plot of the query result
  8. # size: 60

SQLITE3接口 to DataFrame

读取整个表

一张表通常内存可以搞定,全部读取也不是避讳的事情。

  1. import sqlite3 as sq3
  2. filename = path + 'numbs'
  3. con = sq3.Connection(filename + '.db')
  4.  
  5. %time data = pd.read_sql('SELECT * FROM numbers', con)
  6. data.head()

表操作

其实已经演变为 ndarray操作。

“与” 条件

  1. %time data[(data['No1'] > 0) & (data['No2'] < 0)].head()

“或” 条件

  1. %%time
  2. res = data[['No1', 'No2']][((data['No1'] > 0.5) | (data['No1'] < -0.5))
  3. & ((data['No2'] < -1) | (data['No2'] > 1))]

PyTable的快速I/O

HDF5数据库/文件标准。

"无压缩" 创建一个大表

表定义

  1. import numpy as np
  2. import tables as tb
  3. import datetime as dt
  4. import matplotlib.pyplot as plt
  5. %matplotlib inline
  6.  
  7. filename = './data/tab.h5'
  8. h5 = tb.open_file(filename, 'w')
  9.  
  10. # 有几行:多搞几行,弄一个大表
  11. rows = 2000000
  12.  
  13. # 有几列
  14. row_des = {
  15. 'Date': tb.StringCol(26, pos=1),
  16. 'No1': tb.IntCol(pos=2),
  17. 'No2': tb.IntCol(pos=3),
  18. 'No3': tb.Float64Col(pos=4),
  19. 'No4': tb.Float64Col(pos=5)
  20. }

创建表

  1. filters = tb.Filters(complevel=0) # no compression
  2.  
  3. tab = h5.create_table('/', 'ints_floats', row_des,
  4. title='Integers and Floats',
  5. expectedrows=rows, filters=filters)

新增数据

此时,表还在内存中,向这个表内添加数据。

(1) 一个关键的列表形式。

  1. pointer = tab.row

(2) 生成随机数填充。

  1. ran_int = np.random.randint(0, 10000, size=(rows, 2))
  2. ran_flo = np.random.standard_normal((rows, 2)).round(5)

(3) 赋值给内存中的表。

传统策略,使用了繁琐的循环。

  1. %%time
  2. for i in range(rows):
  3. pointer['Date'] = dt.datetime.now()
  4. pointer['No1'] = ran_int[i, 0]
  5. pointer['No2'] = ran_int[i, 1]
  6. pointer['No3'] = ran_flo[i, 0]
  7. pointer['No4'] = ran_flo[i, 1]
  8. pointer.append()
  9. # this appends the data and
  10. # moves the pointer one row forward

  11. tab.flush()   # 相当于SQLITE3中的commit命令

矩阵策略,省掉了循环。

  1. %%time
  2. sarray['Date'] = dt.datetime.now()
  3. sarray['No1'] = ran_int[:, 0]
  4. sarray['No2'] = ran_int[:, 1]
  5. sarray['No3'] = ran_flo[:, 0]
  6. sarray['No4'] = ran_flo[:, 1]

“压缩” 创建一个大表

创建压缩表

因rows中其实已经有了数据,所以创建的同时就同步写入文件。

  1. filename = './data/tab.h5c'
  2. h5c = tb.open_file(filename, 'w')
  3. filters = tb.Filters(complevel=4, complib='blosc')
  4.  
  5. tabc = h5c.create_table('/', 'ints_floats', sarray,
  6. title='Integers and Floats',
  7. expectedrows=rows, filters=filters)

dnarray读取

读取内存数据,返回 numpy.ndarray。

  1. %time arr_com = tabc.read()
  2. h5c.close()

内存外计算

比如,处理一个若干GB的数组。

创建一个外存数组 EArray

  1. filename = './data/array.h5'
  2. h5 = tb.open_file(filename, 'w')
  3.  
  4. n = 100
  5. ear = h5.create_earray(h5.root, 'ear',
  6. atom=tb.Float64Atom(),
  7. shape=(0, n))
  8.  
  9. %%time
  10. rand = np.random.standard_normal((n, n))
  11. for i in range(750):
  12. ear.append(rand)
  13. ear.flush()
  14.  
  15. ear.size_on_disk  # 查看一下,这个E Array是个大数组

创建一个对应的 EArray

第一步、设置外存 workspace。

  1. out = h5.create_earray(h5.root, 'out', atom=tb.Float64Atom(), shape=(0, n))

第二步、通过外存来计算ear大数组。

  1. expr = tb.Expr('3 * sin(ear) + sqrt(abs(ear))')    # 这里是 import tables as tb 中的 Expr,而不是import numexpr as ne
  2. # the numerical expression as a string object
  3.  
  4. expr.set_output(out, append_mode=True)
  5. # target to store results is disk-based array
  6.  
  7. %time expr.eval()
  8. # evaluation of the numerical expression
  9. # and storage of results in disk-based array

第三步、从外存读入内存,传的自然是“变量“,而非”workspace"。

  1. %time imarray = ear.read()
  2. # read whole array into memory

  

End.

[Pandas] 04 - Efficient I/O的更多相关文章

  1. Pandas | 04 Panel 面板

    面板(Panel)是3D容器的数据.面板数据一词来源于计量经济学,部分源于名称:Pandas - pan(el)-da(ta)-s. 3轴(axis)这个名称旨在给出描述涉及面板数据的操作的一些语义. ...

  2. [AI] 深度数据 - Data

    Data Engineering Data  Pipeline Outline [DE] How to learn Big Data[了解大数据] [DE] Pipeline for Data Eng ...

  3. Ubuntu下安装python相关数据处理

    01. Ubuntu下安装ipython sudo apt-get install ipython 02. Ubuntu下安装pip $ sudo apt-get install python-pip ...

  4. 数据分析04 /基于pandas的DateFrame进行股票分析、双均线策略制定

    数据分析04 /基于pandas的DateFrame进行股票分析.双均线策略制定 目录 数据分析04 /基于pandas的DateFrame进行股票分析.双均线策略制定 需求1:对茅台股票分析 需求2 ...

  5. 04. Pandas 3| 数值计算与统计、合并连接去重分组透视表文件读取

    1.数值计算和统计基础 常用数学.统计方法 数值计算和统计基础 基本参数:axis.skipna df.mean(axis=1,skipna=False)  -->> axis=1是按行来 ...

  6. Ubuntu16.04下安装配置numpy,scipy,matplotlibm,pandas 以及sklearn+深度学习tensorflow配置+Keras2.0.6(非Anaconda环境)

    1.ubuntu镜像源准备(防止下载过慢): 参考博文:http://www.cnblogs.com/top5/archive/2009/10/07/1578815.html 步骤如下: 首先,备份一 ...

  7. ubuntu16.04安装python3,numpy,pandas等量化计算库

    ubunt安装python3 sudo add-apt-repository ppa:fkrull/deadsnakessudo apt-get updatesudo apt-get install ...

  8. Desktop Ubuntu 14.04LTS/16.04科学计算环境配置

    Desktop Ubuntu 14.04LTS/16.04科学计算环境配置 计算机硬件配置 cpu i5 6代 内存容量 8G gpu GTX960 显存容量 2G(建议显存在4G以上,否则一些稍具规 ...

  9. pandas基础-Python3

    未完 for examples: example 1: # Code based on Python 3.x # _*_ coding: utf-8 _*_ # __Author: "LEM ...

随机推荐

  1. 自定义genericUDF demo

    package cn.com.dtmobile.hiveUdf; import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import ...

  2. Jmeter接口自动化实例(使用Beanshell保存csv文件、csv参数化、setUp线程组)

    很久没更新博客了,荒废了很久了,今天更新一下博客,主要记录一下子最近遇到的问题和解决方法:blonde_woman: 这篇文章主要记录的是jmeter批量跑接口中遇到的各种疑难,主要涉及到的问题如下 ...

  3. 程序与CPU

    CPU中共有四大组件: 寄存器 控制器 运算器 时钟 寄存器:存取数值(存东西的) 控制器:负责将内存(寄存器)中的数据进行读入和写出(控制寄存器 协调者) 运算器:里面是逻辑运算单元,协助寄存器和控 ...

  4. Linux内核DTB文件启动的几种方式

      版权:  凌云物网智科实验室< www.iot-yun.com > 声明:  本文档由凌云物网智科实验室郭工编著! 作者:  郭文学< QQ: 281143292  guowen ...

  5. Python数据分析之pandas基本数据结构:Series、DataFrame

    1引言 本文总结Pandas中两种常用的数据类型: (1)Series是一种一维的带标签数组对象. (2)DataFrame,二维,Series容器 2 Series数组 2.1 Series数组构成 ...

  6. 老司机也晕车--java字符串String晕车之旅

    首先声明,有晕车经历的司机请自备药物,String也可能让你怀疑人生! 第一道 开胃菜 请听题!第一道题: String hello="hello world!"; String ...

  7. 第8章 浏览器对象模型BOM 8.2 location对象

    location 是最有用的 BOM对象之一,它提供了与当前窗口中加载的文档有关的信息,还提供了一些导航功能.事实上, location 对象是很特别的一个对象,因为它既是 window 对象的属性, ...

  8. P2518 [HAOI2010]计数 类似数位dp

    题意 你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数.比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1020,等等. 现 ...

  9. CodeForces 402 E Strictly Positive Matrix

    Strictly Positive Matrix 题解: 如果原来的 a[i][j] = 0, 现要 a[i][j] = 1, 那么等于 sum{a[i][k] + a[k][j]} > 1. ...

  10. hdu 1890 Robotic SortI(splay区间旋转操作)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1890 题解:splay又一高级的功能,区间旋转这个是用线段树这些实现不了的,这题可以学习splay的旋 ...