知识基础
- Pandas包基础:pd.read_csv
- 正则表达式基础
报告自动化对数据的质量有着更高的要求,但是实际情况中出现错漏是非常正常的,而我们不仅仅应该在出现问题后修复bug,在最开始就应该做好尽可能严格的规定并作出意外情况的报告和处理。
读取CSV文件
csv文件是我们常用的数据源,在此我们以csv文件为例
首先我们可以查看要读取数据内容
import pandas as pd
import numpy as np
# 可以发现第8行才是头部,于是设置header参数
data = pd.read_csv('data.csv', header=7, index_col=0)
data.head()
对读取目标列进行格式规定
data.dtypes
Product Name object
Brand object
Price object
Category object
Rank object
Sales object
Revenue object
Reviews int64
Rating object
Seller object
LQS object
ASIN object
Link object
dtype: object
可以看到在列:Price, Rank, Sales, Revenue, Reviews, Rating, LQS都应该是数值,但是只有Review列被默认读取为数值
使用dtype进行格式规定
dtype = {'#':int,
'Product Name':str,
'Brand':str,
'Price':float,
'Category':str,
'Rank':int,
'Sales':int,
'Revenue':int,
'Reviews':int,
'Rating':float,
'Seller':str,
'LQS':int,
'ASIN':str,
'Link':str
}
try:
data = pd.read_csv('data.csv', dtype=dtype, header=7, index_col=0)
except BaseException as e:
print(e)
invalid literal for int() with base 10: '1,067'
可以看到使用dtype并不能直接忽略非数字符号进行转换,我们需要更强的格式规定
使用converters进行格式转化
import re
# 使用正则表达式进行数字提取
def str2num(string):
if not isinstance(string, str):
string = str(string)
string = string.replace(',','')
regular_expression = '\d+\.?\d*'
pattern = re.compile(regular_expression)
match = pattern.search(string)
if match:
return float(match.group())
else:
return float('nan')
converters = {'Price':str2num,
'Rank':str2num,
'Rating':str2num,
'Sales':str2num,
'Revenue':str2num,
'Reviews':str2num
}
try:
data = pd.read_csv('data.csv', converters=converters, header=7, index_col=0)
except BaseException as e:
print(e)
data.head()
把不同的数据处理函数解耦,分别把str2num放入tools模块,数据读取放入datapipeline模块