大数据测试,说来进入这块领域也快2年半了。每天工作的内容是验证数据表的逻辑正确性。
最近偶有所思,数据测试能否更进一步?如何利用已有技能对海量数据进行全面分析,找出数据质量问题或协助数据分析师发现逻辑漏洞?
再或者,能否向数据分析师转型呢?想得很多,思绪有些杂乱。于是我冷静了下,不再空想。我先做点东西出来看看,再评估下自己是否有这个能力和资质。
花了1个星期的时间,学习了 Python 的 Pandas 模块,按照学习示例一边学习一边实操,慢慢地感觉就来了。对 Pandas 有了基本的认知后,我在寻找一个突破点,我想我不能一直只是这样按照示例代码敲下去,毫无意义。
我得将所学的 Pandas 知识结合公司现有的业务进行运用。刚开始至少能简单地开始对某张数据表的某个指标进行数据分析。于是我按照这样的想法对 test.test_resv001_room_daily_df 表的 number_of_room_nights 指标开始了数据分析的探索。
1、hivesql数据准备
#test_sql
select hotel_code_new
,substr(stay_date,1,7) as stay_date
,sum(number_of_room_nights) as room_nts
from test.test_resv001_room_daily_df
where dt='2021-08-31'
and hotel_code_new in('CNSZV002','CWH','CWSW','ESL','FIJ')
and resv_status in('CHECKED IN','CHECKED OUT')
and substr(stay_date,1,7) in ('2019-01','2019-02','2019-03','2019-04','2019-05','2019-06','2019-07','2019-08','2019-09','2019-10','2019-11','2019-12')
group by hotel_code_new,substr(stay_date,1,7)
order by hotel_code_new,substr(stay_date,1,7)
hivesql内容说明:
从上面的 hivesql 语句可以看出,这条 sql 的目的是查询出 hotel_code_new 为 'CNSZV002','CWH','CWSW','ESL','FIJ' 在2019年各个月份的 number_of_room_nights 指标总和,按照 hotel_code_new 和月份作分组和排序。
2、代码实现
from impala.dbapi import connect
import warnings
import pandas as pd
import matplotlib.pyplot as plt
hive_sql = test_sql#1中数据准备的hivesql语句
def hive_connect(sql):
warnings.filterwarnings('ignore')
config_hive_beta = {
'host': '10.7.89.01', #hive的host地址
'port': 10000, #hive的端口号
'user': 'hive001', #hive的username
'password': 'hive001', #hive的password
'database': 'tmp', #hive中需要查询的数据库名
'auth_mechanism': 'PLAIN' #hive的hive-site.xml配置文件中获取
}
conn = connect(**config_hive_beta)
cursor = conn.cursor()
cursor.execute(sql)
hive_all_data = cursor.fetchall()
return hive_all_data
all_data = hive_connect(test_sql)
CNSZV002_dt = []
CWH_dt = []
CWSW_dt = []
ESL_dt = []
FIJ_dt = []
CNSZV002_data = []
CWH_data = []
CWSW_data = []
ESL_data = []
FIJ_data = []
for i in range(len(all_data)):
if all_data[i][0] == 'CNSZV002':
CNSZV002_data.append(all_data[i][2])
CNSZV002_dt.append(all_data[i][1])
elif all_data[i][0] == 'CWH':
CWH_data.append(all_data[i][2])
CWH_dt.append(all_data[i][1])
elif all_data[i][0] == 'CWSW':
CWSW_data.append(all_data[i][2])
CWSW_dt.append(all_data[i][1])
elif all_data[i][0] == 'ESL':
ESL_data.append(all_data[i][2])
ESL_dt.append(all_data[i][1])
elif all_data[i][0] == 'FIJ':
FIJ_data.append(all_data[i][2])
FIJ_dt.append(all_data[i][1])
i0_a = pd.MultiIndex.from_tuples([("CNSZV002", x) for x in CNSZV002_dt], names=['dt', ''])
i0_b = pd.MultiIndex.from_tuples([("CWH", x) for x in CWH_dt], names=['dt', ''])
i0_c = pd.MultiIndex.from_tuples([("CWSW", x) for x in CWSW_dt], names=['dt', ''])
i0_d = pd.MultiIndex.from_tuples([("ESL", x) for x in ESL_dt], names=['dt', ''])
i0_e = pd.MultiIndex.from_tuples([("FIJ", x) for x in FIJ_dt], names=['dt', ''])
df0_a = pd.DataFrame(CNSZV002_data, index=i0_a)
df0_b = pd.DataFrame(CWH_data, index=i0_b)
df0_c = pd.DataFrame(CWSW_data, index=i0_c)
df0_d = pd.DataFrame(ESL_data, index=i0_d)
df0_e = pd.DataFrame(FIJ_data, index=i0_e)
df = pd.concat([df0_a, df0_b, df0_c, df0_d, df0_e])
df = df.unstack('dt').fillna(0)
df.columns = df.columns.droplevel()
print(df)
3、hive数据库all_data的数据结构查询结果
all_data = [('CNSZV002', '2019-06', 2353), ('CNSZV002', '2019-07', 2939), ('CNSZV002', '2019-08', 5148),
('CNSZV002', '2019-09', 3850), ('CNSZV002', '2019-10', 4973), ('CNSZV002', '2019-11', 5467),
('CNSZV002', '2019-12', 4742), ('CWH', '2019-01', 11023), ('CWH', '2019-02', 9824),
('CWH', '2019-03', 13737), ('CWH', '2019-04', 14603), ('CWH', '2019-05', 14061), ('CWH', '2019-06', 12839),
('CWH', '2019-07', 14638), ('CWH', '2019-08', 14457), ('CWH', '2019-09', 11648), ('CWH', '2019-10', 14387),
('CWH', '2019-11', 13758), ('CWH', '2019-12', 11461), ('CWSW', '2019-01', 5914), ('CWSW', '2019-02', 4434),
('CWSW', '2019-03', 6003), ('CWSW', '2019-04', 6611), ('CWSW', '2019-05', 6586), ('CWSW', '2019-06', 5840),
('CWSW', '2019-07', 6624), ('CWSW', '2019-08', 7001), ('CWSW', '2019-09', 5792), ('CWSW', '2019-10', 6898),
('CWSW', '2019-11', 6944), ('CWSW', '2019-12', 5404), ('ESL', '2019-01', 11008), ('ESL', '2019-02', 11605),
('ESL', '2019-03', 14493), ('ESL', '2019-04', 12231), ('ESL', '2019-05', 13571), ('ESL', '2019-06', 12307),
('ESL', '2019-07', 13777), ('ESL', '2019-08', 12866), ('ESL', '2019-09', 13276), ('ESL', '2019-10', 13223),
('ESL', '2019-11', 14580), ('ESL', '2019-12', 13050), ('FIJ', '2019-01', 5855), ('FIJ', '2019-02', 2660),
('FIJ', '2019-03', 3511), ('FIJ', '2019-04', 7763), ('FIJ', '2019-05', 7254), ('FIJ', '2019-06', 10641),
('FIJ', '2019-07', 11297), ('FIJ', '2019-08', 11672), ('FIJ', '2019-09', 10737), ('FIJ', '2019-10', 11867),
('FIJ', '2019-11', 10042), ('FIJ', '2019-12', 8412)]
4、代码实现2中的print(df)输出结果
dt CNSZV002 CWH CWSW ESL FIJ
2019-01 0.0 11023.0 5914.0 11008.0 5855.0
2019-02 0.0 9824.0 4434.0 11605.0 2660.0
2019-03 0.0 13737.0 6003.0 14493.0 3511.0
2019-04 0.0 14603.0 6611.0 12231.0 7763.0
2019-05 0.0 14061.0 6586.0 13571.0 7254.0
2019-06 2353.0 12839.0 5840.0 12307.0 10641.0
2019-07 2939.0 14638.0 6624.0 13777.0 11297.0
2019-08 5148.0 14457.0 7001.0 12866.0 11672.0
2019-09 3850.0 11648.0 5792.0 13276.0 10737.0
2019-10 4973.0 14387.0 6898.0 13223.0 11867.0
2019-11 5467.0 13758.0 6944.0 14580.0 10042.0
2019-12 4742.0 11461.0 5404.0 13050.0 8412.0
手工校对通过,与 hivesql 输出结果一致。
5、将dataframe数据结构的df数据使用plot生成趋势图
df = df.cumsum()
plt.figure()
df.plot()
#df.plot(kind='bar')
plt.legend(loc='best')
plt.show()
调用df.plot()不带任何参数的趋势图如下:
上述折线图表示:当前月份值及历史月份值的累加和。
调用df.plot(kind='bar')时加上参数kind='bar'的趋势图如下:
上述柱状图表示:当前月份值及历史月份值的累加和。
两个图只是展示形式上的区别,都能在一定程度上体现2019年12个月份每个不同 hotel_code_new 当前月份与历史月份 number_of_room_nights 值的累加和的数据分布情况,可以说是一个简单的数据分析。
6、将dataframe数据写入csv文件
#print(df)输出结果为dataframe数据类型
df.to_csv('room_nts.csv')
room_nts.csv内容如下:
7、读取csv文件中dataframe数据
room_nts = pd.read_csv('room_nts.csv')
#print(room_nts)
Unnamed: 0 CNSZV002 CWH CWSW ESL FIJ
0 2019-01 0.0 11023.0 5914.0 11008.0 5855.0
1 2019-02 0.0 9824.0 4434.0 11605.0 2660.0
2 2019-03 0.0 13737.0 6003.0 14493.0 3511.0
3 2019-04 0.0 14603.0 6611.0 12231.0 7763.0
4 2019-05 0.0 14061.0 6586.0 13571.0 7254.0
5 2019-06 2353.0 12839.0 5840.0 12307.0 10641.0
6 2019-07 2939.0 14638.0 6624.0 13777.0 11297.0
7 2019-08 5148.0 14457.0 7001.0 12866.0 11672.0
8 2019-09 3850.0 11648.0 5792.0 13276.0 10737.0
9 2019-10 4973.0 14387.0 6898.0 13223.0 11867.0
10 2019-11 5467.0 13758.0 6944.0 14580.0 10042.0
11 2019-12 4742.0 11461.0 5404.0 13050.0 8412.0
8、将dataframe多维数据存储到excel中
df.to_excel('room_nts.xlsx', sheet_name='room_nts')
room_nts.xlsx文件中sheet_name为room_nts的内容如下:
9、从excel中读取dataframe多维数据
excel_read_result = pd.read_excel('room_nts.xlsx', sheet_name='room_nts', index_col=None, na_values=['NA'])
print(excel_read_result)
Unnamed: 0 CNSZV002 CWH CWSW ESL FIJ
0 2019-01 0 11023 5914 11008 5855
1 2019-02 0 9824 4434 11605 2660
2 2019-03 0 13737 6003 14493 3511
3 2019-04 0 14603 6611 12231 7763
4 2019-05 0 14061 6586 13571 7254
5 2019-06 2353 12839 5840 12307 10641
6 2019-07 2939 14638 6624 13777 11297
7 2019-08 5148 14457 7001 12866 11672
8 2019-09 3850 11648 5792 13276 10737
9 2019-10 4973 14387 6898 13223 11867
10 2019-11 5467 13758 6944 14580 10042
11 2019-12 4742 11461 5404 13050 8412
小结
今天分享的数据分析内容比较基础,主要是将学到的技能与业务相结合的初步探索,后续还需要不断探索与学习,将学习到的技能加以思考并运用到实际项目业务中,如此方能走得更远。
end