Featured image of post 用 DuckDB 搭建房价趋势分析产品——一个人月入 3 万的独立开发者之路

用 DuckDB 搭建房价趋势分析产品——一个人月入 3 万的独立开发者之路

拆解独立开发者如何用 DuckDB + 公开数据源,搭建城市房价趋势分析报告产品。从数据采集、清洗、分析到 PDF 报告生成,完整技术栈零成本运行,可复制的变现路径。

引言:一份报告,月入三万

中国有超过 5 亿的购房者与潜在购房者。他们面临的核心痛点是:房价数据分散在各个平台(贝壳、链家、安居客),无法横向对比;自己想分析又太麻烦

一位叫阿杰的独立开发者,去年看准了这个需求,用 DuckDB 做了一个"城市房价趋势分析报告"产品,主要卖给准备买房的年轻人和房产投资客。目前每月稳定收入 2-4 万元,而他一个人维护这套系统,每天实际工作时间不到 1 小时。

他的核心产品就是一份 PDF 报告,售价 99 元/份,或者 299 元/季度的订阅服务

今天我要拆解他的完整技术栈和变现路径——你会发现,核心工具就是 DuckDB,成本几乎为零。


一、产品架构:从零到一的完整链路

整个系统的核心思路很简单:获取公开数据 → 用 DuckDB 清洗分析 → 生成可视化图表 → 输出 PDF 报告 → 通过公众号/私域交付

┌─────────────┐     ┌──────────────┐     ┌──────────────┐     ┌─────────────┐
│  数据采集层   │────▶│  DuckDB 处理  │────▶│  图表生成层   │────▶│  报告交付层   │
│  (API/CSV)  │     │  (清洗/聚合)  │     │  (Matplotlib) │     │  (PDF/微信)  │
└─────────────┘     └──────────────┘     └──────────────┘     └─────────────┘

数据源

阿杰的数据源全部来自公开渠道:

  1. 房天下 API:各城市历史房价指数(月度)
  2. 链家爬虫:二手房挂牌价、成交价(日度)
  3. 统计局数据:各城市人口流入流出、GDP 增速
  4. 土地交易中心:各城市土地成交楼面价

这些数据格式各异——CSV、JSON、HTML 表格、Excel——而 DuckDB 的强项就是能直接读取所有这些格式,无需预先转换


二、核心技术:DuckDB 数据处理实战

第一步:多源数据合并

阿杰的系统首先会把所有数据源拉取下来,放在一个 data/raw/ 目录下。然后直接用 DuckDB 的 read_csv_autoread_json 函数读取:

import duckdb

# 连接本地 DuckDB 数据库
con = duckdb.connect("housing.db")

# 自动读取 CSV 文件(含类型推断)
con.execute("""
    CREATE TABLE lianjia AS
    SELECT * FROM read_csv_auto('data/raw/lianjia_*.csv', 
        header=true,
        auto_detect=true,
        columns={
            'city': 'VARCHAR',
            'district': 'VARCHAR',
            'community': 'VARCHAR',
            'price_per_sqm': 'DOUBLE',
            'area': 'DOUBLE',
            'rooms': 'INTEGER',
            'listing_date': 'DATE'
        }
    )
""")

# 读取 JSON 格式的 API 数据
con.execute("""
    CREATE TABLE fangtianxia AS
    SELECT * FROM read_json_auto('data/raw/ftxz_index_*.json')
""")

# 读取 Excel 数据
con.execute("""
    CREATE TABLE tongji AS
    SELECT * FROM read_excel('data/raw/city_stats.xlsx')
""")

这里的关键是 read_csv_autoread_json_auto —— 它们会自动检测分隔符、编码、列类型,省去大量预处理时间。对于独立开发者来说,时间就是金钱。

第二步:跨数据源关联分析

接下来是最核心的部分——把不同来源的数据关联起来,找出房价与人口、GDP、土地供应之间的关系

-- 计算各城市近 12 个月均价走势
CREATE VIEW city_price_trend AS
SELECT 
    city,
    DATE_TRUNC('month', listing_date) AS month,
    AVG(price_per_sqm) AS avg_price,
    MEDIAN(price_per_sqm) AS median_price,
    COUNT(*) AS listing_count,
    PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY price_per_sqm) AS p25,
    PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY price_per_sqm) AS p75
FROM lianjia
WHERE listing_date >= CURRENT_DATE - INTERVAL '365 days'
GROUP BY city, DATE_TRUNC('month', listing_date);

-- 关联人口数据,计算"房价收入比"
CREATE VIEW city_analysis AS
SELECT 
    t.city,
    t.month,
    t.avg_price,
    t.median_price,
    t.listing_count,
    s.population_change,       -- 人口净流入
    s.gdp_growth,              -- GDP 增速
    s.land_supply_area,        -- 土地供应面积
    -- 房价收入比 = 均价 / (人均GDP / 家庭平均人数)
    ROUND(t.avg_price * 3.0 / NULLIF(s.gdp_per_capita / 2.5, 0), 2) AS price_income_ratio
FROM city_price_trend t
LEFT JOIN tongji s ON t.city = s.city_name;

注意这里用了 MEDIANPERCENTILE_CONT 这些统计函数——DuckDB 内置了丰富的统计分析能力,不需要引入 Pandas 就能完成大部分数据探索工作

第三步:趋势预测与异常检测

报告中还需要包含"未来 3 个月价格趋势预测"。阿杰用了一个简单但有效的 SQL 方案:

-- 使用窗口函数计算移动平均和环比变化率
CREATE VIEW price_forecast AS
SELECT 
    city,
    month,
    avg_price,
    -- 7 日移动平均(平滑噪音)
    AVG(avg_price) OVER (PARTITION BY city ORDER BY month ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS ma7,
    -- 环比变化率
    ROUND((avg_price - LAG(avg_price, 1) OVER (PARTITION BY city ORDER BY month)) 
          / NULLIF(LAG(avg_price, 1) OVER (PARTITION BY city ORDER BY month), 0) * 100, 2) AS mom_pct,
    -- 同比变化率
    ROUND((avg_price - LAG(avg_price, 12) OVER (PARTITION BY city ORDER BY month)) 
          / NULLIF(LAG(avg_price, 12) OVER (PARTITION BY city ORDER BY month), 0) * 100, 2) AS yoy_pct
FROM city_analysis;

-- 找出价格波动异常的城市(环比变化超过 ±5%)
SELECT * FROM price_forecast
WHERE ABS(mom_pct) > 5
ORDER BY ABS(mom_pct) DESC;

这个方案的精妙之处在于:完全用 SQL 实现,没有写一行 Python 循环。DuckDB 的窗口函数性能极高,即使处理百万级数据也能秒出结果。


三、传统方案 vs DuckDB 方案对比

很多开发者第一次做这类项目时,会这样选型:

维度Pandas + SQLite 方案DuckDB 方案
数据读取速度CSV 100 万行 ≈ 8 秒CSV 100 万行 ≈ 0.3 秒
内存占用全量加载到内存流式处理,按需读取
SQL 查询性能需导出为 SQLite原生 SQL,零开销
多格式支持需分别调用 pandas.read_*统一 read_csv_auto
代码行数~200 行 Python~80 行 SQL + Python
部署复杂度需安装多个依赖单库 pip install duckdb

DuckDB 的核心优势在于:它让数据分析师能用 SQL 完成以前需要 Python + 多个库才能做的事,而且快一个数量级。


四、报告生成与交付

分析完成后,需要用 Matplotlib 生成图表,再打包成 PDF:

import matplotlib.pyplot as plt
import duckdb

con = duckdb.connect("housing.db")

# 查询北京房价走势
df = con.execute("""
    SELECT month, avg_price, median_price, p25, p75
    FROM city_price_trend 
    WHERE city = '北京'
    ORDER BY month
""").fetchdf()

# 绘制价格走势图
fig, ax = plt.subplots(figsize=(12, 6))
ax.plot(df['month'], df['avg_price'], label='均价', color='#6366f1')
ax.fill_between(df['month'], df['p25'], df['p75'], alpha=0.2, color='#6366f1', label='IQR')
ax.set_title('北京市二手房均价走势(近12个月)')
ax.set_ylabel('元/平方米')
ax.legend()
plt.savefig('output/beijing_trend.png', dpi=150, bbox_inches='tight')

# 用 ReportLab 打包 PDF
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas

c = canvas.Canvas('output/房价分析报告_北京.pdf', pagesize=A4)
width, height = A4
c.drawImage('output/beijing_trend.png', 50, height - 400, width=500, height=250)
c.drawString(50, height - 50, "数据来源:链家、房天下、统计局 | 分析日期:2026年7月")
c.save()

最终交付给用户的是一份精美的 PDF,包含:

  • 目标城市近 12 个月价格走势
  • 各区域价格对比
  • 人口/GDP 关联分析
  • 未来 3 个月趋势预测
  • 购房建议(基于数据驱动)

五、变现路径拆解

阿杰的变现路径非常清晰:

1. 单次报告销售(99 元/份)

用户在微信公众号下单,提供目标城市,系统自动生成报告 PDF,通过微信发送。边际成本几乎为零——每多卖一份报告,只需增加几毫秒的 DuckDB 查询时间和几 MB 的 PDF 存储空间。

2. 季度订阅(299 元/季度)

订阅用户每周收到一次更新报告,包含最新数据和分析。这是最稳定的收入来源,阿杰目前有约 80 个订阅用户,季度收入约 2.4 万元。

3. B 端合作

一些房产中介公司、理财顾问会批量购买定制报告,单价 500-2000 元/份。这部分虽然量不大,但利润率高。

成本分析

项目月成本
云服务器(1核2G)¥50
域名 + SSL¥50
数据存储(S3)¥10
合计¥110

月收入 2-4 万元,成本仅 110 元,毛利率超过 99%。这就是数据产品的魅力——一旦系统搭建完成,多服务一个客户的边际成本趋近于零。


六、关键成功因素

  1. 数据质量决定产品上限——阿杰花了大量时间清洗链家数据,去重、填补缺失值、标准化城市名称。DuckDB 的 DISTINCTCOALESCEREGEXP_REPLACE 在这里派上了大用场。

  2. 报告要"看得懂"——不是所有用户都懂数据分析。阿杰在报告中加入了"购房指数"(综合评分),让用户一目了然哪个城市值得入手。

  3. 自动化是关键——从数据采集到报告生成的全流程自动化,每天只需 1 小时监控即可。如果手动操作,这套系统根本无法盈利。

  4. 私域运营比技术更重要——阿杰在小红书、抖音上持续输出免费房价分析内容,引流到公众号转化付费用户。技术只是杠杆,流量才是放大器


七、你可以如何复制

如果你想复制这个模式,建议从以下方向切入:

  • 本地化:选择一个细分城市或区域,做深做透
  • 差异化:加入独特的分析维度(如学区溢价、地铁影响半径)
  • 产品化:将报告模板化,支持用户自选城市和指标
  • 规模化:接入更多数据源,扩大覆盖城市数量

整个系统的技术栈可以压缩为:Python + DuckDB + Matplotlib + ReportLab,全部开源免费。唯一需要的投入是时间和执行力


📖 本文涉及的完整代码仓库和数据清洗脚本已发布在 duckdblab.org,包含可直接运行的 Jupyter Notebook 和 Docker 部署方案。想系统学习 DuckDB 在数据产品中的应用?duckdblab.org 上有从入门到实战的完整教程系列。

📺 Watch video tutorials → Olap Studio YouTube

Subscribe for more DuckDB & AI automation tutorials

使用 Hugo 构建
主题 StackJimmy 设计

⚠️ 本站为独立社区项目,与 DuckDB 基金会及 DuckDB 官方项目无任何从属、背书或赞助关系。

"DuckDB" 是 DuckDB 基金会的注册商标,本站仅以事实描述方式使用该名称。

本站内容仅供教育与社区推广用途,不构成任何商业服务。