当前位置: 首页 > news >正文

SEO数据可视化:用Python做让老板眼前一亮的报告

做SEO汇报,Excel表格没人看。我用Python做了几套可视化方案,把排名、流量、竞品数据变成直观的图表。这篇文章分享代码和最佳实践。

一、为什么需要可视化

数据本身不会说话,可视化让数据说话:

  • 老板看不懂排名表格,但能看懂趋势线
  • 团队记不住数字,但能记住颜色
  • 客户不理解波动,但能理解对比

二、核心可视化方案

2.1 排名趋势图

importmatplotlib.pyplotaspltimportpandasaspdimportsqlite3defplot_ranking_trend(keyword:str,db_path:str):"""绘制排名趋势图"""conn=sqlite3.connect(db_path)df=pd.read_sql(""" SELECT date, rank FROM rankings WHERE keyword = ? ORDER BY date """,conn,params=(keyword,))conn.close()df['date']=pd.to_datetime(df['date'])fig,ax=plt.subplots(figsize=(12,6))# 绘制趋势线ax.plot(df['date'],df['rank'],linewidth=2,color='#2196F3')# 填充区域ax.fill_between(df['date'],df['rank'],alpha=0.3,color='#2196F3')# 反转Y轴(排名越小越好)ax.invert_yaxis()# 添加平均线avg_rank=df['rank'].mean()ax.axhline(y=avg_rank,color='red',linestyle='--',alpha=0.5,label=f'Average:{avg_rank:.1f}')# 样式ax.set_title(f'Ranking Trend: "{keyword}"',fontsize=16,fontweight='bold')ax.set_xlabel('Date',fontsize=12)ax.set_ylabel('Rank',fontsize=12)ax.grid(True,alpha=0.3)ax.legend()plt.tight_layout()plt.savefig(f'ranking_trend_{keyword.replace(" ","_")}.png',dpi=150)plt.close()

2.2 竞品对比雷达图

importnumpyasnpdefplot_competitor_radar(metrics:Dict):"""绘制竞品对比雷达图"""categories=['Visibility','Top 3','Top 10','Content','Backlinks']# 数据our_data=[metrics['our']['visibility'],metrics['our']['top3'],metrics['our']['top10'],metrics['our']['content'],metrics['our']['backlinks']]comp_data=[metrics['comp']['visibility'],metrics['comp']['top3'],metrics['comp']['top10'],metrics['comp']['content'],metrics['comp']['backlinks']]# 闭合图形angles=np.linspace(0,2*np.pi,len(categories),endpoint=False).tolist()our_data+=our_data[:1]comp_data+=comp_data[:1]angles+=angles[:1]fig,ax=plt.subplots(figsize=(8,8),subplot_kw=dict(projection='polar'))ax.plot(angles,our_data,'o-',linewidth=2,label='Us',color='#2196F3')ax.fill(angles,our_data,alpha=0.25,color='#2196F3')ax.plot(angles,comp_data,'o-',linewidth=2,label='Competitor',color='#FF5722')ax.fill(angles,comp_data,alpha=0.25,color='#FF5722')ax.set_xticks(angles[:-1])ax.set_xticklabels(categories)ax.set_ylim(0,100)ax.set_title('Competitive Analysis',fontsize=16,fontweight='bold',pad=20)ax.legend(loc='upper right',bbox_to_anchor=(1.3,1.1))ax.grid(True)plt.tight_layout()plt.savefig('competitor_radar.png',dpi=150)plt.close()

2.3 热力图:关键词×日期

importseabornassnsdefplot_keyword_heatmap(keywords:List[str],db_path:str):"""绘制关键词排名热力图"""conn=sqlite3.connect(db_path)# 获取最近30天的数据df=pd.read_sql(""" SELECT date, keyword, rank FROM rankings WHERE keyword IN ({}) AND date >= date('now', '-30 days') ORDER BY date """.format(','.join('?'*len(keywords))),conn,params=keywords)conn.close()# 透视表pivot=df.pivot(index='keyword',columns='date',values='rank')fig,ax=plt.subplots(figsize=(14,8))# 自定义颜色:排名越好(数字小)越绿sns.heatmap(pivot,annot=True,fmt='.0f',cmap='RdYlGn_r',cbar_kws={'label':'Rank'},ax=ax)ax.set_title('Keyword Ranking Heatmap (Last 30 Days)',fontsize=16,fontweight='bold')ax.set_xlabel('Date',fontsize=12)ax.set_ylabel('Keyword',fontsize=12)plt.tight_layout()plt.savefig('keyword_heatmap.png',dpi=150)plt.close()

三、自动化报告生成

defgenerate_weekly_report(db_path:str,output_dir:str):"""生成周度SEO报告"""importos os.makedirs(output_dir,exist_ok=True)# 1. 排名趋势图keywords=get_top_keywords(db_path)forkwinkeywords[:5]:plot_ranking_trend(kw,db_path)# 2. 竞品雷达图metrics=calculate_competitor_metrics(db_path)plot_competitor_radar(metrics)# 3. 热力图plot_keyword_heatmap(keywords[:10],db_path)# 4. 生成HTML报告html=f""" <html> <head><title>SEO Weekly Report</title></head> <body> <h1>SEO Weekly Report</h1> <p>Generated:{datetime.now().strftime('%Y-%m-%d')}</p> <h2>Ranking Trends</h2>{' '.join(f'<img src="ranking_trend_{kw.replace(" ","_")}.png" width="600">'forkwinkeywords[:5])}<h2>Competitive Analysis</h2> <img src="competitor_radar.png" width="600"> <h2>Keyword Heatmap</h2> <img src="keyword_heatmap.png" width="800"> </body> </html> """withopen(f'{output_dir}/report.html','w')asf:f.write(html)

四、可视化最佳实践

  1. 颜色:绿色=好,红色=差,黄色=警告
  2. Y轴:排名图要反转(1在上方)
  3. 标注:关键变化点加注释
  4. 对比:永远有对照组
  5. 简洁:一张图讲一个故事

可视化不是为了让图表好看,而是为了让决策更快。老板看一张图5秒就能知道要不要加大投入,比看10页表格有用得多。matplotlib + seaborn完全够用,不需要买Tableau。

http://www.jsqmd.com/news/856632/

相关文章:

  • 别再为买硬件发愁了!手把手教你用Control Expert V15.0搭建M340/M580仿真环境(附ModbusTCP通信测试)
  • 深入解析ERC-20:代币标准的基石、演进与未来布局
  • MuleRun助力MakerChip-FPGA在线编程模拟仿真操练
  • 揭秘三亚兴嘉装饰到底怎么样
  • AI客流统计如何实现99%准确率?从3D视觉到ReID去重解析
  • 别再死磕论文了!用PyTorch复现StyleGAN,从代码层面理解风格混合与解耦
  • HMI实现多协议转OPC UA:低成本方案的技术原理与工程实践
  • Vivado IP核避坑指南:Distributed Memory Generator里COE文件初始化与复位信号的那些‘坑’
  • 2026年阿里云OpenClaw/Hermes Agent配置Token Plan新手友好流程
  • 当UART遇上EtherCAT:在STM32F401RE上实现实时调试与通信的平衡术
  • 模型替换易,工作流锁定难!AI 锁定效应转移,企业决策何去何从?
  • 零 Python 依赖!用 JavaCV + ONNX Runtime 把 YOLO 塞进生产环境
  • 从点检到全生命周期:设备管理体系能解决哪些场景痛点?一套设备管理体系的实战应用
  • tars 环境安装及开发部署
  • JiuwenSwarm Agent Swarm 测评体验:数据清洗 Agent 团队,让“脏数据”无处可藏
  • 2026商标律所怎么选?关键标准与实力机构参考 - 品牌排行榜
  • 一文总结C++运算符的使用方法
  • 2026年必看!10款降AI率工具大测评:教你AI降AI与免费降低AI率 - 降AI实验室
  • 手把手教你用STC89C52和DS1302做一个带按键调节的电子时钟(附完整代码)
  • Seraphine:如何通过智能战绩查询和BP辅助提升英雄联盟竞技体验
  • 【工业相机】大恒万兆网相机原生RS232串口调试|无需转换板、直连通信、最简接线教程(实测)
  • M10050 模组 陶瓷天线一体
  • 2026性价比高的客厅地砖批发商推荐,探讨哪家性价比更高 - 工业品牌热点
  • 一个营销系准大一新生的 AI 猜想:我们把大脑和身体装反了
  • 汽车供应链客户定位方法拆解:复杂B2B能力如何被客户看懂
  • 为什么你的Perplexity返回过时新闻?环境时区、缓存策略与源权重配置三重校准指南
  • 从零开始,通过curl命令测试taotoken api连通性
  • STM32CubeMX配置FreeRTOS消息队列的隐藏细节:为什么队列项大小要选uint32_t?
  • 流量见顶与合规压力之下,海外云服务器能帮团队跨过哪些隐性门槛
  • 用Verilog手把手教你设计一个5分频电路(附RTL代码与仿真波形)