数据分析--数据采集方法
数据采集方法
本文主要是个人学习过程中记录的笔记,此部分内容包括常见的数据文件的存储和读取,通常在使用Python读取数据文件比较推荐Pandas模块,当然在对Excel进行读取和操作时也可以配合openpyxl
,xlwings
等。由于此前是使用JupyterNotebook
进行编写和学习的,如果使用其它工具来观察文中的案例结果可能还需要你使用print
来打印。
Excel和CSV文件
-
Excel 表格有最大的行数存储限制(16,384列 x 1,048,576行)
-
CSV 是通过字符分隔数据并以纯文本形式存储,无最大行数的存储限制
下面是对简单的文件读写操作:
import numpy as np
import pandas as pd
# 生成示例数据
df = pd.DataFrame({'A':np.random.randn(10), 'B':np.random.randn(10)})
# 写入为Excel和CSV文件
df.to_csv('test.csv',index=None)
df.to_excel('test.xlsx',index=None)
print("*****实例文件写入成功*****")
-
接下来是对文件的读取操作,注意读取Excel文件时,首先需要在运行环境中安装
openpyxl
模块,否则会报错pd.read_csv('test.csv') pd.read_excel('test.xlsx')
HDF5格式
-
HDF
(Hierarchical Data Format) 一种为存储和处理大容量科学数据设计的文件格式及相应库文件 -
HDF5
格式的特点在于能存储多个数据集,并支持metadata
-
包含两种基本数据对象:
- 群组(group):类似文件夹,可以包含多个数据集或下级群组
- 数据集(dataset):数据内容,可以是多维数组,也可以是更复杂的数据类型
-
该文件格式还能被Java,MATLAB,Octave,,Julia,R等语言或商业软件支持
-
存储和读取
HDF5
文件需要安装模块PyTables
,安装命令为:pip install tables
-
下列存储示例数据时,
df2
后面指定format='table'
参数。这是因为,HDF
支持两种存储架构:fixed 和 table。默认为fixed
,因为其读取速度更快,但是table
却支持查询操作df1 = pd.DataFrame({'A': np.random.randn(10), 'B': np.random.randn(10)}) # 随机数据 df2 = pd.DataFrame({'C': np.random.randn(10), 'D': np.random.randn(10)}) # 随机数据 df1.to_hdf('test.h5', key='df1') # 存储 df1 df2.to_hdf('test.h5', key='df2', format='table') # 存储 df2 pd.read_hdf('test.h5',key='df1') # 读取 pd.read_hdf('test.h5',key='df2',where=['index < 5']) # 查询df2中index<5的数据
JSON
-
JSON
(JavaScript Object Nation) 属于JavaScript的一个子集,但它是独立于语言的文本格式 -
JSON
的官方MIME类型是application/json
,文件扩展名是.json
-
HTTP请求过程中的标准数据格式
# JSON的示例数据
obj = """
[
{
"aqi": 46,
"area": "成都",
"pm2_5": 32,
"pm2_5_24h": 33,
"position_name": "金泉两河",
"primary_pollutant": null,
"quality": "优",
"station_code": "1431A",
"time_point": "2018-09-05T09:00:00Z"
},
{
"aqi": 29,
"area": "成都",
"pm2_5": 20,
"pm2_5_24h": 26,
"position_name": "十里店",
"primary_pollutant": null,
"quality": "优",
"station_code": "1432A",
"time_point": "2018-09-05T09:00:00Z"
}
]
"""
-
JSON
数据中的key
必须是字符串类型,缺失值用null
表示 -
Pandas中的
read_json
往往能直接把JSON
解析为DataFrame
pd.read_json(obj)
-
JSON
支持复杂嵌套,用上面方法读取不一定回是我们想要的,某些键值以列表或字典存在,此时就需要换种工具解析 -
使用内建库
json
,将其转换为Python的数据类型(Python Object),json.loads(obj)
import json
obj = json.loads(obj)
obj
- 然后就可以使用Python对字典、列表的方法来处理
obj[0]['position_name']
# 将Python Object 转换为JSON类型
json.dumps(obj)
read_
操作参数详解
- Pandas 中的
read_
操作可不仅仅是加载数据文件这么简单,它带有的一些参数可以实现更加个性化的读取结果。我们以pandas.read_csv()
的 API 为例。
pandas.read_csv(filepath_or_buffer, sep=', ', delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, iterator=False, chunksize=None, compression='infer', thousands=None, decimal=b'.', lineterminator=None, quotechar='"', quoting=0, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=None, error_bad_lines=True, warn_bad_lines=True, skipfooter=0, doublequote=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None)
path
:路径不仅仅可以读取本地文件,还支持远程 URL 链接。sep
:支持按特定字符分割。header
:可以指定某一行为列名,默认是第一行。names
:自定义列名。skiprows
:指定忽略某些行。na_values
:对空值进行指定替换操作。parse_dates
:尝试将数据解析为日期。nrows
:读取指定行数的数据。chunksize
:指定分块读取数据大小。encoding
:指定文件编码。
# 读取CSV文件忽略前四行
pd.read_csv("test.csv",skiprows=range(1,5))
分块读取数据
-
直接读取一个 GB 级别的
CSV
文件时,不仅速度很慢,还有可能因为内存不足而报错。此时,通过分块读取的方式加载数据文件就非常方便了 -
通过上面的
read_
参数可以看出,分块读取需要指定chunksize
,也就是每一块的大小
'''
chunker 返回的 pandas.io.parsers.TextFileReader`是一个可迭代对象。你可以通过 `get_chunk() 逐次返回每一个块状数据的内容
'''
chunker = pd.read_csv("test.csv", chunksize=2)
chunker.get_chunk() # 迭代返回分块数据内容
'''多次迭代后返回的分块内容超过文件大小会报错'''
下面是一个数据文件读取转换的案例:
import pandas as pd
def conver(file):
fileobj = open(file)
filedata = fileobj.read()
jsondata = json.loads(filedata)[:1000]
df = pd.DataFrame(jsondata)
df.to_hdf("convert.h5",key='data')
上述代码中的convert()
函数功能是读取JSON
文件前1000行然后转为HDF5
格式