数据分析--数据采集方法
数据采集方法
本文主要是个人学习过程中记录的笔记,此部分内容包括常见的数据文件的存储和读取,通常在使用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格式
浙公网安备 33010602011771号