数据人学习平台上线了:www.shujurenclub.com
作者介绍
01
工作场景
希望将效果广告业务的历史每日的曝光量、点击量、转化量、CTR、CVR等指标,以Excel附件的格式发送给业务同学
02
任务分解
1、数据获取
数据获取方式可能有:
1)连接hive或者mysql 数据库进行查询;
2)访问API接口查询
2、数据存储到csv或者xlsx文件
3、发送邮件
4、定时执行以上任务,并打印执行日志,以便后续问题追溯 (本文亮点)
03
具体代码
1、下载安装PyCharm软件,并安装相关包,将以下代码调试成功后,保存为.py文件
## 将以下脚本保存为dailyreport.py
class DailyReport
import os
import sys
import pymysql
import pandas as pd
import numpy as np
from datetime import datetime
from openpyxl import Workbook
from openpyxl import load_workbook
##连接mysql 数据库进行查询
def __init__(self):
# 初始化 mysql 链接参数
self.ad_host = Config.ad_host # 数据库的ip地址
self.ad_user = Config.ad_user # 数据库的账号
self.ad_password = Config.ad_password # 数据库的密码
self.ad_port = Config.ad_port # mysql数据库通用端口号
self.ad_db = Config.ad_db # 数据库
self.last_day = datetime.now().date() - timedelta(days=1) #昨日日期
self.sql = """ select
day,sum(pv) as pv,sum(click) as click,sum(conv) as conv
from report
where day >= '2024-01-01'
and day < CURRENT_DATE()
group by day """
def read_mysql_data(self):
df_ad = pd.DataFrame()
verify_flag = True
while verify_flag:
# 1. 建立数据库的连接信息
mysql_ad = pymysql.connect(host=self.ad_host, user=self.ad_user,
password=self.ad_password,
port=self.ad_port, db=self.ad_db, charset='utf8mb4')
# 2. 编写sql
sql = self.sql1
# 3. 通过 pd 读取 数据库数据为 df_ad
df_ad = pd.read_sql(sql, mysql_ad)
# 验证是否有昨天数据
df_verify = df_ad[df_ad['day'] == self.last_day]
if not df_verify.empty:
print('今日已有昨天 {} 数据,继续执行'.format(self.last_day))
# 5. 使用df做进一步的数据处理
print('mysql查询数据结果:', df_ad)
verify_flag = False
else:
print('今日还没有昨天 {} 数据,程序会等一段时间再试'.format(self.last_day))
time.sleep(1200)
# 4. 关闭数据库连接
mysql_ad.close()
# 5. 使用df_ad 做进一步的数据处理,增加ctr、cvr列
df_ad['ctr'] = round(df_ad['click'] / df['pv'],2)
df_ad['ctr'] = round(df_ad['click'] / df['pv'],2)
print('处理后的数据:',df_ad)
return df_ad
def write_ws(self):
# 创建一个新的Excel工作簿和工作表,从单元格B3开始写入
wb = Workbook()
ws = wb.active
start_col = 2
start_row = 3
for col_idx, (index, row) in enumerate(df_ad.iterrows(), start=start_col):
for row_idx, value in enumerate(row, start=start_row):
ws.cell(row=row_idx, column=col_idx, value=value)
wb.save('ad_daily_report{}.xlsx'.format(datetime.now().date()))
def send_email(self):
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from_addr = 'user@**.com' #发件人邮箱地址
to_addr = '''zhangsan@qq.com,lisi@qq.com''' #发件人地址
subject = '广告数据日报_{}'.format(datetime.now().date())
password = 'password' #发件人邮箱密码
smtp_server = 'mail.**.com' #发件人邮箱smtp
# 创建邮件对象
msg = MIMEMultipart()
msg['From'] = _format_addr(from_name, from_addr)
msg['To'] = _format_addr('To', to_addr)
msg['Subject'] = Header(subject, 'utf-8').encode()
xlsxpart = MIMEApplication(open(r'ad_daily_report{}.xlsx'.format(datetime.now().date()), 'rb').read())
xlsxpart.add_header('Content-Disposition', 'attachment', filename='ad_daily_report{}.xlsx'.format(datetime.now().date()))
msg.attach(xlsxpart)
msg.attach(xlsxpart)
server = smtplib.SMTP(smtp_server, 25)
server.login(from_addr, password)
server.sendmail(from_addr, to_addr.split(','), msg.as_string())
server.quit()
print('发送成功!')
if __name__ == '__main__':
DailyReport
2、新建shell脚本,以将python脚本的执行日志保存
将以下脚本保存为 daily_report.sh 文件,将其保存在与daily_report.py 文件同一目录下,比如
/users/data目录下
#!/bin/sh
## 获取当前sh文件的绝对目录位置的上级目录,并创建log文件
WK_DIR=$(realpath "$(cd "$(dirname "$0")" || return ; pwd)/..")
SCRIPT_DIR=$WK_DIR/script #该目录下放置了该sh文件
SRC_DIR=$WK_DIR/src #该目录下应放置py文件
LOG_DIR=$WK_DIR/log #该目录下应放置log日志
echo $LOG_DIR
today=$(date +"%Y-%m-%d")
now_time=$(date +"%Y-%m-%d %H:%M:%S")
## 检查日志目录是否存在,如果不存在则新建文件夹
if [ ! -d "$LOG_DIR/" ];then
mkdir $LOG_DIR
else
echo ">>> $now_time $LOG_DIR 已经存在!"
fi
## 设置正常和错误日志文件目录,并将名称加上天后缀
log1=$LOG_DIR/log_$today
log2=$LOG_DIR/log_$today
echo ">>> $now_time :开始执行python脚本!" >>$log1
## 设置python解释器
python_url="/data/common/anaconda3/bin/python3"
# 运行程序
$python_url $SRC_DIR/daily.py >>$log1
echo ">>> $now_time :执行结束!" >>$log1
3、使用crontab定时执行
crontab -e #进入终端进入crontab编辑界面
* 9 * * * sh /data/script/daily_report.sh 1>/users/data/log1.log 2>/users/data/log2.log
按下esc,输入qw! 退出编辑页面
crontab -l #进入终端查看crontab命令是否保存成功
想了解更多数据知识,也欢迎阅读畅销书:《数据产品经理修炼手册:从零基础到大数据产品实践》这本书。