数据分析--数据采集方法

数据采集方法

本文主要是个人学习过程中记录的笔记,此部分内容包括常见的数据文件的存储和读取,通常在使用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_ 操作可不仅仅是加载数据文件这么简单,它带有的一些参数可以实现更加个性化的读取结果。我们以 的 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格式

posted @ 2023-10-31 17:46  Pennaa  阅读(34)  评论(0编辑  收藏  举报