PythonPandasMatplotlib初探数据分析
大数据测试,说来进入这块领域也快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
小结
今天分享的数据分析内容比较基础,主要是将学到的技能与业务相结合的初步探索,后续还需要不断探索与学习,将学习到的技能加以思考并运用到实际项目业务中,如此方能走得更远。