资讯动态

基于Python的图书馆借阅数据分析:从清洗到可视化

发布时间:2026/9/30 16:34:35 来源:尧图企业网站定制
简介这份资源是一篇围绕Python编程语言与Django框架开展图书馆借阅数据分析系统设计与实现的原创毕业论文面向专科与本科毕业设计写作及Python数据科学入门者覆盖数据抓取、清洗、建模、可视化和Web交互等完整流程。内容包含数据分析概念、Pandas/Numpy/Matplotlib/Scikit-learn等工具介绍以及基于Django搭建借阅数据管理界面的章节可用于理解毕业论文结构、数据挖掘项目落地方法和代码思路。压缩包内共1个docx文件约35KB为万字以上的完整论文文稿适合直接参考修改框架、降重表达或作为毕设选题论证素材。目前已有473人学习说明该题材在同类资源中具有一定参考热度。对需要快速上手图书馆数据分析课题、了解完整论文目录安排和Python技术选型的学生来说这份文档具备明确的实用价值。1. 借阅数据分析项目在做什么一个能答辩也能用的最小闭环「基于python的图书馆借阅数据分析设计与实现」是毕业设计和课程设计里出现频率最高的选题之一因为借阅数据人人能懂、结果可视化效果好、技术栈又是当下最主流的 Python 数据分析。但这个题也最容易做浅很多人的成品只是贴了几张柱状图答辩时被问一句「你这个折线图为什么三月份有个尖峰对应的数据原因是什么」就卡住了。借阅记录本质上是行为数据分析它的价值不只是数数而是回答几个具体问题哪些书值得加购、哪类读者最活跃、借阅周期多长算正常、什么时段该做阅读推广。这篇文章我会按一个真正能交付、能答辩、也能给图书馆做参考的方案来讲从数据构造、清洗、聚合到可视化、避坑全部用可复现的代码落地。适合正在选毕设题目的学生也适合想用数据辅助馆藏决策的从业者。一个反直觉的结论先放在这里这个项目真正的难点不在画图而在数据口径统一。2. 把项目拆成可交付的四层分析维度、技术栈与数据边界2.1 借阅分析到底分析什么五个必备分析维度拿到「图书馆借阅数据分析」这个题目第一步不是写代码而是先定义清楚「分析哪些东西」。我见过很多翻车的方案都是因为上来就写代码最后发现分析维度太少凑不够一章论文内容。按照图书馆业务里真正会被问到的问题我一般会把分析拆成五个维度维度要回答的业务问题核心字段借阅总量趋势每个月/季度借出多少册是增长还是下降借出日期热门图书排行哪些书借得最多按分类/出版社怎么分布图书名称、ISBN、分类号读者活跃度哪类读者本科生/研究生/教师借阅最勤读者编号、读者类型借阅周期读者平均借多久归还超期情况多严重借出日期、应还日期、归还日期馆藏利用情况哪些分类号的书流通率高哪些是死书分类号、馆藏地这五个维度不是拍脑袋定的。你去看知网上同题的论文核心章节基本就是围绕这五件事展开。它们的共同点是全部能从一条借阅记录表里算出来不需要额外采集数据。这也决定了项目的数据边界——我们只需要一张事实表不需要书目库、读者档案库做关联。把这一点在论文的「数据来源」一节讲清楚方案就立住了一半。这里有个容易被忽略的口径问题借阅量到底按「借出日期」统计还是按「归还日期」统计同一个月的借出和归还在时间上可能差几十天选错了口径图表趋势会完全不一样。我建议全项目统一按「借出日期」作为主口径因为图书馆月度统计通常以借出为准归还量受借阅周期影响波动更大。代码里所有涉及时间聚合的地方都用同一个字段。2.2 技术选型为什么是 Pandas Pyecharts 而不是 Excel 或 SPSS数据分析的可选工具很多但针对这个题目Python 的 Pandas 几乎是最优解原因有三条。第一清洗逻辑可复现。用 Excel 处理一两万条记录也能做但你去重、补缺、改日期格式的每一步操作都留在鼠标点击里换一批数据就得重来一遍。Pandas 把清洗写成脚本整个流程是确定性、可重放的这在论文里对应「数据预处理」章节的每一个步骤截图。第二聚合能力贴合业务。图书馆借阅数据最常见的操作就是按时间、按分类、按读者类型分组计数这个场景下groupby、resample、pivot_table三个方法能覆盖九成需求。SPSS 做统计检验很强但做这种描述性统计加图表反而绕。第三可视化生态完整且能交互。Matplotlib 出静态图适合放论文Pyecharts 出交互式 HTML 适合答辩现场演示——鼠标悬停能看到具体数值评委问「哪个月最高」你直接指给他看。这个体验比 SPSS 的图表输出强很多。有人会问要不要上数据库。几万条借阅记录用 SQLite 或 MySQL 存当然可以但对这个体量CSV 或 Excel 读进 Pandas 已经足够。除非你的设计里明确写了「借阅管理系统」否则不要为了用数据库而用数据库。项目里引入一个不必要的 MySQL 服务只会增加部署时踩坑的概率。2.3 目录结构设计先定骨架再写代码做这个项目最容易出现的问题是代码、数据、图表、文档混在一个文件夹里到最后自己都找不到哪张图对应哪段分析。我常用的目录结构是三层分离library_analysis/ ├── data/ # 原始数据与清洗后数据 │ ├── borrow_raw.csv │ └── borrow_clean.csv ├── scripts/ # 按步骤拆分的 Python 脚本 │ ├── 01_generate_data.py │ ├── 02_clean_data.py │ ├── 03_analysis.py │ └── 04_visualize.py ├── output/ # 生成的图表和报表 │ ├── figures/ │ └── 借阅分析报表.xlsx └── README.md # 记录口径定义、运行顺序、复现方式为什么要按01、02这种序号命名脚本因为数据分析是有依赖顺序的清洗依赖原始数据分析依赖清洗结果。文件名带序号既保证运行顺序清晰又能在论文里直接对应章节编号。README 里我会记录三件事分析口径按借出日期、Python 版本与依赖库、每个脚本的输入输出。这三件事写清楚后期改代码或者别人复现项目时能省下大量沟通成本。3. 构造与清洗借阅数据用 Python 生成一万条真实感记录3.1 一份可复现的借阅数据集字段设计与模拟脚本做这个题目时你大概率拿不到图书馆的真实数据所以第一步是自己构造一份模拟数据。常见做法是按图书馆业务的真实规律生成热门图书借阅次数多、寒暑假借阅量明显下降、部分读者会超期归还。数据字段设计成下面这个样子基本覆盖了 2.1 节五个分析维度所需的信息字段名类型说明记录IDint自增主键读者编号str如 R0001读者类型str本科生 / 研究生 / 教师图书名称str书名ISBNstr注意用字符串类型分类号str如 TP312、I247.5馆藏地str如 三楼社科库借出日期datetime主口径字段应还日期datetime借出日期 默认借期归还日期datetime空值表示未还是否续借bool续借过的记录生成模拟数据的脚本我放在下面。注意三个关键点用seed固定随机数、用weights控制热门图书被借概率、用工作日偏移模拟真实借阅周期。import pandas as pd import numpy as np from datetime import timedelta # 固定随机种子保证每次运行生成相同数据 np.random.seed(42) reader_types [本科生, 研究生, 教师] reader_type_weights [0.55, 0.30, 0.15] # 本科生是借阅主力 # 构造 20 本高频图书和 180 本长尾图书模拟二八分布 hot_books [(Python编程从入门到实践, 9787115427933, TP311.56), (编译原理, 9787111128069, TP314), (平凡的世界, 9787030259152, I247.5)] tail_books [(f学术著作{str(i).zfill(3)}, f9787{i:09d}, fZ{i % 100}) for i in range(180)] book_pool hot_books * 15 tail_books # 热门书被选中的概率放大 15 倍 N 10000 # 生成 1 万条借阅记录 records [] start_date pd.Timestamp(2023-01-01) for i in range(N): # 按加权概率选读者类型和图书 rtype np.random.choice(reader_types, preader_type_weights) rno fR{np.random.randint(1, 501):04d} title, isbn, cls book_pool[np.random.randint(len(book_pool))] # 借出日期以 2023 年为中心暑假(7-8月)借阅量减半 while True: d start_date pd.Timedelta(daysnp.random.randint(0, 545)) if d.month in (7, 8) and np.random.random() 0.5: continue break # 默认借期 30 天教师 60 天20% 概率续借 15 天 if rtype 教师: due_days 60 else: due_days 30 if np.random.random() 0.2: due_days 15 due d timedelta(daysdue_days) # 85% 正常归还归还日可能提前或略超期 if np.random.random() 0.85: ret d timedelta(daysint(np.random.normal(due_days - 5, 4))) ret min(ret, d timedelta(daysdue_days 30)) # 允许少量超期 else: ret pd.NaT # 未还 records.append([fB{i1:05d}, rno, rtype, title, isbn, cls, 三楼社科库 if cls.startswith((I, K)) else 二楼科技库, d.date(), due.date(), ret.date() if pd.notna(ret) else None, np.random.random() 0.2]) df pd.DataFrame(records, columns[记录ID, 读者编号, 读者类型, 图书名称, ISBN, 分类号, 馆藏地, 借出日期, 应还日期, 归还日期, 是否续借]) df.to_csv(data/borrow_raw.csv, indexFalse, encodingutf-8-sig) print(f生成 {len(df)} 条记录日期范围 {df[借出日期].min()} ~ {df[借出日期].max()})这段脚本里有两个参数值得专门说明。第一个是reader_type_weights它决定了读者类型的分布比例本科生 55%、研究生 30%、教师 15%这个比例贴近高校图书馆的真实情况。第二个是book_pool hot_books * 15 tail_books它不是元组乘法那么简单——这行代码把 3 本高频书各复制 15 份放进池子让它们在随机选择中被命中的概率远高于长尾图书模拟了「少数书贡献多数借阅」的规律这是后面热门图书排行能够成立的数据基础。如果你没有现成的data目录脚本会报错。运行前先建好目录或者用os.makedirs(data, exist_okTrue)在脚本开头加一行。这个细节看起来小但第一次跑通项目的流畅感对新手很重要。3.2 数据清洗去重、补缺和日期解析模拟数据生成之后清洗才是真正体现工程能力的地方。真实场景的借阅记录会比模拟数据脏得多但清洗的逻辑是相通的。我按三步走先去重再处理缺失最后统一日期格式。import pandas as pd df pd.read_csv(data/borrow_raw.csv) df[借出日期] pd.to_datetime(df[借出日期], format%Y-%m-%d) df[应还日期] pd.to_datetime(df[应还日期], format%Y-%m-%d) df[归还日期] pd.to_datetime(df[归还日期], format%Y-%m-%d, errorscoerce) # 第一步去重。同一读者同一天借同一本书视为重复记录 dup_mask df.duplicated(subset[读者编号, 图书名称, 借出日期], keeplast) print(f去重前: {len(df)} 条重复: {dup_mask.sum()} 条) df df[~dup_mask].copy() # 第二步补缺。归还日期为空表示未还不删除而是标记状态 df[是否归还] df[归还日期].notna().astype(int) # 第三步日期合理性检查——归还日期早于借出日期是逻辑错误 invalid df[df[归还日期] df[借出日期]] if len(invalid) 0: print(f警告: {len(invalid)} 条记录归还日期早于借出日期已置为未还) df.loc[invalid.index, 归还日期] pd.NaT df.to_csv(data/borrow_clean.csv, indexFalse, encodingutf-8-sig)去重的keeplast参数值得解释一下。借阅记录里如果出现完全重复的两行通常是数据录入时重复提交保留最后一条是最安全的做法——因为后录入的那条更可能包含修正后的信息。而errorscoerce的作用是把无法解析的日期变成NaTNot a Time这样后面聚合时不会因为字符串日期报错代价是这些记录会被当作未还处理。对于归还日期这种非关键字段这个取舍是划算的。3.3 聚合前的最后一步把时间字段变成可分析索引清洗完成后不要急着画图先做一步「探索性检查」——用describe()和info()看数据的分布和类型这一步能省下后面大量的排错时间。# 快速体检统计各读者类型的借阅占比 print(df.groupby(读者类型)[记录ID].count() / len(df) * 100) # 按月份看借阅量初步判断数据是否有明显趋势 monthly df.set_index(借出日期).resample(M).size() print(monthly.head(6))set_index(借出日期)把日期列设为索引resample(M)是 Pandas 时间序列聚合的核心方法M表示按自然月聚合size()统计每个月的记录条数。这里有个新手常踩的坑resample(M)和resample(MS)的结果看起来一样实际上M表示区间右端点月末日期MS表示左端点月初日期。如果你后续要把月度索引和另一张表做关联端点不同会导致日期对不上。我习惯统一用M因为它更符合人类的直觉——「1月」就是 1 月 31 日那天。这一步输出之后你应该能看到 2023 年 1 月到次年 6 月共 18 个月的借阅量并且 7、8 月明显偏低。如果看不到这个规律说明模拟数据的生成逻辑有问题回去检查 3.1 里那个while True循环。4. 借阅分析与可视化落地从 Pandas 聚合到 Pyecharts 图表4.1 借阅趋势与热门图书Pandas 聚合的三个注意点分析阶段的代码相对固定。借阅趋势用按月聚合热门图书用按书分组这两个操作能覆盖论文里一半的图表需求。import pandas as pd df pd.read_csv(data/borrow_clean.csv, parse_dates[借出日期]) # 分析1: 月度借阅趋势主口径: 借出日期 monthly df.set_index(借出日期).resample(M).size() # 分析2: 热门图书 Top10书名 ISBN 联合分组避免不同版次混淆 hot_books (df.groupby([图书名称, ISBN]) .size() .reset_index(name借阅次数) .sort_values(借阅次数, ascendingFalse) .head(10)) # 分析3: 各分类号借阅量 Top10反映馆藏使用结构 hot_cats (df.groupby(分类号)[记录ID] .count() .nlargest(10))第一处要注意的是热门图书排序为什么要groupby([图书名称, ISBN])。同一本书的不同版次书名相同但 ISBN 不同只按书名分组会把不同版次的借阅量混在一起表面看很合理但老师问一句「你这个《Python编程》是哪个出版社的」就答不上来。联合分组保留了版本差异虽然 Top 榜上同一本书可能出现两次但这是数据准确性的代价。第二处要注意sort_values()和nlargest()的区别。sort_values是先把所有的组排好序再取前 10适合你还要继续用排序结果的场景nlargest是堆排序直接取最大的 n 个值大数据量下更快但结果默认不排序需要手动sort_values()一次。对于万条记录这个量级两者都很快但论文里写「使用 nlargest 提升大数据量下的效率」是加分项。第三处secondary聚合时groupby(分类号)[记录ID].count()和.size()的结果一样但语义不同count()统计非空值数量size()统计行数。如果记录 ID 有缺失前者会少算。这里用count()更严谨。4.2 读者画像借阅周期与活跃度分布读者画像这个模块代码不多但最容易出亮点。借阅周期算出来后你会发现一个意料之中的分布——大多数人的借阅天数集中在 25 到 35 天也就是默认借期附近这能反向验证数据的真实性。# 计算借阅周期仅统计已归还记录 ret df.dropna(subset[归还日期]).copy() ret[借阅天数] (ret[归还日期] - ret[借出日期]).dt.days # 按读者类型看平均借阅天数 avg_cycle ret.groupby(读者类型)[借阅天数].agg([mean, median, count]) print(avg_cycle) # 超期比例: 归还日期晚于应还日期的记录占比 ret[是否超期] (ret[归还日期] ret[应还日期]).astype(int) overdue_rate ret.groupby(读者类型)[是否超期].mean() * 100 print(overdue_rate)dt.days是把时间差转为整数天数的快捷方式它和np.timedelta64的换算要分清。如果直接print(ret[会还天数])显示的是30 days 00:00:00这样的格式用.dt.days才能拿到数值 30后面画图才能作为纵轴数据。至于超期比例教师通常比学生低因为借期本来就长这个逻辑在论文里要解释成「规则设计导致的行为差异」而不是「教师更守时」。4.3 可视化输出Pyecharts 柱线组合图与报表导出可视化是这个项目加分最快的地方所以我直接给出 Pyecharts 画组合图的完整代码。Pyecharts 的优势是图表可交互、能在浏览器里展示、导出 HTML 后答辩现场随手就能演示。from pyecharts.charts import Bar, Line from pyecharts import options as opts # 构造月度借阅量数据 monthly_index [d.strftime(%Y-%m) for d in monthly.index] monthly_values monthly.values.tolist() bar ( Bar() .add_xaxis(monthly_index) .add_yaxis(借阅量, monthly_values) .set_global_opts( title_optsopts.TitleOpts(title图书馆月度借阅趋势), datazoom_opts[opts.DataZoomOpts()], # 开启缩放便于观察长周期 ) ) line ( Line() .add_xaxis(monthly_index) .add_yaxis(借阅量, monthly_values) .set_global_opts( title_optsopts.TitleOpts(title借阅趋势平滑线), ) ) # 组合图: 柱状 折线柱状体现绝对量折线体现趋势 combined ( Bar() .add_xaxis(monthly_index) .add_yaxis(月度借阅量, monthly_values) .extend_axis(yaxisopts.AxisOpts(name借阅量)) .set_global_opts(title_optsopts.TitleOpts(title月度借阅量对比)) ) # 还可以叠加累计借阅量的折线 cumulative [sum(monthly_values[:i1]) for i in range(len(monthly_values))] combined ( combined .add_yaxis(累计借阅量, cumulative, yaxis_index1) .set_series_opts(label_optsopts.LabelOpts(is_showFalse)) ) combined.render(output/figures/monthly_trend.html)extend_axis和yaxis_index是组合图的关键参数。extend_axis在右侧新增一条 y 轴yaxis_index1让累计借阅量挂到右侧轴上。左右轴量级不同左侧几百右侧几千如果不分开累计线会压扁在图表底部。这是 Pyecharts 组合图最容易翻车的地方我在第一次做的时候也调了很久。导出 Excel 报表用 Pandas 自带的to_excel就行记得指定engineopenpyxl否则遇到中文列名和特殊字符会报错with pd.ExcelWriter(output/借阅分析报表.xlsx, engineopenpyxl) as writer: df.to_excel(writer, sheet_name明细数据, indexFalse) monthly.to_excel(writer, sheet_name月度趋势) hot_books.to_excel(writer, sheet_name热门图书Top10, indexFalse)Excel 导出这里我建议用with语句管理ExcelWriter对象这样写完后文件会正常关闭。新手经常漏掉关闭动作导致文件被占用、无法重写只能重启 IDE。这种小问题在答辩现场很容易让人手足无措。5. 图书馆借阅数据最常见的 5 个坑现象、原因与排查5.1 Matplotlib 中文变方块图表标题全是「□□□」中文乱码是 Python 数据分析项目里发生率最高的问题几乎每届学生都会遇到。现象是图表的标题、坐标轴标签全部变成方块但英文和数字正常。原因是 Matplotlib 默认字体里没有中文字体需要在代码里显式指定。解决方案有两种第一种是全局设置import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 指定黑体 plt.rcParams[axes.unicode_minus] False # 解决负号显示为方块的问题这段代码要放在任何画图操作之前。第二行axes.unicode_minus同样关键它解决的是负号显示问题如果不设置坐标轴上的「-1」会显示成方块。如果你用的是 Linux 服务器跑项目SimHei 字体可能不存在需要先fc-list :langzh查看系统中文字体然后改成对应的字体名比如WenQuanYi Micro Hei。5.2 日期解析一批一批地丢数据聚合结果少了一半现象是pd.to_datetime处理日期列时某几个月的数据神秘消失而且不报错只是警告DateParser解析失败。原因是数据里混了多种日期格式比如大部分是2023-01-15但有几行是2023/1/15还有几行是20230115。pd.to_datetime默认用infer模式自动猜测格式一旦同一列格式不统一猜测就会出错。解决思路是先把格式统一再解析# 先把斜杠格式统一为短横线 df[借出日期] df[借出日期].str.replace(/, -) # 再按明确格式解析格式严格到年月日 df[借出日期] pd.to_datetime(df[借出日期], format%Y-%m-%d, errorscoerce) # 检查解析失败的数量必要时打印具体行 lost df[借出日期].isna().sum() if lost 0: print(f解析失败 {lost} 行以下是前 5 条原始值:) print(df.loc[df[借出日期].isna(), 借出日期].head())format%Y-%m-%d指定了严格格式后任何不符合的输入都会变成NaT而errorscoerce保证了程序不中断把异常值暴露给你后续检查。这个组合拳比默认的智能解析可靠得多代价是你要知道自己数据的格式——这也解释了我为什么在生成模拟数据时就用%Y-%m-%d。5.3 Excel 打开 CSV 后 ISBN 变成科学计数法前导零全丢了现象是生成的 CSV 用 Excel 打开后ISBN 列显示成7.117E11后面全是 000。原因是 Pandas 的to_csv默认把所有看起来像数字的列写成数值格式而 ISBN 是 13 位纯数字Excel 自动按超长数字处理成科学计数法。哪怕不用 Excel你用pd.read_csv读回时ISBN 也会被解析成 int64前面以 0 开头的 ISBN 直接丢零。解决方法是把 ISBN 强制按字符串读入和写出# 写出时确保 ISBN 列是 str 类型 df[ISBN] df[ISBN].astype(str) df.to_csv(data/borrow_clean.csv, indexFalse, encodingutf-8-sig) # 读入时指定 dtype防止 Pandas 自动推断为数值 df pd.read_csv(data/borrow_clean.csv, dtype{ISBN: str})dtype{ISBN: str}这个参数很多人不知道。Pandas 读 CSV 时会自动推断每列类型13 位数字会推断成 int64从而导致前导零丢失。指定dtype后该列会跳过类型推断直接按字符串读入。这也是我在 2.1 节字段设计里把所有编码类字段都标成 str 的原因。5.4 时间序列聚合后出现 NaN画出的图中间断了一截现象是按月聚合后的数据在某个月份突然变成NaN画出来的折线图有一段是空的。原因是resample(M)是按日历月重采样如果某个月一条借阅记录都没有该月就没有任何数据Pandas 返回NaN而不是 0。图书馆数据里寒假 2 月借阅量锐减可能真的出现零记录。处理方式要根据业务语义区分借阅量为 0 是合法事实应该填 0 后画图而缺失时间戳是「该月没有数据」不需要填充。区分这两者的标准是——如果其他月份都有值、只有某个月是 0用fillna(0)如果整个时间范围本身就中间断档比如系统某月没开馆直接填充反而制造假数据。# 只有确认该月开馆且无借出时NaN 才填充为 0 monthly df.set_index(借出日期).resample(M).size().fillna(0)5.5 模拟数据太假图表看不出趋势现象是生成的数据画出来非常均匀每个月借阅量都在 500 上下答辩时被质疑「数据是编的吧」。原因是随机生成时用了均匀分布没考虑季节性和长尾效应。图书馆数据最典型的规律是寒暑假低谷、开学季高峰以及热门书借阅次数比普通书高一个数量级。3.1 节的模拟脚本已经用while True加np.random.random() 0.5把 7-8 月借阅量压了一半用hot_books * 15放大了热门书的被选概率。如果发现自己的数据还是太平检查这两处逻辑是否生效不要直接改随机种子——改种子只是换了数字换不了分布结构。6. 用验证清单让项目可信从数据完整性到答辩演示项目做完后我习惯在答辩前跑一遍自查脚本用程序确认数据可信性而不是靠感觉。这个习惯救过我一次——有一次我在聚合时把dropna放在了groupby前面导致未归还记录全部消失月度总量凭空少了 20%如果没跑自查答辩现场被问到「你这个 2 月借阅量怎么和明细对不上」就很难收场了。# 数据完整性自查清单 N_raw 10000 # 原始模拟条数 N_clean len(df) missing df.isna().sum() assert abs(N_clean - N_raw) 50, 清洗后数据量偏差过大 assert df[借出日期].min() pd.Timestamp(2023-01-01) assert df[借出日期].max() pd.Timestamp(2024-12-31) print(f记录数: {N_clean}, 缺失情况:\n{missing})答辩演示有一个小技巧不要按「清洗、分析、可视化」的顺序讲而是按「发现问题、处理问题、得出结论」的顺序讲。比如先问「图书馆哪个月最需要人力支持」然后展示月度趋势图再指出 9 月开学季借阅量是暑假的 3 倍最后落回建议——开学季前一周增加热门书副本量。这个叙述结构让技术步骤为业务结论服务比逐个模块念代码效果强得多。如果你还想加一个进阶点借阅趋势预测是个性价比很高的方向。用月度历史数据做Prophet或简单线性回归预测下一个月的借阅量不需要额外采集数据只需要把 4.1 节算出的monthly序列按时间顺序拆成训练集和测试集。但注意在论文里别把预测说得太玄用「基于历史趋势的简单外推」来定位它因为靠 18 个月数据做出来的预测置信度谈不上高。我做这个项目时最后悔的是前期没把「借出日期」口径写进 README导致改了两次报表结构才统一。这个细节你只要花两分钟提前写好后面会省两天。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑