前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python + Pandas + Matplotlib初探数据分析

Python + Pandas + Matplotlib初探数据分析

作者头像
Wu_Candy
发布2022-07-04 21:29:15
3670
发布2022-07-04 21:29:15
举报
文章被收录于专栏:无量测试之道

大数据测试,说来进入这块领域也快2年半了。每天工作的内容是验证数据表的逻辑正确性。

最近偶有所思,数据测试能否更进一步?如何利用已有技能对海量数据进行全面分析,找出数据质量问题或协助数据分析师发现逻辑漏洞?

再或者,能否向数据分析师转型呢?想得很多,思绪有些杂乱。于是我冷静了下,不再空想。我先做点东西出来看看,再评估下自己是否有这个能力和资质。

花了1个星期的时间,学习了 Python 的 Pandas 模块,按照学习示例一边学习一边实操,慢慢地感觉就来了。对 Pandas 有了基本的认知后,我在寻找一个突破点,我想我不能一直只是这样按照示例代码敲下去,毫无意义。

我得将所学的 Pandas 知识结合公司现有的业务进行运用。刚开始至少能简单地开始对某张数据表的某个指标进行数据分析。于是我按照这样的想法对 test.test_resv001_room_daily_df 表的 number_of_room_nights 指标开始了数据分析的探索。

1、hivesql数据准备

代码语言:javascript
复制
#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、代码实现

代码语言:javascript
复制
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的数据结构查询结果

代码语言:javascript
复制
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)输出结果

代码语言:javascript
复制
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生成趋势图

代码语言:javascript
复制
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文件

代码语言:javascript
复制
#print(df)输出结果为dataframe数据类型
df.to_csv('room_nts.csv')

room_nts.csv内容如下:

7、读取csv文件中dataframe数据

代码语言:javascript
复制
room_nts = pd.read_csv('room_nts.csv')
#print(room_nts)
代码语言:javascript
复制
   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中

代码语言:javascript
复制
df.to_excel('room_nts.xlsx', sheet_name='room_nts')

room_nts.xlsx文件中sheet_name为room_nts的内容如下:

9、从excel中读取dataframe多维数据

代码语言:javascript
复制
excel_read_result = pd.read_excel('room_nts.xlsx', sheet_name='room_nts', index_col=None, na_values=['NA'])
print(excel_read_result)
代码语言:javascript
复制
   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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 无量测试之道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档