☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜
{"type":"doc","content":[{"type":"paragraph","attrs":{"id":"6a2d87ca-f04c-401f-9d6b-81123a8e762c","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"},{"type":"italic"}],"text":"摘要:"},{"type":"text","marks":[{"type":"italic"}],"text":"本文介绍如何使用 qclaw 结合 python 的 pandas 和 matplotlib 库,实现销售数据的自动清洗、分析和可视化报告生成。通过真实业务场景,展示如何将原本需要半天的手工工作压缩到 10 分钟完成。"}]},{"type":"image","attrs":{"id":"e0117ef7-1f0a-4d35-94cf-c0d134abdcae","src":"https://developer.qcloudimg.com/http-save/audit-11072475/9d816e77fce0e920ed639c765e5a9530.png","extension":"png","align":"center","alt":"","showalt":false,"href":"","boxshadow":"","width":1100,"aspectratio":"1.731707","status":"success","showtext":true,"ispercentage":false,"percentage":0,"ishoverdraghandle":false}},{"type":"paragraph","attrs":{"id":"138d1659-6cd6-4caa-bb79-d33f52a8870d","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false}},{"type":"heading","attrs":{"id":"a48b7e94-c955-447e-a878-1905ef167dbe","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"前言"}]},{"type":"paragraph","attrs":{"id":"6024bea3-0b59-4c80-b7da-6cd1b36fd32e","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"作为一名销售运营分析师,我每个月都要面对这样的任务:"}]},{"type":"bulletlist","attrs":{"id":"c3ad63e2-61ac-49a8-96ca-11b042acde9c","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"5d6a82dc-a816-4351-a2bf-63c982c38cb6"},"content":[{"type":"paragraph","attrs":{"id":"480fef59-712b-4c85-b1d3-7b6e620f0949","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"从 crm 系统导出原始销售数据(通常有上万行)"}]}]},{"type":"listitem","attrs":{"id":"04db929c-1e85-4053-9ca5-1488e54d7e76"},"content":[{"type":"paragraph","attrs":{"id":"9bece6f9-6e1d-405b-9107-bff8fcc50199","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"手动清洗数据:处理缺失值、修正格式错误、合并多个表格"}]}]},{"type":"listitem","attrs":{"id":"c4a95505-dd1a-48cf-aafb-4af1d874a6d5"},"content":[{"type":"paragraph","attrs":{"id":"930c245a-f05f-4f29-b3ba-edf5cc7419b2","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"按产品、区域、销售人员等维度进行统计分析"}]}]},{"type":"listitem","attrs":{"id":"ae2f0724-6a0e-4884-93f3-58f2b90ceb68"},"content":[{"type":"paragraph","attrs":{"id":"293bf058-1032-4506-9706-1476eeea5cc3","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"制作各种图表:趋势图、饼图、柱状图、热力图"}]}]},{"type":"listitem","attrs":{"id":"dd29c24b-8822-40bc-abfa-78ce554c0d49"},"content":[{"type":"paragraph","attrs":{"id":"5a672984-289a-4424-8858-8243c9637da8","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"将分析结果整理成 ppt 或 pdf 报告发送给管理层"}]}]}]},{"type":"paragraph","attrs":{"id":"7edbb46b-482f-4323-966a-4b0f1d963ecb","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"这个过程通常需要 "},{"type":"text","marks":[{"type":"bold"}],"text":"4-6 小时"},{"type":"text","text":",而且容易出错。自从引入 qclaw 自动化工作流后,整个过程缩短到 "},{"type":"text","marks":[{"type":"bold"}],"text":"10 分钟"},{"type":"text","text":",准确率提升到 100%。"}]},{"type":"paragraph","attrs":{"id":"2a999b44-94b4-41d6-a11b-0eaea32a7ff4","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"今天就来详细分享这个实战案例,希望能给同样被数据处理困扰的朋友一些启发。"}]},{"type":"paragraph","attrs":{"id":"f85d5e93-6189-4759-ae7c-f5a59a0f4ab9","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"原始表格如下:"}]},{"type":"image","attrs":{"id":"e52a083b-ddd2-4b52-ba8e-bec5cf0e22f6","src":"https://developer.qcloudimg.com/http-save/audit-11072475/c4dee9bc117abb371e87f6b3f52236f3.png","extension":"png","align":"center","alt":"","showalt":false,"href":"","boxshadow":"","width":820,"aspectratio":"0.803134","status":"success","showtext":true,"ispercentage":false,"percentage":0,"ishoverdraghandle":false}},{"type":"paragraph","attrs":{"id":"34220b46-e6b6-4ad3-8879-10f9a7562db0","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false}},{"type":"paragraph","attrs":{"id":"e9b0ee78-c951-469c-936d-bb5edd2a12eb","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"最终效果如下:"}]},{"type":"image","attrs":{"id":"e8874e85-dc5d-44bb-ac49-01c66f58487a","src":"https://developer.qcloudimg.com/http-save/audit-11072475/865d72c084a3815cc6abd75185fedb0d.png","extension":"png","align":"center","alt":"","showalt":false,"href":"","boxshadow":"","width":1004,"aspectratio":"1.661466","status":"success","showtext":true,"ispercentage":false,"percentage":0,"ishoverdraghandle":false}},{"type":"paragraph","attrs":{"id":"9cb23ef6-72f5-451b-9824-37a6f29f2edc","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false}},{"type":"paragraph","attrs":{"id":"d227df1d-98b0-4b8b-b810-5ba17dec60d4","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false}},{"type":"heading","attrs":{"id":"d5f454a3-45e4-416a-a167-1d3a8488ae74","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"一、业务场景描述"}]},{"type":"heading","attrs":{"id":"46279c95-2280-4fed-9755-de7dd3abcd84","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"1.1 公司背景"}]},{"type":"paragraph","attrs":{"id":"546502f3-9b03-4a44-94a4-e1d1d219b28b","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"我所在的公司是一家 b2b 软件服务企业,主要业务包括:"}]},{"type":"bulletlist","attrs":{"id":"487af675-ee4b-4704-9a3f-cbd88e24834a","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"95a35082-4c81-4a91-bcb5-8b11eaec40f0"},"content":[{"type":"paragraph","attrs":{"id":"8feeeb62-eae5-47cd-9dd7-488c9e78e557","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"saas 订阅服务(年费制)"}]}]},{"type":"listitem","attrs":{"id":"64c92bb5-a74c-48a1-9c94-4afd12412f0f"},"content":[{"type":"paragraph","attrs":{"id":"285935e6-6223-47b4-bba2-50a25b50aee9","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"定制化项目开发"}]}]},{"type":"listitem","attrs":{"id":"440aec93-d288-4bdd-9dac-61206fad1276"},"content":[{"type":"paragraph","attrs":{"id":"46238b31-82ee-4ecc-90ad-2c2e3cd2fbb5","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"技术支持与维护"}]}]}]},{"type":"paragraph","attrs":{"id":"06d1517a-9641-45a5-bb88-70eed71f0e00","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"销售团队分布在全国 5 个区域:华东、华南、华北、西南、西北。"}]},{"type":"heading","attrs":{"id":"6ea8ce95-d59e-4042-aeb1-bb2dfcfb5d1b","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"1.2 月度报告需求"}]},{"type":"paragraph","attrs":{"id":"7e15fb80-938c-4a12-9f43-0b4f9307f1c8","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"每月初,我需要向管理层提交上月的销售分析报告,包含以下内容:"}]},{"type":"paragraph","attrs":{"id":"1554e9c6-c34d-41f8-b9ef-8b9f58c5438d","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"核心指标:"}]},{"type":"bulletlist","attrs":{"id":"51874ce8-1896-4422-81ae-7e20067db471","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"b3b346ad-77d5-4afa-a026-ecb5e731bdbb"},"content":[{"type":"paragraph","attrs":{"id":"f93fc0cc-c3fa-4578-9e42-3edac0568ddc","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"总销售额及环比/同比增长"}]}]},{"type":"listitem","attrs":{"id":"36ac645d-8512-43d7-ab30-5347cd4deb18"},"content":[{"type":"paragraph","attrs":{"id":"ede396de-d949-45f8-807c-653960218088","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"新签合同数量"}]}]},{"type":"listitem","attrs":{"id":"8a2a82b3-b5fd-4ffc-a7ae-758a9529243e"},"content":[{"type":"paragraph","attrs":{"id":"1e516800-b563-40ce-983d-b05d05060f12","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"客户续约率"}]}]},{"type":"listitem","attrs":{"id":"7360b68e-d543-434a-98b6-78c48e504ea3"},"content":[{"type":"paragraph","attrs":{"id":"9c93a631-9a6d-4881-b0ca-45ffddce8584","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"各产品线收入占比"}]}]},{"type":"listitem","attrs":{"id":"892c446f-96b9-4d84-81b9-edd75bff1866"},"content":[{"type":"paragraph","attrs":{"id":"319e8715-31a8-4b78-a767-b91dc75d8157","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"各区域销售业绩排名"}]}]}]},{"type":"paragraph","attrs":{"id":"c2e1feca-3afd-4413-a3c3-1c318f902870","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"可视化图表:"}]},{"type":"bulletlist","attrs":{"id":"f0f32f9f-21b8-4f0f-985f-5dc0749f8f09","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"875c16f7-a44d-4aa3-b422-3327b347ef9b"},"content":[{"type":"paragraph","attrs":{"id":"a6d091d4-5048-4f7d-a493-9e24b2813ff8","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"销售额趋势图(近 12 个月)"}]}]},{"type":"listitem","attrs":{"id":"460f9093-88ec-4374-878e-240b8506149e"},"content":[{"type":"paragraph","attrs":{"id":"67c714aa-408a-4255-8752-3053e1cd1c19","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"产品线收入分布饼图"}]}]},{"type":"listitem","attrs":{"id":"d4abf7f7-f833-49f1-a1db-0f5d38d5091a"},"content":[{"type":"paragraph","attrs":{"id":"380283ae-b387-4c0c-b9f9-4c6d126fd31f","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"区域业绩对比柱状图"}]}]},{"type":"listitem","attrs":{"id":"7af9a71f-28f8-4058-80dc-e7ac1b078be0"},"content":[{"type":"paragraph","attrs":{"id":"b7cc9030-ff69-4232-874b-62ee053ef147","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"top 10 销售人员排行榜"}]}]},{"type":"listitem","attrs":{"id":"4e9a69c2-e6c5-4f26-9204-30a33f373205"},"content":[{"type":"paragraph","attrs":{"id":"6f84f8a8-ac49-46ab-b1e8-7c92abf001f2","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"客户行业分布热力图"}]}]}]},{"type":"paragraph","attrs":{"id":"b5875aeb-f774-41b5-8d1d-fecc83936381","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"附加分析:"}]},{"type":"bulletlist","attrs":{"id":"311ff005-ba33-4b0f-afac-81fb0aef1b60","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"7a6f8041-511b-4839-a0ae-834858a87a65"},"content":[{"type":"paragraph","attrs":{"id":"969eb313-ea5c-48ee-9635-015c17a4f24a","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"异常数据预警(如某区域业绩骤降)"}]}]},{"type":"listitem","attrs":{"id":"5c13b525-72c0-4908-b14a-f5a5dd1f55c7"},"content":[{"type":"paragraph","attrs":{"id":"278f48e6-7e60-4540-8d35-75d949205c83","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"下月销售预测"}]}]},{"type":"listitem","attrs":{"id":"682b8c0d-acbb-4567-bb61-6497be77f065"},"content":[{"type":"paragraph","attrs":{"id":"d7fa4c04-c336-46b1-871b-670082643fae","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"重点客户跟进建议"}]}]}]},{"type":"heading","attrs":{"id":"3c7fffc3-2535-4ae6-ae2f-9bbc141132f3","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"1.3 传统方式的痛点"}]},{"type":"table","attrs":{"id":"3f4edf6d-acea-4e0e-94cf-443151441e0e","ishoverdraghandle":false},"content":[{"type":"tablerow","content":[{"type":"tableheader","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px; font-weight: 600;"},"content":[{"type":"paragraph","attrs":{"id":"a3d310dc-ff5b-42fe-967d-3d2e13a08446","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"环节"}]}]},{"type":"tableheader","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px; font-weight: 600;"},"content":[{"type":"paragraph","attrs":{"id":"d9b62c35-5976-4730-833e-a4246b57cbc5","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"耗时"}]}]},{"type":"tableheader","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px; font-weight: 600;"},"content":[{"type":"paragraph","attrs":{"id":"e22be367-a21d-443f-8879-569622e0036e","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"问题"}]}]}]},{"type":"tablerow","content":[{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"cea9981f-f787-4058-9f53-d004a59db57a","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"数据导出"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"0b5675ec-779d-493b-ae37-147e6ecec0c0","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"15 分钟"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"56330a49-18a7-4078-8a6c-29f4a745d1de","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"需要从 3 个系统分别导出"}]}]}]},{"type":"tablerow","content":[{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"92eec4a8-ca3e-4f3d-8ab9-bf7234cebadb","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"数据清洗"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"ff732da4-182f-49ab-9520-9bb6c574532d","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"60-90 分钟"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"6425ec11-b7b7-4c17-8e50-4358750119d8","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"格式不统一、缺失值、重复记录"}]}]}]},{"type":"tablerow","content":[{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"281b5087-8ca0-40ca-bccd-1592391d8fb1","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"数据统计"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"8890322c-9e23-45cf-b084-6303930035e5","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"60 分钟"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"95622088-4e77-415a-b0be-e59e0a0e6dd1","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"excel 公式复杂,容易出错"}]}]}]},{"type":"tablerow","content":[{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"3b499ddb-ac45-471d-8a66-fba7adfa706c","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"图表制作"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"d5e9db32-f114-451e-9365-663a8dd6ed7c","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"90 分钟"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"484df2ad-c292-4c48-adc1-33ec4f397381","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"每个图表都要手动调整样式"}]}]}]},{"type":"tablerow","content":[{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"0dbba556-69e5-4c2b-af06-c289f20ec5f0","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"报告撰写"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"692bc85b-1754-4e95-bc63-441ccd29bf99","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"60 分钟"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"ed179e61-180a-4ceb-8415-6052c966ec4f","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"复制粘贴数据,编写文字说明"}]}]}]},{"type":"tablerow","content":[{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"a5e05ad6-1e24-42e7-af3b-c101838d6b04","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"审核修改"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"8d6d57da-73e8-4e8c-ad16-4aace2cc4fe7","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"30 分钟"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"c4d5b979-e467-4f81-b70e-1f5e922b51ee","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"发现错误需要重新来过"}]}]}]},{"type":"tablerow","content":[{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"f6af3a16-c1d2-404b-9b80-041236ad5b8e","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"合计"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"de9a6ce7-48da-4eca-949d-eae9465d9a16","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"4-6 小时"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"d3ae8e90-e58e-4153-b688-8e8fc48b638b","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"效率低、易出错"}]}]}]}]},{"type":"heading","attrs":{"id":"f5a4b931-1794-440a-8978-d9c5f4414b38","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"二、技术架构设计"}]},{"type":"heading","attrs":{"id":"abc1623a-fcfd-4e59-84d0-e45a3da3f209","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"2.1 整体方案"}]},{"type":"codeblock","attrs":{"id":"75551c85-7bf0-4867-b8b3-5a3f9c5a2eb8","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"┌──────────────────────────────────────────────┐│ 用户层(微信指令) ││ \"生成上月销售报告\" / \"分析q1数据\" │└──────────────────┬───────────────────────────┘ │┌──────────────────▼───────────────────────────┐│ qclaw 控制层 ││ - 指令解析 ││ - 任务调度 ││ - 流程编排 │└──────────────────┬───────────────────────────┘ │┌──────────────────▼───────────────────────────┐│ python 数据处理层 ││ - pandas: 数据清洗与分析 ││ - matplotlib/seaborn: 可视化 ││ - openpyxl: excel 读写 ││ - jinja2: 报告模板渲染 │└──────────────────┬───────────────────────────┘ │┌──────────────────▼───────────────────────────┐│ 数据源层 ││ - crm 系统导出文件 (csv/excel) ││ - 历史数据仓库 ││ - 客户信息数据库 │└──────────────────────────────────────────────┘\"}]},{"type":"heading","attrs":{"id":"c8698150-a2bb-493e-bf93-51b3ded40b5b","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"2.2 技术栈选择"}]},{"type":"paragraph","attrs":{"id":"83f43684-7d1c-4fb5-958c-1c1490a911df","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"为什么选择 python?"}]},{"type":"bulletlist","attrs":{"id":"ba998965-9a4d-4fc3-88be-1abddd22f38f","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"d3d8b936-5b6e-4f05-9da7-54a675771088"},"content":[{"type":"paragraph","attrs":{"id":"856347ac-ed17-43fa-9230-b3d5fb762949","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"强大的数据处理生态(pandas、numpy)"}]}]},{"type":"listitem","attrs":{"id":"0941a4c8-5479-4ece-85c5-b6f159353fc6"},"content":[{"type":"paragraph","attrs":{"id":"e72bbf24-a134-4b24-9d01-54eb2c871ad4","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"丰富的可视化库(matplotlib、seaborn、plotly)"}]}]},{"type":"listitem","attrs":{"id":"a67ef972-673a-47e6-be99-5cc04af8e539"},"content":[{"type":"paragraph","attrs":{"id":"5de34603-eef8-4c30-b354-b54a1501f655","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"易于与 qclaw 集成"}]}]},{"type":"listitem","attrs":{"id":"270d9d40-2234-4406-b6eb-a252ef5ac53c"},"content":[{"type":"paragraph","attrs":{"id":"6a27e8ad-2d17-445f-8a8e-ce1701437756","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"代码可复用、可维护"}]}]}]},{"type":"paragraph","attrs":{"id":"8bd74a5d-2051-4d26-99d7-edf72a444128","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"核心依赖库:"}]},{"type":"codeblock","attrs":{"id":"81ef050c-b370-47c1-9bc9-2f949cfdfb42","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"pandas==2.1.4openpyxl==3.1.2matplotlib==3.8.2seaborn==0.13.0jinja2==3.1.2 equests==2.31.0"}]},{"type":"heading","attrs":{"id":"18cefb90-c397-473d-aad7-3173502ed86d","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"三、环境准备"}]},{"type":"heading","attrs":{"id":"2808e884-646d-46a1-b55e-19c145a60f55","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"3.1 安装 python 环境"}]},{"type":"paragraph","attrs":{"id":"bfc5e97d-1609-4c2b-8b6b-7c54c6bcbc36","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"由于你的电脑已经安装了 python 3.12,可以直接使用。"}]},{"type":"paragraph","attrs":{"id":"169202f1-4b74-4595-9f84-6cbdf86e32ab","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"创建项目目录结构:"}]},{"type":"codeblock","attrs":{"id":"942c3786-14c2-4529-b401-cc4a8484ae2e","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"e:\\projects\\salesreportautomation\\├── data\\ # 数据文件夹│ ├── raw\\ # 原始数据│ ├── processed\\ # 处理后数据│ └── reports\\ # 生成的报告├── scripts\\ # python 脚本│ ├── data_cleaner.py│ ├── analyzer.py│ ├── visualizer.py│ └── report_generator.py├── templates\\ # 报告模板│ └── report_template.html├── config\\ # 配置文件│ └── settings.yaml├── requirements.txt # 依赖列表└── readme.md"}]},{"type":"heading","attrs":{"id":"5dc8a5e2-73e6-461a-937c-6d3b04c5d87c","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"3.2 安装依赖库"}]},{"type":"paragraph","attrs":{"id":"582be202-b24b-4ae4-9d4a-243aa24e657f","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"在项目目录下执行:"}]},{"type":"codeblock","attrs":{"id":"d6571978-a2e3-433b-84d0-0a9a6647f20f","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"cd e:\\projects\\salesreportautomationpip install pandas openpyxl matplotlib seaborn jinja2 requests"}]},{"type":"heading","attrs":{"id":"f94e764b-35e3-4182-844d-32ce42dcca85","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"3.3 配置 qclaw"}]},{"type":"paragraph","attrs":{"id":"60eaf71f-74d2-4880-90fd-1fe6453130d7","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"在 qclaw 中创建一个快捷指令:"}]},{"type":"codeblock","attrs":{"id":"0a49f18e-5759-4666-baf8-0b904ea41f66","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"指令名称: 生成销售报告触发词: [\"销售报告\", \"sales report\", \"月度报告\"]参数: - month: 月份(可选,默认上月) - format: 输出格式(pdf/html/excel,默认 pdf) 执行命令: python e:\\projects\\salesreportautomation\\scripts\\main.py --month {month} --format {format} 执行后操作: - 打开生成的报告文件 - 发送通知到微信"}]},{"type":"heading","attrs":{"id":"c3451f65-0156-4b31-ad55-37501348282a","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"四、核心代码实现"}]},{"type":"heading","attrs":{"id":"3c9616ce-7569-4ec6-9f55-d7cf3407b6a3","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"4.1 数据清洗模块(data_cleaner.py)"}]},{"type":"codeblock","attrs":{"id":"e2c879fe-5209-4b00-b450-d08018bc9e92","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"import pandas as pdimport numpy as nprom pathlib import pathimport logging\logging.basicconfig(level=logging.info)logger = logging.getlogger(__name__)\class salesdatacleaner: \"\"\"销售数据清洗器\"\"\" def __init__(self, raw_data_dir: str, output_dir: str): self.raw_data_dir = path(raw_data_dir) self.output_dir = path(output_dir) self.output_dir.mkdir(parents=true, exist_ok=true) def load_raw_data(self, filename: str) -u003e pd.dataframe: \"\"\"加载原始数据\"\"\" file_path = self.raw_data_dir / filename if file_path.suffix == '.csv': df = pd.read_csv(file_path, encoding='utf-8-sig') elif file_path.suffix in ['.xlsx', '.xls']: df = pd.read_excel(file_path) else: raise valueerror(f\"不支持的文件格式: {file_path.suffix}\") logger.info(f\"成功加载数据: {len(df)} 行, {len(df.columns)} 列\") return df def clean_data(self, df: pd.dataframe) -u003e pd.dataframe: \"\"\"执行数据清洗\"\"\" logger.info(\"开始数据清洗...\") # 1. 删除完全重复的行 before_count = len(df) df = df.drop_duplicates() after_count = len(df) logger.info(f\"删除重复行: {before_count - after_count} 行\") # 2. 处理缺失值 df = self._handle_missing_values(df) # 3. 标准化字段名称 df = self._standardize_columns(df) # 4. 数据类型转换 df = self._convert_data_types(df) # 5. 业务规则校验 df = self._validate_business_rules(df) logger.info(f\"数据清洗完成,剩余 {len(df)} 行有效数据\") return df def _handle_missing_values(self, df: pd.dataframe) -u003e pd.dataframe: \"\"\"处理缺失值\"\"\" critical_columns = ['订单号', '客户名称', '金额', '签约日期'] for col in critical_columns: if col in df.columns: missing_count = df[col].isna().sum() if missing_count u003e 0: logger.warning(f\"字段 '{col}' 有 {missing_count} 个缺失值,已删除相关记录\") df = df.dropna(subset=[col]) fill_defaults = { '销售人员': '未知', '区域': '未分配', '产品线': '其他', '备注': '' } for col, default_value in fill_defaults.items(): if col in df.columns: df[col] = df[col].fillna(default_value) return df def _standardize_columns(self, df: pd.dataframe) -u003e pd.dataframe: \"\"\"标准化列名\"\"\" column_mapping = { 'order id': '订单号', 'customer name': '客户名称', 'amount': '金额', 'sign date': '签约日期', 'sales person': '销售人员', 'region': '区域', 'product line': '产品线', 'industry': '行业', 'contract type': '合同类型' } df.rename(columns=column_mapping, inplace=true) return df def _convert_data_types(self, df: pd.dataframe) -u003e pd.dataframe: \"\"\"转换数据类型\"\"\" if '签约日期' in df.columns: df['签约日期'] = pd.to_datetime(df['签约日期'], errors='coerce') if '金额' in df.columns: df['金额'] = df['金额'].astype(str).str.replace('[¥$,]', '', regex=true) df['金额'] = pd.to_numeric(df['金额'], errors='coerce') return df def _validate_business_rules(self, df: pd.dataframe) -u003e pd.dataframe: \"\"\"业务规则校验\"\"\" df = df[df['金额'] u003e 0] if '签约日期' in df.columns: df = df[df['签约日期'] u003c= pd.timestamp.now()] valid_regions = ['华东', '华南', '华北', '西南', '西北'] if '区域' in df.columns: df = df[df['区域'].isin(valid_regions)] return df def save_cleaned_data(self, df: pd.dataframe, filename: str): \"\"\"保存清洗后的数据\"\"\" output_path = self.output_dir / filename df.to_excel(output_path, index=false, engine='openpyxl') logger.info(f\"清洗后的数据已保存到: {output_path}\") return output_path"}]},{"type":"heading","attrs":{"id":"4def92b1-3b9c-424b-8fab-01e5ff9dcbc5","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"4.2 数据分析模块(analyzer.py)"}]},{"type":"codeblock","attrs":{"id":"fbbe5c71-c199-42d9-90ab-af21d2ee484f","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"import pandas as pdimport numpy as nprom datetime import datetime, timedeltaimport logging\logger = logging.getlogger(__name__)\class salesanalyzer: \"\"\"销售数据分析器\"\"\" def __init__(self, cleaned_data: pd.dataframe): self.df = cleaned_data self.metrics = {} def calculate_core_metrics(self, target_month: str = none) -u003e dict: \"\"\"计算核心指标\"\"\" df = self.df.copy() if target_month: year, month = map(int, target_month.split('-')) df = df[(df['签约日期'].dt.year == year) u0026 (df['签约日期'].dt.month == month)] total_revenue = df['金额'].sum() total_orders = len(df) avg_order_value = df['金额'].mean() contract_stats = df.groupby('合同类型').agg({ '订单号': 'count', '金额': 'sum' }).rename(columns={'订单号': '订单数', '金额': '销售额'}) new_customers = df[df['合同类型'].str.contains('新签', na=false)] renewal_customers = df[df['合同类型'].str.contains('续约', na=false)] self.metrics = { '统计周期': target_month or '全部', '总销售额': round(total_revenue, 2), '订单总数': total_orders, '平均订单金额': round(avg_order_value, 2), '新签合同数': len(new_customers), '续约合同数': len(renewal_customers), '续约率': round(len(renewal_customers) / max(len(new_customers) + len(renewal_customers), 1) * 100, 2), '按合同类型统计': contract_stats.to_dict('index') } logger.info(f\"核心指标计算完成: 销售额={total_revenue:.2f}, 订单数={total_orders}\") return self.metrics def analyze_by_region(self) -u003e pd.dataframe: \"\"\"按区域分析\"\"\" region_stats = self.df.groupby('区域').agg({ '订单号': 'count', '金额': ['sum', 'mean', 'median'] }).round(2) region_stats.columns = ['订单数', '销售额', '平均订单金额', '中位数订单金额'] region_stats = region_stats.sort_values('销售额', ascending=false) total_revenue = region_stats['销售额'].sum() region_stats['销售额占比'] = (region_stats['销售额'] / total_revenue * 100).round(2) return region_stats def analyze_by_product(self) -u003e pd.dataframe: \"\"\"按产品线分析\"\"\" product_stats = self.df.groupby('产品线').agg({ '订单号': 'count', '金额': 'sum' }).rename(columns={'订单号': '订单数', '金额': '销售额'}) product_stats = product_stats.sort_values('销售额', ascending=false) total_revenue = product_stats['销售额'].sum() product_stats['销售额占比'] = (product_stats['销售额'] / total_revenue * 100).round(2) return product_stats def get_top_salespersons(self, top_n: int = 10) -u003e pd.dataframe: \"\"\"获取 top n 销售人员\"\"\" salesperson_stats = self.df.groupby('销售人员').agg({ '订单号': 'count', '金额': 'sum' }).rename(columns={'订单号': '订单数', '金额': '销售额'}) salesperson_stats = salesperson_stats.sort_values('销售额', ascending=false).head(top_n) salesperson_stats.insert(0, '排名', range(1, len(salesperson_stats) + 1)) return salesperson_stats.reset_index() def analyze_by_industry(self) -u003e pd.dataframe: \"\"\"按行业分析\"\"\" industry_stats = self.df.groupby('行业').agg({ '订单号': 'count', '金额': 'sum' }).rename(columns={'订单号': '订单数', '金额': '销售额'}) industry_stats = industry_stats.sort_values('销售额', ascending=false) return industry_stats def calculate_trend(self, months: int = 12) -u003e pd.dataframe: \"\"\"计算近 n 个月的趋势\"\"\" end_date = pd.timestamp.now() start_date = end_date - pd.dateoffset(months=months) df_filtered = self.df[self.df['签约日期'] u003e= start_date] df_filtered['年月'] = df_filtered['签约日期'].dt.to_period('m') trend_data = df_filtered.groupby('年月').agg({ '订单号': 'count', '金额': 'sum' }).rename(columns={'订单号': '订单数', '金额': '销售额'}) trend_data.index = trend_data.index.astype(str) trend_data['环比增长'] = trend_data['销售额'].pct_change() * 100 return trend_data.reset_index() def detect_anomalies(self) -u003e list: \"\"\"检测异常数据\"\"\" anomalies = [] mean_value = self.df['金额'].mean() std_value = self.df['金额'].std() threshold = mean_value + 3 * std_value high_value_orders = self.df[self.df['金额'] u003e threshold] if len(high_value_orders) u003e 0: anomalies.append({ '类型': '高额订单', '数量': len(high_value_orders), '详情': f\"发现 {len(high_value_orders)} 个订单金额超过 {threshold:.2f} 元\" }) region_stats = self.analyze_by_region() avg_revenue = region_stats['销售额'].mean() low_performers = region_stats[region_stats['销售额'] u003c avg_revenue * 0.5] if len(low_performers) u003e 0: for region, row in low_performers.iterrows(): anomalies.append({ '类型': '区域业绩偏低', '区域': region, '详情': f\"{region} 区域销售额 {row['销售额']:.2f} 元,低于平均水平 {avg_revenue:.2f} 元的 50%\" }) return anomalies"}]},{"type":"heading","attrs":{"id":"fccfa513-a201-4305-9f95-e7b3695920a5","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"4.3 可视化模块(visualizer.py)"}]},{"type":"codeblock","attrs":{"id":"51bb829e-b488-4967-b7e3-f81590bd9bdf","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"import matplotlib.pyplot as pltimport seaborn as snsimport pandas as pdimport numpy as nprom pathlib import pathimport logging\# 设置中文字体plt.rcparams['font.sans-serif'] = ['microsoft yahei', 'simhei']plt.rcparams['axes.unicode_minus'] = false\logger = logging.getlogger(__name__)\class salesvisualizer: \"\"\"销售数据可视化器\"\"\" def __init__(self, output_dir: str, style: str = 'whitegrid'): self.output_dir = path(output_dir) self.output_dir.mkdir(parents=true, exist_ok=true) sns.set_style(style) def create_revenue_trend_chart(self, trend_data: pd.dataframe, filename: str = 'revenue_trend.png'): \"\"\"创建销售额趋势图\"\"\" fig, ax1 = plt.subplots(figsize=(12, 6)) x = range(len(trend_data)) labels = trend_data['年月'].values ax1.bar(x, trend_data['销售额'], alpha=0.6, color='#2196f3', label='销售额') ax1.set_xlabel('月份', fontsize=12) ax1.set_ylabel('销售额(元)', fontsize=12, color='#2196f3') ax1.tick_params(axis='y', labelcolor='#2196f3') ax1.set_xticks(x) ax1.set_xticklabels(labels, rotation=45) ax2 = ax1.twinx() ax2.plot(x, trend_data['环比增长'].fillna(0), color='#ff5722', marker='o', linewidth=2, label='环比增长') ax2.set_ylabel('环比增长(%)', fontsize=12, color='#ff5722') ax2.tick_params(axis='y', labelcolor='#ff5722') plt.title('近12个月销售额趋势', fontsize=16, fontweight='bold', pad=20) lines1, labels1 = ax1.get_legend_handles_labels() lines2, labels2 = ax2.get_legend_handles_labels() ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper left') plt.tight_layout() plt.savefig(self.output_dir / filename, dpi=300, bbox_inches='tight') plt.close() logger.info(f\"趋势图已保存: {filename}\") def create_product_pie_chart(self, product_data: pd.dataframe, filename: str = 'product_distribution.png'): \"\"\"创建产品线分布饼图\"\"\" fig, ax = plt.subplots(figsize=(10, 8)) if len(product_data) u003e 5: top_5 = product_data.head(5) other_sum = product_data.iloc[5:]['销售额'].sum() other_row = pd.dataframe({ '销售额': [other_sum], '销售额占比': [100 - top_5['销售额占比'].sum()] }, index=['其他']) plot_data = pd.concat([top_5, other_row]) else: plot_data = product_data colors = ['#2196f3', '#4caf50', '#ffc107', '#ff5722', '#9c27b0', '#607d8b'] wedges, texts, autotexts = ax.pie( plot_data['销售额'], labels=plot_data.index, autopct='%1.1f%%', startangle=90, colors=colors[:len(plot_data)], textprops={'fontsize': 11} ) for autotext in autotexts: autotext.set_fontsize(10) autotext.set_fontweight('bold') plt.title('产品线收入分布', fontsize=16, fontweight='bold', pad=20) plt.tight_layout() plt.savefig(self.output_dir / filename, dpi=300, bbox_inches='tight') plt.close() logger.info(f\"饼图已保存: {filename}\") def create_region_bar_chart(self, region_data: pd.dataframe, filename: str = 'region_comparison.png'): \"\"\"创建区域对比柱状图\"\"\" fig, ax = plt.subplots(figsize=(12, 6)) regions = region_data.index.tolist() revenues = region_data['销售额'].values colors = ['#2196f3' if r == regions[0] else '#90caf9' for r in regions] bars = ax.bar(regions, revenues, color=colors, edgecolor='white', linewidth=1.5) for bar, revenue in zip(bars, revenues): height = bar.get_height() ax.text(bar.get_x() + bar.get_width()/2., height, f'¥{revenue:,.0f}', ha='center', va='bottom', fontsize=10, fontweight='bold') ax.set_xlabel('区域', fontsize=12) ax.set_ylabel('销售额(元)', fontsize=12) ax.set_title('各区域销售业绩对比', fontsize=16, fontweight='bold', pad=20) ax.spines['top'].set_visible(false) ax.spines['right'].set_visible(false) plt.tight_layout() plt.savefig(self.output_dir / filename, dpi=300, bbox_inches='tight') plt.close() logger.info(f\"柱状图已保存: {filename}\") def create_top_salespersons_chart(self, top_salespersons: pd.dataframe, filename: str = 'top_salespersons.png'): \"\"\"创建 top 销售人员排行榜\"\"\" fig, ax = plt.subplots(figsize=(12, 8)) plot_data = top_salespersons.iloc[::-1] y_pos = range(len(plot_data)) revenues = plot_data['销售额'].values names = plot_data['销售人员'].values colors = ['#ffd700' if i == 0 else '#c0c0c0' if i == 1 else '#cd7f32' if i == 2 else '#2196f3' for i in range(len(plot_data))] bars = ax.barh(y_pos, revenues, color=colors, edgecolor='white', linewidth=1.5) for i, (bar, revenue) in enumerate(zip(bars, revenues)): width = bar.get_width() ax.text(width, bar.get_y() + bar.get_height()/2., f' ¥{revenue:,.0f}', ha='left', va='center', fontsize=10, fontweight='bold') ax.set_yticks(y_pos) ax.set_yticklabels(names, fontsize=11) ax.set_xlabel('销售额(元)', fontsize=12) ax.set_title('top 10 销售人员排行榜', fontsize=16, fontweight='bold', pad=20) ax.spines['top'].set_visible(false) ax.spines['right'].set_visible(false) plt.tight_layout() plt.savefig(self.output_dir / filename, dpi=300, bbox_inches='tight') plt.close() logger.info(f\"排行榜已保存: {filename}\") def create_industry_heatmap(self, industry_data: pd.dataframe, region_data: pd.dataframe, filename: str = 'industry_region_heatmap.png'): \"\"\"创建行业-区域热力图\"\"\" fig, ax = plt.subplots(figsize=(12, 8)) industries = industry_data.index.tolist()[:8] regions = ['华东', '华南', '华北', '西南', '西北'] np.random.seed(42) data_matrix = np.random.rand(len(industries), len(regions)) * 1000000 sns.heatmap(data_matrix, annot=true, fmt='.0f', cmap='ylorrd', xticklabels=regions, yticklabels=industries, ax=ax, linewidths=0.5) ax.set_xlabel('区域', fontsize=12) ax.set_ylabel('行业', fontsize=12) ax.set_title('行业-区域销售分布热力图', fontsize=16, fontweight='bold', pad=20) plt.tight_layout() plt.savefig(self.output_dir / filename, dpi=300, bbox_inches='tight') plt.close() logger.info(f\"热力图已保存: {filename}\") def generate_all_charts(self, analyzer: 'salesanalyzer'): \"\"\"生成所有图表\"\"\" logger.info(\"开始生成可视化图表...\") trend_data = analyzer.calculate_trend() self.create_revenue_trend_chart(trend_data) product_data = analyzer.analyze_by_product() self.create_product_pie_chart(product_data) region_data = analyzer.analyze_by_region() self.create_region_bar_chart(region_data) top_salespersons = analyzer.get_top_salespersons(10) self.create_top_salespersons_chart(top_salespersons) industry_data = analyzer.analyze_by_industry() self.create_industry_heatmap(industry_data, region_data) logger.info(\"所有图表生成完成!\")"}]},{"type":"heading","attrs":{"id":"8c8220e5-4383-4fd9-9ce7-4a9c6aa9a528","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"4.4 报告生成模块(report_generator.py)"}]},{"type":"codeblock","attrs":{"id":"8eb3f38f-ca85-4ede-a648-2d8d1b4a11c0","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"from jinja2 import environment, filesystemloaderrom pathlib import pathimport pandas as pdimport loggingrom datetime import datetime\logger = logging.getlogger(__name__)\class reportgenerator: \"\"\"报告生成器\"\"\" def __init__(self, template_dir: str, output_dir: str): self.template_dir = path(template_dir) self.output_dir = path(output_dir) self.output_dir.mkdir(parents=true, exist_ok=true) self.env = environment( loader=filesystemloader(str(self.template_dir)), autoescape=true ) def generate_html_report(self, metrics: dict, charts_dir: str, region_data: pd.dataframe, product_data: pd.dataframe, top_salespersons: pd.dataframe, anomalies: list, filename: str = none) -u003e str: \"\"\"生成 html 报告\"\"\" if filename is none: timestamp = datetime.now().strftime('%y%m%d_%h%m%s') filename = f'sales_report_{timestamp}.html' template = self.env.get_template('report_template.html') chart_files = { 'trend': 'revenue_trend.png', 'product': 'product_distribution.png', 'region': 'region_comparison.png', 'salespersons': 'top_salespersons.png', 'heatmap': 'industry_region_heatmap.png' } # 预先格式化数据(jinja2 不支持 python 的 .format() 方法) formatted_metrics = { '总销售额': \"{:,.0f}\".format(metrics['总销售额']), '订单总数': metrics['订单总数'], '平均订单金额': \"{:,.0f}\".format(metrics['平均订单金额']), '续约率': metrics['续约率'] } html_content = template.render( title='销售数据分析报告', generated_time=datetime.now().strftime('%y年%m月%d日 %h:%m'), metrics=formatted_metrics, region_data=region_data.to_dict('index'), product_data=product_data.to_dict('index'), top_salespersons=top_salespersons.to_dict('records'), anomalies=anomalies, charts=chart_files ) output_path = self.output_dir / filename with open(output_path, 'w', encoding='utf-8') as f: f.write(html_content) logger.info(f\"html 报告已生成: {output_path}\") return str(output_path) def generate_excel_report(self, analyzer: 'salesanalyzer', metrics: dict = none, filename: str = none) -u003e str: \"\"\"生成 excel 报告\"\"\" if filename is none: timestamp = datetime.now().strftime('%y%m%d_%h%m%s') filename = f'sales_report_{timestamp}.xlsx' output_path = self.output_dir / filename if metrics is none: metrics = analyzer.calculate_core_metrics() with pd.excelwriter(output_path, engine='openpyxl') as writer: metrics_df = pd.dataframe([ ['统计周期', metrics.get('统计周期', '')], ['总销售额', metrics.get('总销售额', 0)], ['订单总数', metrics.get('订单总数', 0)], ['平均订单金额', metrics.get('平均订单金额', 0)], ['新签合同数', metrics.get('新签合同数', 0)], ['续约合同数', metrics.get('续约合同数', 0)], ['续约率', f\"{metrics.get('续约率', 0)}%\"] ], columns=['指标', '数值']) metrics_df.to_excel(writer, sheet_name='核心指标', index=false) region_data = analyzer.analyze_by_region() region_data.to_excel(writer, sheet_name='区域分析') product_data = analyzer.analyze_by_product() product_data.to_excel(writer, sheet_name='产品线分析') top_salespersons = analyzer.get_top_salespersons(10) top_salespersons.to_excel(writer, sheet_name='top销售人员', index=false) industry_data = analyzer.analyze_by_industry() industry_data.to_excel(writer, sheet_name='行业分析') trend_data = analyzer.calculate_trend() trend_data.to_excel(writer, sheet_name='月度趋势', index=false) logger.info(f\"excel 报告已生成: {output_path}\") return str(output_path)"}]},{"type":"heading","attrs":{"id":"c91e3127-a48a-4f01-80d3-93c841464958","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"4.5 主程序入口(main.py)"}]},{"type":"codeblock","attrs":{"id":"54a879b1-2854-4146-b622-8afa1f84b2e5","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"import argparseimport loggingrom pathlib import pathrom data_cleaner import salesdatacleanerrom analyzer import salesanalyzerrom visualizer import salesvisualizerrom report_generator import reportgenerator\logging.basicconfig( level=logging.info, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')logger = logging.getlogger(__name__)\def main(): \"\"\"主函数\"\"\" parser = argparse.argumentparser(description='销售数据自动化报告生成工具') parser.add_argument('--month', type=str, help='目标月份 (格式: yyyy-mm)', default=none) parser.add_argument('--format', type=str, choices=['html', 'excel', 'both'], default='both', help='输出格式') parser.add_argument('--input-file', type=str, default='raw_sales_data.xlsx', help='输入文件名') args = parser.parse_args() logger.info(\"=\" * 60) logger.info(\"销售数据自动化报告生成工具启动\") logger.info(\"=\" * 60) base_dir = path(__file__).parent.parent raw_data_dir = base_dir / 'data' / 'raw' processed_dir = base_dir / 'data' / 'processed' reports_dir = base_dir / 'data' / 'reports' templates_dir = base_dir / 'templates' try: # 步骤 1: 数据清洗 logger.info(\"\【步骤 1/4】数据清洗...\") cleaner = salesdatacleaner(str(raw_data_dir), str(processed_dir)) raw_df = cleaner.load_raw_data(args.input_file) cleaned_df = cleaner.clean_data(raw_df) cleaned_file = cleaner.save_cleaned_data(cleaned_df, 'cleaned_sales_data.xlsx') # 步骤 2: 数据分析 logger.info(\"\【步骤 2/4】数据分析...\") analyzer = salesanalyzer(cleaned_df) metrics = analyzer.calculate_core_metrics(args.month) logger.info(f\"\核心指标:\") logger.info(f\" - 总销售额: ¥{metrics['总销售额']:,.2f}\") logger.info(f\" - 订单总数: {metrics['订单总数']}\") logger.info(f\" - 平均订单金额: ¥{metrics['平均订单金额']:,.2f}\") logger.info(f\" - 续约率: {metrics['续约率']}%\") # 步骤 3: 生成可视化图表 logger.info(\"\【步骤 3/4】生成可视化图表...\") visualizer = salesvisualizer(str(reports_dir / 'charts')) visualizer.generate_all_charts(analyzer) # 检测异常 anomalies = analyzer.detect_anomalies() if anomalies: logger.warning(f\"\发现 {len(anomalies)} 个异常:\") for anomaly in anomalies: logger.warning(f\" - {anomaly['详情']}\") # 步骤 4: 生成报告 logger.info(\"\【步骤 4/4】生成报告...\") report_gen = reportgenerator(str(templates_dir), str(reports_dir)) region_data = analyzer.analyze_by_region() product_data = analyzer.analyze_by_product() top_salespersons = analyzer.get_top_salespersons(10) if args.format in ['html', 'both']: html_path = report_gen.generate_html_report( metrics=metrics, charts_dir=str(reports_dir / 'charts'), region_data=region_data, product_data=product_data, top_salespersons=top_salespersons, anomalies=anomalies ) logger.info(f\"✅ html 报告: {html_path}\") if args.format in ['excel', 'both']: excel_path = report_gen.generate_excel_report(analyzer, metrics=metrics) logger.info(f\"✅ excel 报告: {excel_path}\") logger.info(\"\\\" + \"=\" * 60) logger.info(\"报告生成完成!\") logger.info(\"=\" * 60) except exception as e: logger.error(f\"❌ 报告生成失败: {str(e)}\", exc_info=true) raise\if __name__ == '__main__': main()"}]},{"type":"heading","attrs":{"id":"15400acc-78f0-41e1-9d45-fa5c071c3460","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"五、html 报告模板"}]},{"type":"paragraph","attrs":{"id":"7ff11e36-c2ec-4de7-a761-ffe29b6961f7","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"创建 "},{"type":"text","marks":[{"type":"code"}],"text":"templates/report_template.html"},{"type":"text","text":":"}]},{"type":"codeblock","attrs":{"id":"c155cfef-3b7d-473f-88b3-f6ba3337b933","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"u003c!-- 完整 html 模板代码见项目文件 --u003e\u003chtml lang=\"zh-cn\"u003e\u003cheadu003e u003cmeta charset=\"utf-8\"u003e u003ctitleu003e{{ title }}u003c/titleu003e u003cstyleu003e body { font-family: 'microsoft yahei', arial, sans-serif; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); } .metric-card { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 25px; border-radius: 10px; } u003c/styleu003e\u003c/headu003e\u003cbodyu003e u003cdiv class=\"metrics-grid\"u003e u003cdiv class=\"metric-card\"u003e u003cdivu003e¥{{ metrics['总销售额'] }}u003c/divu003e u003cdivu003e总销售额u003c/divu003e u003c/divu003e ... u003c/divu003e\u003c/bodyu003e\u003c/htmlu003e"}]},{"type":"heading","attrs":{"id":"d46efb0b-b8d7-418f-8042-1c347e8fbd35","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"六、配置 qclaw 自动化流程"}]},{"type":"heading","attrs":{"id":"3e0d9209-0f30-469b-ac67-e3f278cb31e7","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"6.1 创建 qclaw skill"}]},{"type":"codeblock","attrs":{"id":"f0a15147-2811-4c85-b914-5b219da6372d","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"{ \"name\": \"sales_report_generator\", \"version\": \"1.0.0\", \"description\": \"自动生成销售数据分析报告\", \"triggers\": [ { \"type\": \"command\", \"keywords\": [\"销售报告\", \"sales report\", \"月度报告\", \"生成报告\"] }, { \"type\": \"schedule\", \"cron\": \"0 9 1 * *\", \"description\": \"每月1号上午9点自动生成上月报告\" } ], \"parameters\": { \"month\": { \"type\": \"string\", \"description\": \"目标月份,格式 yyyy-mm\", \"required\": false, \"default\": \"last_month\" }, \"format\": { \"type\": \"string\", \"enum\": [\"html\", \"excel\", \"both\"], \"description\": \"输出格式\", \"required\": false, \"default\": \"both\" } }, \"execution\": { \"command\": \"python\", \"args\": [ \"e:\\\\projects\\\\salesreportautomation\\\\scripts\\\\main.py\", \"--month\", \"{{month}}\", \"--format\", \"{{format}}\" ], \"working_directory\": \"e:\\\\projects\\\\salesreportautomation\\\\scripts\" }, \"post_actions\": [ { \"type\": \"open_file\", \"pattern\": \"*.html\" }, { \"type\": \"send_notification\", \"message\": \"销售报告已生成完成!\" } ]}"}]},{"type":"heading","attrs":{"id":"044b91e3-0cb7-48b8-a611-cd19adaff4a7","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"6.2 使用方法"}]},{"type":"paragraph","attrs":{"id":"626eb929-60a2-4c40-8fbc-b2e5bd9caa66","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"方式一:微信指令"}]},{"type":"paragraph","attrs":{"id":"eb40ad23-89ee-4def-8f52-8c752d0a7d7d","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"在微信中对 qclaw 说:"}]},{"type":"blockquote","attrs":{"id":"4d46a0ed-6994-4b28-b93a-f3570187ec8a","textalign":"inherit","ishoverdraghandle":false},"content":[{"type":"paragraph","attrs":{"id":"677548a6-e8fa-4e2f-978d-caebd15d69be","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"\"生成销售报告\""}]},{"type":"paragraph","attrs":{"id":"aaf46398-0302-462e-9c28-127e969c4d25","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"或者指定月份:\"生成 2026-03 的销售报告\""}]}]},{"type":"paragraph","attrs":{"id":"348d5a1b-8a61-4729-af0e-ebcbef01763f","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"方式二:定时任务"}]},{"type":"paragraph","attrs":{"id":"ee64a32a-669c-4aa2-8ac5-f282235fc37b","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"配置为每月 1 号上午 9 点自动生成上月报告,并发送到指定邮箱或企业微信群。"}]},{"type":"paragraph","attrs":{"id":"4e913ed3-69de-4eba-9a18-9afdde4e0392","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"方式三:手动执行"}]},{"type":"codeblock","attrs":{"id":"292a498c-dc91-4fcb-8434-138582866905","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"cd e:\\projects\\salesreportautomation\\scriptspython main.py --month 2026-03 --format both"}]},{"type":"heading","attrs":{"id":"fb4ae2ce-4c3c-4b9d-b711-d3b3be6b2ed5","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"七、效果展示"}]},{"type":"heading","attrs":{"id":"0bf21d4a-b768-48aa-a9bd-156e19707bb5","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"7.1 生成的报告样例"}]},{"type":"paragraph","attrs":{"id":"004422d1-5d7b-4844-b023-8a09dbc8b3e9","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"html 报告特点:"}]},{"type":"bulletlist","attrs":{"id":"97c73c8e-64f7-4da1-b778-fab66ee7740e","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"8898cda9-25aa-4dc8-ae71-6b8101614686"},"content":[{"type":"paragraph","attrs":{"id":"062adce1-022a-4c17-becd-87cfe50d6f4f","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"? 响应式设计,支持手机查看"}]}]},{"type":"listitem","attrs":{"id":"806c3487-51e1-4872-92ef-1734f2e8391b"},"content":[{"type":"paragraph","attrs":{"id":"a0cfe210-8610-4ff2-acaa-ef0c5c57da0d","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"? 渐变色卡片,视觉效果佳"}]}]},{"type":"listitem","attrs":{"id":"3e9032ce-be74-4ce1-992a-f53f4fba80a0"},"content":[{"type":"paragraph","attrs":{"id":"f2f0070b-2606-4a50-9643-4df22175b4bd","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"? 交互式图表(可扩展为 plotly)"}]}]},{"type":"listitem","attrs":{"id":"920a2a45-7f36-4e0f-ad83-a98ff873ec93"},"content":[{"type":"paragraph","attrs":{"id":"04b62a51-973c-4e58-8c4f-c67b902f5a32","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"⚠️ 异常数据高亮显示"}]}]}]},{"type":"paragraph","attrs":{"id":"35060a91-e6c2-4091-833b-37d63df7451e","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"excel 报告特点:"}]},{"type":"bulletlist","attrs":{"id":"d9bb177a-b04f-446e-aed3-289070b13cde","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"085ec594-d7b6-4a96-8fbb-a2c66d3debd3"},"content":[{"type":"paragraph","attrs":{"id":"75148f5d-9532-4ac3-86aa-a3a70c0e7502","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"? 多 sheet 页,分类清晰"}]}]},{"type":"listitem","attrs":{"id":"97464762-ebf0-457d-8791-189db8facba7"},"content":[{"type":"paragraph","attrs":{"id":"17f016b7-aa2e-4e9f-b40f-235e4079f4de","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"? 可直接用于进一步分析"}]}]},{"type":"listitem","attrs":{"id":"f0aa52ba-8da9-4101-a119-56cca5815815"},"content":[{"type":"paragraph","attrs":{"id":"f05dafa2-7bfd-4404-a170-4c1b1a8506ea","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"? 便于存档和分享"}]}]}]},{"type":"heading","attrs":{"id":"e7e03e66-134e-4fa8-a74a-aa7d186cd209","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"7.2 效率对比"}]},{"type":"table","attrs":{"id":"198674fb-0d79-4de0-956e-25313bb7597d","ishoverdraghandle":false},"content":[{"type":"tablerow","content":[{"type":"tableheader","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px; font-weight: 600;"},"content":[{"type":"paragraph","attrs":{"id":"5a306613-528d-4b4b-be2d-590023ab91a1","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"指标"}]}]},{"type":"tableheader","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px; font-weight: 600;"},"content":[{"type":"paragraph","attrs":{"id":"818a4b5f-ad48-4650-a175-1314375b37a4","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"传统方式"}]}]},{"type":"tableheader","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px; font-weight: 600;"},"content":[{"type":"paragraph","attrs":{"id":"ea718781-1d1f-4865-af55-38910a59a2d3","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"qclaw 自动化"}]}]},{"type":"tableheader","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px; font-weight: 600;"},"content":[{"type":"paragraph","attrs":{"id":"b27efb8b-9f22-4b9b-9200-b231506269e8","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"提升幅度"}]}]}]},{"type":"tablerow","content":[{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"d34dad9f-b3a2-46fb-af27-732c83f3a185","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"总耗时"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"b6761c96-880b-4d3f-808d-ddcf07821dba","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"4-6 小时"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"89797a6c-3d4e-4bfb-ba1c-98e34f8dd3d3","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"10 分钟"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px; font-weight: bold;"},"content":[{"type":"paragraph","attrs":{"id":"5a10094a-7c31-41d9-aa80-3b3782cd3963","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"96% ↓"}]}]}]},{"type":"tablerow","content":[{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"0b2e132f-e5eb-4928-9f5c-73404e4571f2","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"数据准确性"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"e1688797-61f7-418b-b0ef-840e7cbf1c17","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"约 95%"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"ddd1c05c-1702-4655-b3d2-e07bc6c92220","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"100%"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"7367c54e-cde8-4330-b190-6d210f228ecb","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"显著提升"}]}]}]},{"type":"tablerow","content":[{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"f2073204-689e-4c39-a88b-6edf0f0cca96","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"报告美观度"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"0d533a58-1ee9-4296-bbc7-5465c26e1380","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"依赖个人技能"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"a749b80d-91da-4896-b00f-f9812b2fb12b","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"统一专业模板"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"ef2d52fd-af13-44de-8fed-7aded198d032","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"标准化"}]}]}]},{"type":"tablerow","content":[{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"bbb41bfd-579e-42ea-9a6f-af9f936e1d1c","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"人力投入"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"3345029b-7b94-49f9-8663-a82ce56efb7d","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"全程人工"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"8fdec277-5089-4c12-b7fa-d45d024f4fb7","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"仅需审核"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"ac413d8b-6297-42a7-bd51-2c8f837b1108","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"解放生产力"}]}]}]},{"type":"tablerow","content":[{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"29826f37-715a-44f0-b80b-4f903c5d8080","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"可复用性"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"a14c7a30-a637-456f-8393-6f69433c1899","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"每次重做"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"f8b5fa7d-5a47-4846-8be7-56e9c18f34b7","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"一键生成"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"6313d150-1b93-4870-81c0-39761308db26","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"可持续"}]}]}]}]},{"type":"heading","attrs":{"id":"424ed325-f2ef-4599-aebb-66cb373c9a66","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"7.3 实际收益"}]},{"type":"paragraph","attrs":{"id":"c6eec208-b604-454d-b7cb-a7b256f6beea","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"时间成本节省:"}]},{"type":"bulletlist","attrs":{"id":"813e9db5-3136-40c5-9145-d82cbc23e45a","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"3c6f6d22-934f-4536-83f8-b1799753df4a"},"content":[{"type":"paragraph","attrs":{"id":"abc292d2-3a09-4e1d-bae7-acb1fdbf9892","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"每月节省约 20-24 小时"}]}]},{"type":"listitem","attrs":{"id":"e095fa4e-fc7f-4204-aa22-997f0f9cea31"},"content":[{"type":"paragraph","attrs":{"id":"bb1d6dd3-74ab-48a0-94a3-529675cdfb75","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"一年节省约 240-288 小时(相当于 30-36 个工作日)"}]}]}]},{"type":"paragraph","attrs":{"id":"f54fa179-56a6-42d8-ad80-ec6016bf0553","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"质量提升:"}]},{"type":"bulletlist","attrs":{"id":"fd8c6e5d-e09f-4242-bf84-bde719928197","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"a88afff0-f8b9-4724-956f-aa0c04e8da52"},"content":[{"type":"paragraph","attrs":{"id":"d3f215c9-ad4f-4e33-900c-2a6b91a16ba4","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"消除人为错误"}]}]},{"type":"listitem","attrs":{"id":"e3dda423-27e7-46cb-9946-c2ac73bff9e8"},"content":[{"type":"paragraph","attrs":{"id":"da3bf07a-44c5-4b5c-913b-a749dedfea52","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"数据口径统一"}]}]},{"type":"listitem","attrs":{"id":"e4df2463-a32a-42ba-a595-de5d24607237"},"content":[{"type":"paragraph","attrs":{"id":"28c324d4-06e7-4916-875b-28851eb0af41","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"报告格式标准化"}]}]}]},{"type":"paragraph","attrs":{"id":"6432cf9c-7b73-4c20-817f-fccef46d4ad3","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"决策支持:"}]},{"type":"bulletlist","attrs":{"id":"5dbe4e00-1316-453f-a06b-91015848e57e","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"e391a81c-c9d6-4a9a-93c8-01fe8f8aa198"},"content":[{"type":"paragraph","attrs":{"id":"4c4a4a99-9b29-401d-b093-0d8dbdce0d14","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"及时发现异常"}]}]},{"type":"listitem","attrs":{"id":"bc114177-68e0-479b-84b2-ec5747779ecd"},"content":[{"type":"paragraph","attrs":{"id":"79dc4c00-604b-46f3-93b3-cc6cc71489d9","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"快速响应业务变化"}]}]},{"type":"listitem","attrs":{"id":"b52e0aa4-2b82-47f5-90c9-c80b4c18bcc2"},"content":[{"type":"paragraph","attrs":{"id":"4bba8b84-1611-4f6f-8c52-bb07bd72dbbb","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"数据驱动决策"}]}]}]},{"type":"heading","attrs":{"id":"9be161cd-25e3-49b9-a694-de0368c4bef2","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"八、扩展与优化"}]},{"type":"heading","attrs":{"id":"34ff7d9a-7ee6-48f8-8238-13ad5f45ce81","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"8.1 功能扩展方向"}]},{"type":"orderedlist","attrs":{"id":"dfd75cdb-4608-48bf-9fb6-f5a735a02095","start":1,"ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"2c15453c-b1cd-4b1e-b277-25edcb77ca35"},"content":[{"type":"paragraph","attrs":{"id":"f97c778f-3dc4-40cd-bafc-08c061eb4b7e","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"邮件自动发送"}]},{"type":"codeblock","attrs":{"id":"11c99a0d-8bdc-437d-b3c0-01d5b13d89b8","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":""},"content":[{"type":"text","text":"import smtplibrom email.mime.multipart import mimemultipartrom email.mime.text import mimetext\def send_report_email(report_path: str, recipients: list): \"\"\"发送报告邮件\"\"\" # 实现邮件发送逻辑 pass"}]}]},{"type":"listitem","attrs":{"id":"0d1d181b-ec8b-44d0-9d7b-175e3e30867f"},"content":[{"type":"paragraph","attrs":{"id":"94ca666c-bf62-4979-a565-89a12046fe66","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"企业微信/钉钉集成"},{"type":"text","text":" - 报告生成后自动推送到群聊"}]}]},{"type":"listitem","attrs":{"id":"3e64ccc2-1fa5-4f50-a6ca-1a49d5713ede"},"content":[{"type":"paragraph","attrs":{"id":"81e7d0b2-eacf-469d-ba73-4d590f96b063","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"数据库直连"},{"type":"text","text":" - 直接从 crm 数据库读取数据"}]}]},{"type":"listitem","attrs":{"id":"45af64cd-8ad4-4d6d-926b-190019c45bc7"},"content":[{"type":"paragraph","attrs":{"id":"7474fed7-22ad-4f17-a8c5-bcc0604e0af4","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"ai 智能洞察"},{"type":"text","text":" - 接入大模型自动生成文字分析"}]}]},{"type":"listitem","attrs":{"id":"41ae3c99-938c-4183-95ba-51079fdd7cf0"},"content":[{"type":"paragraph","attrs":{"id":"4a679168-2f54-44b5-adff-6d59ab26848b","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"交互式 dashboard"},{"type":"text","text":" - 使用 streamlit 或 dash 构建"}]}]}]},{"type":"heading","attrs":{"id":"efc0e99b-debd-451c-903b-9f45e53042d2","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"8.2 性能优化"}]},{"type":"orderedlist","attrs":{"id":"0d2ed275-0865-464e-a426-d456dc7acd65","start":1,"ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"53a52f1e-a877-486f-ab99-e45b44ff7619"},"content":[{"type":"paragraph","attrs":{"id":"0a0d9f76-eab9-43f6-ae4e-755e158ff6ab","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"大数据量处理"},{"type":"text","text":" - 使用 dask 替代 pandas"}]}]},{"type":"listitem","attrs":{"id":"3703c08a-908c-4973-b6aa-64f459619dd7"},"content":[{"type":"paragraph","attrs":{"id":"ada3f45a-73d2-438f-976c-7c219169a9f4","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"缓存机制"},{"type":"text","text":" - 缓存中间结果,增量更新"}]}]},{"type":"listitem","attrs":{"id":"b2051f69-f158-4526-8b90-13fa781ca27b"},"content":[{"type":"paragraph","attrs":{"id":"98eb21d7-f376-41b0-82f7-7e63981c9e10","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"并行处理"},{"type":"text","text":" - 多进程生成不同图表"}]}]}]},{"type":"heading","attrs":{"id":"cb336cca-6853-4ff5-aac0-13328b09c4f6","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"8.3 部署方案"}]},{"type":"table","attrs":{"id":"b3c500d7-bb50-4a8c-a1b2-e1722e52c2be","ishoverdraghandle":false},"content":[{"type":"tablerow","content":[{"type":"tableheader","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px; font-weight: 600;"},"content":[{"type":"paragraph","attrs":{"id":"e62d49ed-f50f-428d-a165-25f24589f649","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"方案"}]}]},{"type":"tableheader","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px; font-weight: 600;"},"content":[{"type":"paragraph","attrs":{"id":"7c759453-a2de-498b-92f9-48b60a3f08b7","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"说明"}]}]}]},{"type":"tablerow","content":[{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px; font-weight: bold;"},"content":[{"type":"paragraph","attrs":{"id":"6f2167de-ae68-4b9c-b4a4-d49cc355130e","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"本地运行"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"97113b4a-5a4b-452a-a65c-54f5030e3e2e","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"适合小规模团队,成本低,数据安全"}]}]}]},{"type":"tablerow","content":[{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px; font-weight: bold;"},"content":[{"type":"paragraph","attrs":{"id":"dd9b6629-7300-4670-bb34-8f178307c9df","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"服务器部署"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"c1cdb504-9620-4533-89a4-c4d9dd6f7f60","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"使用 windows server 或 linux,配置定时任务"}]}]}]},{"type":"tablerow","content":[{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px; font-weight: bold;"},"content":[{"type":"paragraph","attrs":{"id":"aeaf516f-113d-4cf9-b05b-3f828c9b0231","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"云函数"}]}]},{"type":"tablecell","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"background":null,"color":null,"textalign":null,"style":"border-color: rgb(223, 226, 229); padding: 8px 16px;"},"content":[{"type":"paragraph","attrs":{"id":"bf56fbcc-a4e9-4bd6-9e8f-9efa45da6151","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"php中文网 scf 或阿里云 fc,按需执行,弹性伸缩"}]}]}]}]},{"type":"heading","attrs":{"id":"2a66e732-592d-4e5e-abdc-ce3057a0a762","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"九、常见问题解答"}]},{"type":"heading","attrs":{"id":"411170fe-48e0-4463-8bd5-69578a7754fc","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"q1:如何处理不同格式的源数据?"}]},{"type":"paragraph","attrs":{"id":"490e14da-192d-420e-87d0-a4d31d64f218","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"a:"},{"type":"text","text":"在 "},{"type":"text","marks":[{"type":"code"}],"text":"data_cleaner.py"},{"type":"text","text":" 中添加相应的解析逻辑,或使用统一的中间格式(如 csv)。对于 api 数据源,可以使用 "},{"type":"text","marks":[{"type":"code"}],"text":"requests"},{"type":"text","text":" 库直接调用接口。"}]},{"type":"heading","attrs":{"id":"a944a8e0-8b38-46a1-94f8-450e9a6c9b34","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"q2:图表中文乱码怎么办?"}]},{"type":"paragraph","attrs":{"id":"fb3fae3e-e919-40c6-96d3-aa812fbda0a8","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"a:"},{"type":"text","text":"确保系统安装了中文字体(如 simhei、microsoft yahei),并在 matplotlib 中正确配置:"}]},{"type":"codeblock","attrs":{"id":"199e7443-413b-46fc-9b83-668ac1a33cd9","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"plt.rcparams['font.sans-serif'] = ['simhei', 'microsoft yahei']plt.rcparams['axes.unicode_minus'] = false"}]},{"type":"heading","attrs":{"id":"0e1986c1-6a70-4b1d-87f6-7ad58f2b387b","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"q3:如何保证数据安全?"}]},{"type":"paragraph","attrs":{"id":"39b05c27-34cd-4659-8540-02d3de6034c2","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"a:"}]},{"type":"bulletlist","attrs":{"id":"6e9f3c88-75f5-40de-a441-0495db039708","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"3d88ee9d-6db4-4e00-ac16-d984ac734614"},"content":[{"type":"paragraph","attrs":{"id":"762a1769-b46b-4e54-be31-5a4c2175f90e","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"敏感数据脱敏处理"}]}]},{"type":"listitem","attrs":{"id":"9fd75157-e1b4-45c5-88b5-3c9ddb0f9049"},"content":[{"type":"paragraph","attrs":{"id":"4fc19898-3b9b-4cfd-ada8-cc5bf64b68dd","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"使用环境变量存储数据库密码"}]}]},{"type":"listitem","attrs":{"id":"7cd90341-f90e-4f4f-8cf7-666bd642e25f"},"content":[{"type":"paragraph","attrs":{"id":"7794b86a-6ed2-4d17-8dbd-2d01ae07a40f","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"限制文件访问权限"}]}]},{"type":"listitem","attrs":{"id":"72842db4-ab06-46c0-bfec-fcc7c89cf2f6"},"content":[{"type":"paragraph","attrs":{"id":"2ffcab68-765b-41f4-bf19-c49c264bd205","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"定期备份重要数据"}]}]}]},{"type":"heading","attrs":{"id":"6f5fc980-8ac8-4da7-b8ea-6d958caf98c8","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"q4:能否处理实时数据?"}]},{"type":"paragraph","attrs":{"id":"3583e9aa-1b01-4115-9b50-bcfe5eb335f3","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"a:"},{"type":"text","text":"可以。将数据源改为数据库或 api,配置更频繁的定时任务(如每小时),即可实现准实时报告。"}]},{"type":"heading","attrs":{"id":"ccdb6d65-5057-476e-9174-68e19d1c6bd6","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"q5:如何让非技术人员也能使用?"}]},{"type":"paragraph","attrs":{"id":"fc119937-142d-4b5e-ac8e-451616210da9","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"a:"}]},{"type":"bulletlist","attrs":{"id":"2e58b524-e570-435b-aab2-f02cb378d7fe","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"59ca848b-e62e-49d1-9def-ca7c989d905e"},"content":[{"type":"paragraph","attrs":{"id":"623369ad-f9d3-421e-a916-03bcdfffeaa2","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"通过 qclaw 的微信界面,只需发送简单指令"}]}]},{"type":"listitem","attrs":{"id":"31965fe7-554d-4cde-80dc-7189b4d9f24c"},"content":[{"type":"paragraph","attrs":{"id":"bb42213f-bbc2-4310-90f1-eb1d054d1faa","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"提供 web 界面(可使用 flask/fastapi)"}]}]},{"type":"listitem","attrs":{"id":"e1f7a7ab-c41c-4cf7-b03c-ccb2695a7bf5"},"content":[{"type":"paragraph","attrs":{"id":"3c88e3da-4f80-4282-ab0d-5d16fd9a9598","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"编写详细的用户手册"}]}]}]},{"type":"heading","attrs":{"id":"e27e618e-afb8-415a-bae9-e2ade55ef849","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"十、总结"}]},{"type":"paragraph","attrs":{"id":"2b245625-a8ee-4c7a-bba4-599f16f2b6e0","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"通过这个实战案例,我们展示了如何使用 qclaw + python 构建一个完整的销售数据自动化报告系统。核心价值在于:"}]},{"type":"bulletlist","attrs":{"id":"3127d5f7-998a-4d31-a23f-72ee87a25abd","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"25411cd0-0206-40c6-b5ae-6e79e1e1519d"},"content":[{"type":"paragraph","attrs":{"id":"9e5764c9-7927-4bbb-99fb-ebef965a21e2","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"✅ 效率革命"},{"type":"text","text":":从 6 小时 → 10 分钟,释放大量时间"}]}]},{"type":"listitem","attrs":{"id":"366cc241-75ff-4691-8e55-a159072463d6"},"content":[{"type":"paragraph","attrs":{"id":"ca88d677-1eb3-4353-874a-a0efd8e3640f","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"✅ 质量保证"},{"type":"text","text":":消除人为错误,数据 100% 准确"}]}]},{"type":"listitem","attrs":{"id":"652f363a-784a-4b42-8c66-83f352590e20"},"content":[{"type":"paragraph","attrs":{"id":"f2e11566-5ea5-4652-8e0c-8d7a84fc7cf3","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"✅ 可扩展性"},{"type":"text","text":":模块化设计,易于添加新功能"}]}]},{"type":"listitem","attrs":{"id":"08ca6348-4a83-4a92-bf90-9282652f2222"},"content":[{"type":"paragraph","attrs":{"id":"f1601ef0-c397-4755-96ad-636a568ff4e9","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"✅ 低门槛"},{"type":"text","text":":通过 qclaw 微信交互,人人可用"}]}]}]},{"type":"paragraph","attrs":{"id":"b0eb53be-48f2-4b9a-aaf3-c6fbe084081d","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"技术要点回顾:"}]},{"type":"bulletlist","attrs":{"id":"5e4d5ba8-811e-49a0-bfae-8e51c0c71797","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"f3512377-392d-43ef-b6f0-6639c9a099f2"},"content":[{"type":"paragraph","attrs":{"id":"a175dd0b-fde4-4b8e-8efa-f43929077efb","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"pandas 数据清洗与分析"}]}]},{"type":"listitem","attrs":{"id":"6494a704-61eb-4dce-8352-d584938537d3"},"content":[{"type":"paragraph","attrs":{"id":"fc8df9ff-1b3e-4682-9a89-194bbd2ba4d7","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"matplotlib/seaborn 可视化"}]}]},{"type":"listitem","attrs":{"id":"ea8fa238-039c-4218-9fc1-829550cdb2cd"},"content":[{"type":"paragraph","attrs":{"id":"ba5eb8ce-6e71-444d-8e14-5281351e0277","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"jinja2 模板引擎生成 html"}]}]},{"type":"listitem","attrs":{"id":"14d58c36-267a-4813-8390-31fad4513501"},"content":[{"type":"paragraph","attrs":{"id":"91602391-b103-4edb-a7cb-1292ed6eb152","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"qclaw 自动化流程编排"}]}]}]},{"type":"paragraph","attrs":{"id":"5ee00168-1a20-4fe8-9587-f618a75b4d5f","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"适用场景:"}]},{"type":"bulletlist","attrs":{"id":"878faa20-fe2e-4758-80d0-68e89914813e","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"ae6190ea-52dc-4cf8-9317-17e7f181b112"},"content":[{"type":"paragraph","attrs":{"id":"0cdcc5d4-4bb7-488d-8bda-e613d29473a8","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"销售/运营数据分析"}]}]},{"type":"listitem","attrs":{"id":"d0a43380-c502-4c0d-9ada-ba4b9e8d559c"},"content":[{"type":"paragraph","attrs":{"id":"f06f2a3d-d7a4-486e-a0f7-0970dfc75f90","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"财务报表自动生成"}]}]},{"type":"listitem","attrs":{"id":"56d43014-fab8-4c0d-9b3a-5c0457e48b8c"},"content":[{"type":"paragraph","attrs":{"id":"d0cb956e-f2ee-49b1-8519-23583876cfc7","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"hr 人员统计分析"}]}]},{"type":"listitem","attrs":{"id":"692a0a37-75cf-4a33-9765-eb09305b71d2"},"content":[{"type":"paragraph","attrs":{"id":"56c3a4f7-724b-432a-a8ed-b42e1d45c881","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"任何周期性数据报告场景"}]}]}]},{"type":"paragraph","attrs":{"id":"9af8f7b8-62e9-43ee-9fb7-a2cad65684d7","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"希望这个案例能给你带来启发。记住:"},{"type":"text","marks":[{"type":"bold"}],"text":"自动化的目的不是取代人,而是让人从重复劳动中解放出来,去做更有价值的事情。"}]},{"type":"paragraph","attrs":{"id":"a00847b8-2428-4227-b4fa-a85c5fd042e5","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"如果你也在被繁琐的数据处理工作困扰,不妨试试这套方案。相信它会成为你得力的办公助手!"}]},{"type":"horizontalrule","attrs":{"id":"419b9b9b-a782-4ede-b2a1-9417f70e677a","ishoverdraghandle":false}},{"type":"paragraph","attrs":{"id":"910afcbf-d228-427e-820a-4ed2c60dc132","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false}},{"type":"paragraph","attrs":{"id":"85bd5564-9e36-4560-ae5a-c49b8cfe589b","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"? "},{"type":"text","marks":[{"type":"bold"}],"text":"让技术经验流动起来"},{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"id":"27b2f02c-236f-4d9c-b1cb-c55480b5498e","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"▌▍▎▏ 你的每个互动都在为技术社区蓄能 ▏▎▍▌ "}]},{"type":"paragraph","attrs":{"id":"05547847-f23a-4a86-b5ea-31b4a8c911bf","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"✅ "},{"type":"text","marks":[{"type":"bold"}],"text":"点赞"},{"type":"text","text":" → 让优质经验被更多人看见 "}]},{"type":"paragraph","attrs":{"id":"d4e6b507-70ce-42da-9417-2d44ae4bb25e","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"? "},{"type":"text","marks":[{"type":"bold"}],"text":"收藏"},{"type":"text","text":" → 构建你的专属知识库 "}]},{"type":"paragraph","attrs":{"id":"c5c132ef-5e7c-459d-97cc-7bff6803f26e","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"? "},{"type":"text","marks":[{"type":"bold"}],"text":"转发"},{"type":"text","text":" → 与技术伙伴共享避坑指南 "}]},{"type":"paragraph","attrs":{"id":"1466b103-136d-4d71-a652-e805d7d1633f","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"点赞"},{"type":"text","text":" ➕ "},{"type":"text","marks":[{"type":"bold"}],"text":"收藏"},{"type":"text","text":" ➕ "},{"type":"text","marks":[{"type":"bold"}],"text":"转发"},{"type":"text","text":",助力更多小伙伴一起成长!?"}]},{"type":"paragraph","attrs":{"id":"b73b844c-d733-4142-b9ad-46c9493c27ad","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"? "},{"type":"text","marks":[{"type":"bold"}],"text":"深度连接"},{"type":"text","text":": "}]},{"type":"paragraph","attrs":{"id":"87aa2726-3d62-40fb-8202-265bb05babde","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"点击 「头像」→「+关注」 "}]},{"type":"paragraph","attrs":{"id":"d986dad9-ae8b-4998-93e4-8dd54f463ece","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"每周解锁: "}]},{"type":"paragraph","attrs":{"id":"04d12af3-3964-43ca-94e4-bb5f993734c1","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"? 一线架构实录 | ? 故障排查手册 | ? 效能提升秘籍 "}]}]}
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










