先说痛点:公司不给买工具,还想做BI?
你在工位上盯着Excel的折线图,老板走过来问能不能加个筛选器。你口头答应,心里清楚手动刷数据要刷到下班。商业BI工具一年几十万,老板摇摇头。其实他想要的就是一个能拖拽、能交互、能看趋势的仪表盘。
这事没那么玄乎。用Python把数据可视化做成交互图表,效果跟Tableau差不多。关键是代码量不大,同事也能学会。
搭建方案:Python + Plotly + Dash
选三个库就够了。Plotly负责画图,它生成的图表能缩放、悬停看数值、点击筛选。比如你画个柱状图,鼠标滑过去会自动显示销售额。Dash把图表包装成网页,加下拉框、日期选择器这些交互组件。基础数据处理靠Pandas。
这几个库都是开源的,安装就一行代码:pip install dash plotly pandas。不需要前端知识,连CSS你都不用碰。
动手做一个简单销售仪表盘
假设你有一张订单表,字段是日期、产品、金额。你想看各产品按月累计销售额。代码逻辑分三步:加载数据、做分组汇总、丢进Plotly画线图。
import pandas as pd import plotly.express as px
from dash import Dash, dcc, html
df = pd.read_excel('orders.xlsx')
df['month'] = df['日期'].dt.to_period('M').astype(str)
agg = df.groupby(['month','产品'])['金额'].sum().reset_index()
app = Dash(__name__)
app.layout = html.Div([
dcc.Graph(figure=px.line(agg, x='month', y='金额', color='产品'))
])
if __name__ == '__main__':
app.run(debug=True)
运行这个脚本,浏览器打开 http://127.0.0.1:8050,你就能看到交互式折线图了。鼠标悬停会显示具体数值,右上角有缩放、下载图片按钮。这就相当于一个微型的BI看板。
加点交互:下拉框筛选产品
很多领导看报表只关心某个品类。加一个下拉框,让用户选产品,图表自动更新。用Dash的dcc.Dropdown组件就行。
from dash.dependencies import Input, Output products = df['产品'].unique()
app.layout = html.Div([
dcc.Dropdown(options=[{'label':p, 'value':p} for p in products],
multi=True, value=products[:1]),
dcc.Graph(id='sales-chart')
])
@app.callback(
Output('sales-chart', 'figure'),
Input('dropdown', 'value')
)
def update_chart(selected):
filtered = agg[agg['产品'].isin(selected)]
return px.line(filtered, x='month', y='金额', color='产品')
这个回调函数是关键。用户选了什么产品,程序就过滤数据重新画图。整个刷新过程在浏览器端完成,毫秒级响应。老板看了会觉得你偷偷买了软件。
还可以做哪些图表
Plotly支持的图表类型跟商业软件差不多。柱状图、散点图、热力图、漏斗图、地图都有。比如你想看各省销量分布,用px.choropleth画省份热力图。想让图表更专业,把颜色主题改成公司品牌色,用color_discrete_sequence参数调一下。
数据量大到几十万行,Plotly也能扛住。它底层用WebGL渲染,不卡顿。实在不行,可以做个数据聚合页面,先汇总再画趋势。
部署给同事用:传到公司内网
你开发好的仪表盘不能只在自己电脑上运行。用gunicorn部署到公司服务器或内网某台电脑上,同事访问IP地址加端口号就能用。假设服务器IP是192.168.1.100,启动命令:
gunicorn -w 4 -b 0.0.0.0:8050 your_app:server
记得把数据源改成定时从数据库拉取。用APScheduler每小时跑一次ETL脚本,把最新数据写进CSV或SQLite。这样每天的销售数据第二天早上就能自动刷新到仪表盘上。
整个方案零成本。你花两天时间搭出来,能省下采购审批流程的半年时间。业务部门用上手,还会主动找你开发新看板。这时候你就可以考虑给老板画张“升级到Tableau”的饼了。
现在就去打开终端,装好库,写个测试脚本。你照着上面的代码敲一敲,半个小时就能见到那个能交互的图表。到时候截图扔到公司群里,谁还会说Python做不了BI。