MySQL 创建数据库数据表

-- 创建库
CREATE database if not exists game_operantion;
USE game_operantion;
-- 创建表/用户表
CREATE TABLE if not exists user_info(
	user_id int auto_increment PRIMARY KEY,
	user_name varchar(20) not null, -- 用户名
	level int not null DEFAULT(1), -- 等级
	lastLoginTime DATE NOT NULL -- 登录时间
);
-- 创建表/充值表
CREATE TABLE if not exists recharge_info(
	r_id int auto_increment PRIMARY KEY,
	user_id int not null,
	r_money decimal(10,2) not null, -- 金额
	r_date date not null, -- 充值日期
	foreign key (user_id) REFERENCES user_info(user_id)
); 
INSERT INTO user_info (user_name, level,lastLoginTime)
VALUES
('玩家1', 25, '2025-08-10'),
('玩家2', 55, '2025-08-10'),  -- 高等级用户
('玩家3', 18, '2025-08-11'),
('玩家4', 42, '2025-08-11'),
('玩家5', 60, '2025-08-12'),  -- 高等级用户
('玩家6', 33, '2025-08-12'),
('玩家7', 22, '2025-08-13'),
('玩家8', 58, '2025-08-16'),  -- 高等级用户
('玩家9', 15, '2025-08-14'),
('玩家10', 45, '2025-08-14'),
('玩家11', 30, '2025-08-10'),
('玩家12', 28, '2025-08-11'),
('玩家13', 52, '2025-08-12'),  -- 高等级用户
('玩家14', 40, '2025-08-13'),
('玩家15', 35, '2025-08-14'),
('玩家16', 20, '2025-08-16'),
('玩家17', 12, '2025-08-11'),
('玩家18', 48, '2025-08-12'),
('玩家19', 38, '2025-08-13'),
('玩家20', 55, '2025-08-17');  -- 高等级用户

-- 插入充值数据(5个用户有充值,金额10-200元)
INSERT INTO recharge_info (user_id, r_money, r_date)
VALUES
(2, 150.00, '2025-08-10'),   -- 玩家2(高等级+充值)
(5, 80.00, '2025-08-12'),    -- 玩家5(高等级+充值)
(8, 2000.00, '2025-08-16'),   -- 玩家8(高等级+高充值)
(13, 120.00, '2025-08-12'),  -- 玩家13(高等级+充值)
(20, 90.00, '2025-08-14');   -- 玩家20(高等级+充值)

python

import pymysql
import pandas as pd
import matplotlib.pyplot as plt
# 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文显示为 SimHei(宋体)
plt.rcParams['axes.unicode_minus'] = False    # 解决负号显示为方块的问题
# 连接数据库
conn=pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='123456',
    database='game_operantion',
    # charset='utf-8'
)
# 计算每日活跃用户数
def get_dau():
    sql="""
    select
        date(lastLoginTime) as 登录日期,
        COUNT(user_id) as 活跃用户数
    from user_info
    group by 登录日期
    order by 登录日期;
    """
    return pd.read_sql(sql,conn, index_col=None)
# 查询等级>50 充值价格>100的用户id 用户名
def get_hight_users():
     sql="""
     select 
        u.user_id as 用户id,
        u.user_name as 用户名,
        u.level as 等级,
        ifnull(sum(r.r_money),0) as 总充值
    from user_info u
    left join recharge_info r on u.user_id = r.user_id
    group by u.user_id
    having 等级>50 or 总充值 > 100
    order by 总充值 desc;
     """
     return pd.read_sql(sql,conn, index_col=None)
 # 数据可视化
def show_charts(dau_data, high_value_data):
    plt.figure(figsize=(15,7))
    # 将画布划分为1行2列的子图布局
    # 操作第1个子图
    plt.subplot(1,2,1)
    # dau_data['日期']作为x轴数据(日期),dau_data['活跃用户数']作为y轴数据(活跃用户数量),
    # 'bo-'表示绘制的点为蓝色(b)圆形(o),并使用实线(-)连接这些点。
    plt.plot(dau_data['登录日期'],dau_data['活跃用户数'],'bo-')
    # plt.plot(dau_data['登录日期'], dau_data['活跃用户数'], 'r*--')  # 红星虚线
    # plt.plot(dau_data['登录日期'], dau_data['活跃用户数'], 'g^-')   # 绿三角实线
    plt.title('每日活跃用户人数')
    plt.xticks(rotation=45)
    # 操作第2个子图
    plt.subplot(1,2,2)
    plt.bar(high_value_data['用户名'],high_value_data['总充值'],color='pink')
    plt.title('高充值玩家数据')
    plt.xticks(rotation=90,fontsize=10)
    # :自动优化子图的布局
    plt.tight_layout()
    plt.show()
if __name__ == '__main__':
    d=get_dau()
    h=get_hight_users()
    print("每日活跃用户数量")
    print(d)
    print("\n高充值用户列表")
    print(h)
    # 调用show_charts函数,传入获取到的两个DataFrame数据,绘制并显示可视化图表。
    show_charts(d,h)
    conn.close()

效果图

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐