{"id":112153,"date":"2026-10-02T19:56:52","date_gmt":"2026-10-02T11:56:52","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/112153.html"},"modified":"2026-10-02T19:56:52","modified_gmt":"2026-10-02T11:56:52","slug":"python%e7%9a%84%e5%85%88%e8%bf%9b%e5%88%b6%e9%80%a0%e6%8a%80%e6%9c%af%e5%b7%a5%e4%b8%9a%e5%9c%ba%e6%99%af%e6%a8%a1%e6%8b%9f%e7%ac%ac%e4%ba%8c%e5%8d%81%e5%9b%9b%e7%af%87%e8%af%bb%e5%8f%96%e4%b8%8d","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/112153.html","title":{"rendered":"python\u7684\u5148\u8fdb\u5236\u9020\u6280\u672f\u5de5\u4e1a\u573a\u666f\u6a21\u62df\u7b2c\u4e8c\u5341\u56db\u7bc7:\u8bfb\u53d6\u4e0d\u540c\u786c\u8d28\u5408\u91d1\u5200\u5177\u52a0\u5de5\u8bb0\u5f55\uff0c\u7edf\u8ba1\u6bcf\u79cd\u5200\u5177\u53ef\u52a0\u5de5\u96f6\u4ef6\u6570\u91cf\uff0c\u8bc4\u4f30\u5200\u5177\u8010\u7528\u5ea6\u3002"},"content":{"rendered":"<p>\u5468\u4e09\u591c\u73ed&#xff0c;\u673a\u52a0\u8f66\u95f4\u3002<\/p>\n<p>&#034;\u8fd9\u6279\u4ef6\u5e72\u5230 180 \u4ef6&#xff0c;\u5200\u53c8\u5d29\u4e86&#xff0c;&#034;\u5200\u5177\u7ba1\u7406\u5458\u8001\u5468\u628a\u51e0\u6839\u786c\u8d28\u5408\u91d1\u5200\u6446\u684c\u4e0a&#xff0c;&#034;\u7cfb\u7edf\u91cc\u8bb0\u7684\u662f&#039;\u6362\u5200\u4e8b\u4ef6&#039;&#xff0c;\u53ef\u6211\u60f3\u77e5\u9053&#xff1a;\u540c\u724c\u53f7\u7684\u5200&#xff0c;\u5e72\u8fd9\u4e2a\u6750\u6599\u5230\u5e95\u80fd\u6491\u591a\u5c11\u4ef6&#xff1f;\u662f 150 \u4ef6\u5c31\u5230\u5934&#xff0c;\u8fd8\u662f\u80fd\u5230 220&#xff1f;\u73b0\u5728\u5168\u9760\u8001\u5e08\u5085\u62cd\u8111\u888b&#xff0c;\u6362\u65e9\u4e86\u6d6a\u8d39\u5200&#xff0c;\u6362\u665a\u4e86\u51fa\u5e9f\u54c1\u3002&#034;<\/p>\n<p>\u6211\u6253\u5f00 MES \u7684\u5bfc\u51fa\u8868\u3002<\/p>\n<p>&#034;\u8fd9\u8868\u91cc\u6709\u4ec0\u4e48&#xff1f;&#034;\u8001\u5468\u95ee\u3002<\/p>\n<p>&#034;\u6bcf\u628a\u5200\u4e00\u4e2a\u7f16\u53f7&#xff0c;\u52a0\u5de5\u96f6\u4ef6\u65f6\u8bb0\u5f00\u59cb\u4ef6\u53f7\u3001\u7ed3\u675f\u4ef6\u53f7\u3001\u52a0\u5de5\u6750\u6599\u3001\u5207\u524a\u53c2\u6570\u3001\u662f\u5426\u5d29\u5203&#xff0c;&#034;\u6211\u6307\u7740 CSV&#xff0c;&#034;\u4e00\u628a\u5200\u4e00\u884c&#xff0c;\u6216\u8005\u6309\u5bff\u547d\u4e8b\u4ef6\u4e00\u884c\u3002\u53ef\u7cfb\u7edf\u4e0d\u805a\u5408&#039;\u540c\u578b\u53f7\u5200\u5e73\u5747\u80fd\u52a0\u5de5\u51e0\u4ef6&#039;&#xff0c;\u4e5f\u4e0d\u544a\u8bc9\u4f60\u662f\u540e\u5200\u9762\u78e8\u635f\u5148\u5230&#xff0c;\u8fd8\u662f\u5d29\u5203\u5148\u5230\u3002&#034;<\/p>\n<p>&#034;\u6211\u5c31\u60f3\u95ee\u4e00\u53e5&#xff0c;&#034;\u8001\u5468\u8bf4&#xff0c;&#034;WC-Co \u7ec6\u6676\u7684\u3001\u8d85\u7ec6\u6676\u7684\u3001\u6d82\u5c42 PVD \u7684&#xff0c;\u5404\u7edf\u8ba1\u4e00\u4e0b\u5e73\u5747\u5bff\u547d\u4ef6\u6570&#xff0c;\u753b\u4e2a\u5206\u5e03&#xff0c;\u518d\u544a\u8bc9\u6211\u54ea\u6279\u5200\u5bff\u547d\u79bb\u6563\u5927&#xff0c;\u54ea\u6279\u7a33\u3002\u6700\u597d\u80fd\u6309\u52a0\u5de5\u6750\u6599\u5206\u5f00\u770b&#xff0c;\u94a2\u4ef6\u548c\u4e0d\u9508\u94a2\u4e0d\u80fd\u6df7\u7740\u7b97\u3002&#034;<\/p>\n<p>&#034;\u6240\u4ee5\u4f60\u8981\u7684\u4e0d\u662f\u6362\u5200\u8bb0\u5f55\u8868&#xff0c;\u662f&#039;\u540c\u578b\u53f7\u5200\u5177\u8010\u7528\u5ea6\u7edf\u8ba1 &#043; \u5bff\u547d\u5206\u5e03 &#043; \u79bb\u6563\u5ea6\u8bc4\u4f30 &#043; \u5f02\u5e38\u5200\u8bc6\u522b&#039;&#xff1f;&#034;<\/p>\n<p>&#034;\u5bf9&#xff0c;&#034;\u8001\u5468\u70b9\u5934&#xff0c;&#034;\u6bd4\u5982\u540c\u662f PVD \u6d82\u5c42\u5200\u5e72 45 \u94a2&#xff0c;\u5e73\u5747 195 \u4ef6&#xff0c;\u4f46\u6709\u4e00\u628a\u53ea\u5e72\u4e86 80 \u4ef6\u5c31\u5d29\u4e86&#xff0c;\u6211\u60f3\u628a\u5b83\u6311\u51fa\u6765&#xff0c;\u770b\u662f\u4e0d\u662f\u90a3\u53f0\u673a\u5e8a\u4e3b\u8f74\u8df3\u52a8\u4e86\u3002&#034;<\/p>\n<p>&#034;\u660e\u767d\u4e86&#xff0c;&#034;\u6211\u5f00 VS Code&#xff0c;&#034;\u7528 pandas \u8bfb\u5200\u5177\u52a0\u5de5\u8bb0\u5f55&#xff0c;numpy \u7b97\u5bff\u547d\u4ef6\u6570&#xff0c;scipy \u505a\u5206\u5e03\u68c0\u9a8c\u548c\u7f6e\u4fe1\u533a\u95f4&#xff0c;matplotlib \u753b\u5bff\u547d\u7bb1\u7ebf\u56fe&#043;\u5a01\u5e03\u5c14\u56fe&#xff0c;scikit-learn \u805a\u7c7b\u627e\u5f02\u5e38\u5200&#xff0c;networkx \u628a&#039;\u5200\u5177\u578b\u53f7\u2192\u52a0\u5de5\u6750\u6599\u2192\u673a\u5e8a&#039;\u5efa\u5173\u7cfb\u7f51\u770b\u74f6\u9888\u3002\u6570\u636e\u81ea\u5305\u542b\u2014\u2014\u5408\u6210 5 \u7c7b\u786c\u8d28\u5408\u91d1\u5200\u00d7\u591a\u628a&#xff0c;\u6a21\u62df\u6b63\u5e38\u78e8\u635f\u4e0e\u5c11\u91cf\u65e9\u635f&#xff0c;\u4e0b\u8f7d\u5c31\u80fd\u8dd1\u3002&#034;<\/p>\n<p>\u6211\u6572\u4e86\u6bb5\u539f\u578b&#xff1a;<\/p>\n<p>import pandas as pd<\/p>\n<p>life &#061; df.groupby(&#034;tool_id&#034;).apply(<\/p>\n<p>\u00a0 \u00a0 lambda g: g[&#034;end_part&#034;].max() &#8211; g[&#034;start_part&#034;].min() &#043; 1)<\/p>\n<p>\u00a0<\/p>\n<p>&#034;\u5b8c\u6574\u7248\u7528 OOP \u5c01\u597d&#xff0c;&#034;\u6211\u8bf4&#xff0c;&#034;\u4e00\u4e2a\u7c7b\u7ba1\u5200\u5177\u8bb0\u5f55\u52a0\u8f7d&#xff0c;\u4e00\u4e2a\u7c7b\u7b97\u5355\u5200\u5bff\u547d&#xff0c;\u4e00\u4e2a\u7c7b\u505a\u578b\u53f7\u7ea7\u7edf\u8ba1&#xff0c;\u4e00\u4e2a\u7c7b\u505a\u5a01\u5e03\u5c14\u5206\u6790&#xff0c;\u4e00\u4e2a\u7c7b\u627e\u5f02\u5e38\u5200&#xff0c;\u4e00\u4e2a\u7c7b\u753b\u5173\u7cfb\u7f51&#xff0c;\u4e00\u4e2a\u7c7b\u51fa\u56fe\u3002\u8f93\u51fa\u6bcf\u79cd\u5200\u5e73\u5747\u4ef6\u6570\u3001\u5bff\u547d\u5206\u5e03\u3001\u65e9\u635f\u6e05\u5355\u3001\u5a01\u5e03\u5c14\u659c\u7387\u3002&#034;<\/p>\n<p>\u8001\u5468\u51d1\u8fd1\u770b&#xff1a;&#034;\u90a3\u6211\u4ee5\u540e\u770b\u62a5\u544a&#xff1a;PVD \u6d82\u5c42\u5e72 45 \u94a2&#xff0c;\u5747\u503c 195 \u4ef6&#xff0c;\u5a01\u5e03\u5c14\u659c\u7387 8.2&#xff0c;\u8bf4\u660e\u5bff\u547d\u633a\u96c6\u4e2d&#xff1b;\u6709\u4e00\u628a 82 \u4ef6\u5d29\u5203&#xff0c;\u6807\u7ea2&#xff0c;\u5173\u8054\u673a\u5e8a M3&#xff0c;\u5c31\u77e5\u9053\u53bb\u67e5 M3 \u4e3b\u8f74\u4e86\u3002&#034;<\/p>\n<p>&#034;\u5bf9&#xff0c;&#034;\u6211\u63a5\u8bdd&#xff0c;&#034;\u5200\u5177\u8010\u7528\u5ea6\u4e0d\u662f\u6807\u79f0\u503c&#xff0c;\u662f\u7edf\u8ba1\u51fa\u6765\u7684\u5206\u5e03\u3002\u6570\u5b57\u5b6a\u751f\u91cc\u5200\u662f\u6d88\u8017\u54c1\u6a21\u578b&#xff0c;\u5f97\u5148\u6709\u8fd9\u5f20\u7edf\u8ba1\u5e95\u8868&#xff0c;\u624d\u80fd\u505a\u6362\u5200\u9884\u6d4b\u3002&#034;<\/p>\n<p>\u00a0<\/p>\n<p>\u4e00\u3001\u5b9e\u9645\u5e94\u7528\u573a\u666f&#xff08;\u771f\u5b9e\u75db\u70b9&#xff09;<\/p>\n<p>\u00a0<\/p>\n<p>\u573a\u666f\u8bbe\u5b9a&#xff1a;\u591a\u578b\u53f7\u786c\u8d28\u5408\u91d1\u5200\u5177&#xff08;\u4e0d\u540c\u724c\u53f7\/\u6d82\u5c42&#xff09;\u52a0\u5de5\u4e0d\u540c\u6750\u6599\u96f6\u4ef6&#xff0c;MES \u8bb0\u5f55\u6bcf\u628a\u5200\u7684\u542f\u7528\u4ef6\u53f7\u3001\u505c\u7528\u4ef6\u53f7\u3001\u52a0\u5de5\u6750\u6599\u3001\u673a\u5e8a\u53f7\u3001\u505c\u7528\u539f\u56e0&#xff08;\u6b63\u5e38\u78e8\u635f\/\u5d29\u5203\/\u5d29\u89d2\/\u8fbe\u5230\u5bff\u547d&#xff09;\u3002\u73b0\u573a\u53ea\u8bb0\u5f55\u4e8b\u4ef6&#xff0c;\u4e0d\u63d0\u4f9b\u540c\u578b\u53f7\u5200\u5177\u5bff\u547d\u805a\u5408\u7edf\u8ba1&#xff0c;\u4e5f\u4e0d\u533a\u5206\u6750\u6599\u5de5\u51b5&#xff0c;\u5bfc\u81f4\u6362\u5200\u7b56\u7565\u5168\u51ed\u7ecf\u9a8c\u3002<\/p>\n<p>\u00a0<\/p>\n<p>\u73b0\u573a\u539f\u8bdd&#xff08;\u53d9\u4e8b\u5316&#xff09;&#xff1a;<\/p>\n<p>\u00a0<\/p>\n<p>&#034;\u6211\u4e0d\u662f\u820d\u4e0d\u5f97\u6362\u5200&#xff0c;&#034;\u8001\u5468\u8bf4&#xff0c;&#034;\u662f\u6ca1\u6570\u3002\u540c\u662f PVD \u6d82\u5c42\u5200&#xff0c;\u6709\u7684\u5e72 210 \u4ef6&#xff0c;\u6709\u7684 160 \u4ef6\u5c31\u5d29&#xff0c;\u7cfb\u7edf\u91cc\u5c31\u662f\u4e24\u6761\u6362\u5200\u8bb0\u5f55&#xff0c;\u6ca1\u4eba\u5e2e\u6211\u7b97\u5747\u503c\u3002\u6709\u6b21\u6211\u6309 150 \u4ef6\u6362&#xff0c;\u7ed3\u679c\u540e\u9762\u5200\u90fd\u8fd8\u80fd\u7528&#xff0c;\u4e00\u5e74\u767d\u6254\u51e0\u767e\u6839&#xff1b;\u53e6\u4e00\u6b21\u6309 220 \u4ef6\u6362&#xff0c;\u51fa\u4e86\u6279\u632f\u7eb9\u5e9f\u54c1\u3002\u540e\u6765\u6211\u628a\u6bcf\u628a\u5200\u5bff\u547d\u624b\u8bb0\u5728\u672c\u5b50\u4e0a&#xff0c;\u53ef\u672c\u5b50\u8ddf MES \u5bf9\u4e0d\u4e0a&#xff0c;\u4e5f\u5206\u4e0d\u4e86\u6750\u6599\u3002&#034;<\/p>\n<p>\u6838\u5fc3\u77db\u76fe&#xff1a;&#034;\u6362\u5200\u4e8b\u4ef6\u6d41\u6c34&#034;\u4e0e&#034;\u540c\u578b\u53f7\u5200\u5177\u8010\u7528\u5ea6\u7edf\u8ba1 &#043; \u5bff\u547d\u5206\u5e03 &#043; \u5a01\u5e03\u5c14\u8bc4\u4f30 &#043; \u65e9\u635f\u5f02\u5e38\u8bc6\u522b &#043; \u5de5\u51b5\u5f52\u56e0&#034;\u4e4b\u95f4\u7684\u65ad\u5c42\u3002\u9700\u8981\u4e00\u4e2a&#034;\u786c\u8d28\u5408\u91d1\u5200\u5177\u8010\u7528\u5ea6\u7edf\u8ba1\u4e0e\u8bc4\u4f30\u7a0b\u5e8f&#034;&#xff0c;\u7528\u00a0<\/p>\n<p>&#034;pandas&#034; \u805a\u5408\u3001<\/p>\n<p>&#034;numpy&#034; \u7b97\u5bff\u547d\u3001<\/p>\n<p>&#034;scipy&#034; \u505a\u5206\u5e03\u62df\u5408\u4e0e\u68c0\u9a8c\u3001<\/p>\n<p>&#034;matplotlib&#034; \u753b\u7bb1\u7ebf\u56fe\/\u5a01\u5e03\u5c14\u56fe\u3001<\/p>\n<p>&#034;scikit-learn&#034; \u805a\u7c7b\u5f02\u5e38\u5200\u3001<\/p>\n<p>&#034;networkx&#034; \u5efa\u5de5\u51b5\u5173\u7cfb\u7f51\u3002<\/p>\n<p>\u00a0<\/p>\n<p>\u4e8c\u3001\u75db\u70b9\u5206\u6790&#xff08;\u6620\u5c04\u5230\u6ee8\u5dde\u804c\u4e1a\u5b66\u9662\u300a\u5148\u8fdb\u5236\u9020\u6280\u672f\u300b\u8bfe\u7a0b\u6a21\u578b&#xff09;<\/p>\n<p>\u00a0<\/p>\n<p>\u300a\u5148\u8fdb\u5236\u9020\u6280\u672f\u300b\u6a21\u5757 \u672c\u7bc7\u75db\u70b9\u5bf9\u5e94<\/p>\n<p>\u6570\u63a7\u52a0\u5de5\u4e0eCAD\/CAM\u6280\u672f&#xff1a;\u5200\u5177\u6750\u6599\u4e0e\u5207\u524a\u53c2\u6570\u4f18\u5316 \u786c\u8d28\u5408\u91d1\u724c\u53f7\/\u6d82\u5c42\u8010\u7528\u5ea6\u91cf\u5316\u7edf\u8ba1<\/p>\n<p>\u5148\u8fdb\u5236\u9020\u6280\u672f\u57fa\u7840&#xff1a;\u5236\u9020\u8fc7\u7a0b\u8d44\u6e90\u6d88\u8017\u7ba1\u7406 \u5200\u5177\u4f5c\u4e3a\u5173\u952e\u6d88\u8017\u8d44\u6e90\u5bff\u547d\u5efa\u6a21<\/p>\n<p>FMS\u4e0e\u5148\u8fdb\u751f\u4ea7\u7ba1\u7406&#xff1a;\u5355\u5143\u7ea7\u5200\u5177\u7ba1\u7406\u4e0e\u6362\u5200\u7b56\u7565 \u6309\u578b\u53f7\u805a\u5408\u5bff\u547d&#xff0c;\u652f\u6491\u6362\u5200\u9608\u503c\u8bbe\u5b9a<\/p>\n<p>\u667a\u80fd\u5236\u9020\u4e0e\u6570\u5b57\u5b6a\u751f&#xff1a;\u5200\u5177\u6570\u5b57\u5b6a\u751f \u5bff\u547d\u5206\u5e03\u2192\u53ef\u9884\u6d4b\u6362\u5200\u6a21\u578b\u5e95\u5ea7<\/p>\n<p>\u5148\u8fdb\u5236\u9020\u65b0\u6a21\u5f0f&#xff1a;\u6210\u672c\u4e0e\u8d28\u91cf\u534f\u540c&#xff08;\u96f6\u7f3a\u9677&#xff09; \u65e9\u635f\u8bc6\u522b\u907f\u514d\u6279\u91cf\u632f\u7eb9\u5e9f\u54c1<\/p>\n<p>\u00a0<\/p>\n<p>\u4e00\u53e5\u8bdd\u603b\u7ed3&#xff1a;\u6211\u4eec\u9700\u8981\u6784\u5efa\u4e00\u4e2a&#034;\u786c\u8d28\u5408\u91d1\u5200\u5177\u8010\u7528\u5ea6\u7edf\u8ba1\u4e0e\u8bc4\u4f30\u7a0b\u5e8f&#034;&#xff0c;\u7528\u00a0<\/p>\n<p>&#034;pandas&#034; \u6309\u578b\u53f7\u805a\u5408&#xff0c;<\/p>\n<p>&#034;scipy&#034; \u505a\u5a01\u5e03\u5c14\u62df\u5408&#xff0c;<\/p>\n<p>&#034;scikit-learn&#034; \u627e\u65e9\u635f\u5f02\u5e38&#xff0c;<\/p>\n<p>&#034;networkx&#034; \u5173\u8054\u5de5\u51b5&#xff0c;\u5b9e\u73b0\u4ece&#034;\u6362\u5200\u6d41\u6c34\u8d26&#034;\u5230&#034;\u53ef\u7edf\u8ba1\u3001\u53ef\u9884\u6d4b\u3001\u53ef\u5f52\u56e0\u7684\u5200\u5177\u5bff\u547d\u6a21\u578b&#034;\u3002<\/p>\n<p>\u00a0<\/p>\n<p>\u4e09\u3001\u6838\u5fc3\u903b\u8f91\u8bb2\u89e3&#xff08;\u5927\u767d\u8bdd&#xff09;<\/p>\n<p>\u00a0<\/p>\n<p>3.1 \u95ee\u9898\u672c\u8d28&#xff1a;\u628a\u5200\u5177\u60f3\u6210&#034;\u706f\u6ce1\u5bff\u547d&#034;<\/p>\n<p>\u00a0<\/p>\n<p>\u628a\u6bcf\u628a\u5200\u60f3\u6210\u4e00\u4e2a\u706f\u6ce1&#xff1a;<\/p>\n<p>\u00a0<\/p>\n<p>* \u5200\u5177\u578b\u53f7 &#061; \u706f\u6ce1\u54c1\u724c&#xff08;\u7ec6\u6676 WC-Co \/ \u8d85\u7ec6\u6676 \/ PVD\u6d82\u5c42\u2026&#xff09;<\/p>\n<p>* \u52a0\u5de5\u4ef6\u6570 &#061; \u4eae\u4e86\u591a\u5c11\u5c0f\u65f6<\/p>\n<p>* \u505c\u7528\u539f\u56e0 &#061; \u600e\u4e48\u706d\u7684&#xff08;\u81ea\u7136\u6697\u4e0b\u53bb&#061;\u6b63\u5e38\u78e8\u635f&#xff0c;\u70b8\u4e86&#061;\u5d29\u5203&#xff09;<\/p>\n<p>* \u540c\u578b\u53f7\u591a\u628a\u5200 &#061; \u540c\u4e00\u54c1\u724c\u4e00\u5806\u706f\u6ce1&#xff0c;\u6709\u7684\u4eae\u4e45\u70b9\u6709\u7684\u77ed\u70b9<\/p>\n<p>* \u5e73\u5747\u4ef6\u6570 &#061; \u54c1\u724c\u6807\u79f0\u5bff\u547d<\/p>\n<p>* \u5a01\u5e03\u5c14\u659c\u7387 &#061; \u8fd9\u6279\u706f\u6ce1&#034;\u9f50\u4e0d\u9f50\u5fc3&#034;&#xff1a;\u659c\u7387\u5927&#xff08;&gt;5&#xff09;\u8bf4\u660e\u5bff\u547d\u5f88\u96c6\u4e2d&#xff0c;\u659c\u7387\u5c0f\u8bf4\u660e\u5ffd\u957f\u5ffd\u77ed<\/p>\n<p>* \u65e9\u635f\u5200 &#061; \u540c\u6279\u91cc\u65e9\u65e9\u70b8\u6389\u7684\u90a3\u4e2a\u706f\u6ce1&#xff0c;\u5f97\u62ce\u51fa\u6765\u770b\u662f\u4e0d\u662f\u88c5\u9519\u673a\u5e8a\u4e86<\/p>\n<p>* \u5de5\u51b5\u5173\u7cfb\u7f51 &#061; \u54ea\u79cd\u5200\u5728\u54ea\u79cd\u6750\u6599\u54ea\u53f0\u673a\u5e8a\u4e0a\u6700\u8d39<\/p>\n<p>\u00a0<\/p>\n<p>\u5de5\u4e1a\u5e94\u7528&#xff1a;<\/p>\n<p>\u00a0<\/p>\n<p>*\u00a0<\/p>\n<p>&#034;pandas.groupby([&#034;tool_grade&#034;,&#034;material&#034;])&#034; \u805a\u5408\u5bff\u547d\u4ef6\u6570<\/p>\n<p>*\u00a0<\/p>\n<p>&#034;scipy.stats.weibull_min&#034; \u62df\u5408\u5bff\u547d\u5206\u5e03&#xff0c;\u53d6\u5f62\u72b6\u53c2\u6570 k<\/p>\n<p>*\u00a0<\/p>\n<p>&#034;scikit-learn&#034; \u7528\u5bff\u547d&#043;\u659c\u7387\u504f\u5dee\u505a\u65e9\u635f\u805a\u7c7b<\/p>\n<p>*\u00a0<\/p>\n<p>&#034;networkx&#034; \u5efa\u00a0<\/p>\n<p>&#034;\u5200\u5177\u578b\u53f7\u2014\u6750\u6599\u2014\u673a\u5e8a&#034; \u4e09\u5c42\u56fe&#xff0c;\u627e\u9ad8\u6d88\u8017\u8def\u5f84<\/p>\n<p>\u00a0<\/p>\n<p>3.2 \u4e1a\u52a1\u903b\u8f91 \u2192 \u4ee3\u7801\u6620\u5c04<\/p>\n<p>\u00a0<\/p>\n<p>\u5b9a\u4e49\u5200\u5177\u52a0\u5de5\u8bb0\u5f55\u6a21\u578b<\/p>\n<p>\u00a0 \u00a0\u2502<\/p>\n<p>\u00a0 \u00a0\u25bc ToolLogLoader (pandas)<\/p>\n<p>\u5bfc\u5165 CSV&#xff1a;<\/p>\n<p>\u00a0 tool_id, tool_grade, coating, material, machine,<\/p>\n<p>\u00a0 start_part, end_part, stop_reason<\/p>\n<p>\u00a0 \u6821\u9a8c\u4ef6\u53f7\u8fde\u7eed\u3001\u53bb\u91cd<\/p>\n<p>\u00a0 \u00a0\u2502<\/p>\n<p>\u00a0 \u00a0\u25bc ToolLifeCalculator (numpy\/pandas)<\/p>\n<p>\u5355\u5200\u5bff\u547d&#xff1a;<\/p>\n<p>\u00a0 life_parts &#061; end_part &#8211; start_part &#043; 1<\/p>\n<p>\u00a0 \u6309\u5200\u805a\u5408&#xff0c;\u6807\u8bb0\u65e9\u635f<\/p>\n<p>\u00a0 \u00a0\u2502<\/p>\n<p>\u00a0 \u00a0\u25bc GradeStatistics (pandas\/numpy)<\/p>\n<p>\u578b\u53f7\u7ea7\u7edf\u8ba1&#xff1a;<\/p>\n<p>\u00a0 \u6309 (\u724c\u53f7,\u6d82\u5c42,\u6750\u6599) \u5206\u7ec4<\/p>\n<p>\u00a0 \u5747\u503c\/\u4e2d\u4f4d\u6570\/\u6807\u51c6\u5dee\/P10\/P90\/\u7f6e\u4fe1\u533a\u95f4<\/p>\n<p>\u00a0 \u00a0\u2502<\/p>\n<p>\u00a0 \u00a0\u25bc WeibullAnalyzer (scipy)<\/p>\n<p>\u5bff\u547d\u5206\u5e03&#xff1a;<\/p>\n<p>\u00a0 weibull_min.fit -&gt; \u5f62\u72b6k, \u5c3a\u5ea6\u03b7<\/p>\n<p>\u00a0 k&gt;5 \u96c6\u4e2d, k&lt;2 \u79bb\u6563\u5927<\/p>\n<p>\u00a0 \u8ba1\u7b97 B10 \u5bff\u547d(10%\u5931\u6548\u4ef6\u6570)<\/p>\n<p>\u00a0 \u00a0\u2502<\/p>\n<p>\u00a0 \u00a0\u25bc AnomalyDetector (scikit-learn)<\/p>\n<p>\u65e9\u635f\u8bc6\u522b&#xff1a;<\/p>\n<p>\u00a0 \u7279\u5f81&#061;[\u5bff\u547d, \u504f\u79bb\u540c\u7ec4\u5747\u503c\u6bd4\u4f8b]<\/p>\n<p>\u00a0 IsolationForest \/ KMeans \u627e\u5f02\u5e38\u5200<\/p>\n<p>\u00a0 \u00a0\u2502<\/p>\n<p>\u00a0 \u00a0\u25bc ToolConditionGraph (networkx)<\/p>\n<p>\u5de5\u51b5\u5173\u7cfb\u7f51&#xff1a;<\/p>\n<p>\u00a0 \u5200\u5177\u578b\u53f7-\u6750\u6599-\u673a\u5e8a \u4e09\u5c42\u56fe<\/p>\n<p>\u00a0 \u8fb9\u6743&#061;\u5e73\u5747\u6d88\u8017\u4ef6\u6570\u5012\u6570(\u8d8a\u8d39\u6743\u91cd\u8d8a\u5927)<\/p>\n<p>\u00a0 \u00a0\u2502<\/p>\n<p>\u00a0 \u00a0\u25bc ToolVisualizer (matplotlib)<\/p>\n<p>\u53ef\u89c6\u5316&#xff1a;<\/p>\n<p>\u00a0 1. \u5404\u578b\u53f7\u5bff\u547d\u7bb1\u7ebf\u56fe<\/p>\n<p>\u00a0 2. \u5a01\u5e03\u5c14\u6982\u7387\u56fe<\/p>\n<p>\u00a0 3. \u65e9\u635f\u5200\u6563\u70b9\u6807\u8bb0<\/p>\n<p>\u00a0 4. \u5de5\u51b5\u5173\u7cfb\u7f51\u56fe<\/p>\n<p>\u00a0 5. \u5bff\u547d\u76f4\u65b9\u56fe&#043;\u6807\u79f0\u7ebf<\/p>\n<p>\u00a0 \u00a0\u2502<\/p>\n<p>\u00a0 \u00a0\u25bc SyntheticToolGenerator (numpy)<\/p>\n<p>\u5408\u6210\u6570\u636e&#xff1a;<\/p>\n<p>\u00a0 5\u7c7b\u786c\u8d28\u5408\u91d1\u5200&#xff0c;\u6bcf\u7c7b\u591a\u628a<\/p>\n<p>\u00a0 \u5e7245\u94a2\/\u4e0d\u9508\u94a2\/\u94f8\u94c1&#xff0c;\u542b\u6b63\u5e38\u78e8\u635f&#043;\u5c11\u91cf\u65e9\u635f<\/p>\n<p>\u00a0<\/p>\n<p>3.3 \u4e3a\u4ec0\u4e48\u7528\u5a01\u5e03\u5c14\u800c\u4e0d\u662f\u6b63\u6001\u5206\u5e03&#xff1f;<\/p>\n<p>\u00a0<\/p>\n<p>* \u95ee\u9898&#xff1a;\u5bff\u547d\u6570\u636e\u6709\u4e0b\u9650 0\u3001\u53f3\u504f&#xff0c;\u6b63\u6001\u4f1a\u7b97\u51fa\u8d1f\u5bff\u547d&#xff0c;\u4e14\u5bf9\u65e9\u635f\u4e0d\u654f\u611f\u3002<\/p>\n<p>* \u5904\u7406\u7b56\u7565&#xff1a;\u5a01\u5e03\u5c14\u5206\u5e03\u662f\u53ef\u9760\u6027\u5de5\u7a0b\u6807\u51c6\u6a21\u578b&#xff0c;\u5f62\u72b6\u53c2\u6570\u76f4\u63a5\u53cd\u6620\u5931\u6548\u6a21\u5f0f\u3002<\/p>\n<p>* \u5de5\u7a0b\u5408\u7406\u6027&#xff1a;\u8ddf\u5200\u5177\u5382\u5bff\u547d\u6837\u672c\u62a5\u544a\u53e3\u5f84\u4e00\u81f4&#xff0c;B10 \u5bff\u547d\u53ef\u76f4\u63a5\u7528\u4e8e\u6362\u5200\u7b56\u7565\u3002<\/p>\n<p>\u00a0<\/p>\n<p>3.4 \u5206\u6790\u524d\u540e\u5bf9\u6bd4<\/p>\n<p>\u00a0<\/p>\n<p>\u7ef4\u5ea6 MES\u6362\u5200\u8bb0\u5f55 \u672c\u7a0b\u5e8f<\/p>\n<p>\u540c\u578b\u53f7\u5747\u503c \u624b\u7b97 \u81ea\u52a8\u5206\u7ec4\u805a\u5408<\/p>\n<p>\u5bff\u547d\u5206\u5e03 \u65e0 \u5a01\u5e03\u5c14\u62df\u5408 &#043; B10<\/p>\n<p>\u65e9\u635f\u8bc6\u522b \u9760\u8089\u773c \u805a\u7c7b\u81ea\u52a8\u6807\u7ea2<\/p>\n<p>\u5de5\u51b5\u5f52\u56e0 \u65e0 networkx \u5173\u7cfb\u7f51<\/p>\n<p>\u6362\u5200\u9608\u503c \u62cd\u8111\u888b P90 &#043; B10 \u53cc\u53c2\u8003<\/p>\n<p>\u00a0<\/p>\n<p>\u56db\u3001OOP \u4ee3\u7801\u5b9e\u73b0<\/p>\n<p>\u00a0<\/p>\n<p>4.1 \u9879\u76ee\u7ed3\u6784<\/p>\n<p>\u00a0<\/p>\n<p>tool_life_eval\/<\/p>\n<p>\u251c\u2500\u2500 tool_life_eval\/<\/p>\n<p>\u2502 \u251c\u2500\u2500 __init__.py<\/p>\n<p>\u2502 \u251c\u2500\u2500 log_loader.py # \u5200\u5177\u8bb0\u5f55\u52a0\u8f7d<\/p>\n<p>\u2502 \u251c\u2500\u2500 life_calculator.py # \u5355\u5200\u5bff\u547d\u8ba1\u7b97<\/p>\n<p>\u2502 \u251c\u2500\u2500 grade_statistics.py # \u578b\u53f7\u7ea7\u7edf\u8ba1<\/p>\n<p>\u2502 \u251c\u2500\u2500 weibull_analyzer.py # \u5a01\u5e03\u5c14\u5206\u6790<\/p>\n<p>\u2502 \u251c\u2500\u2500 anomaly_detector.py # \u65e9\u635f\u5f02\u5e38\u8bc6\u522b<\/p>\n<p>\u2502 \u251c\u2500\u2500 condition_graph.py # \u5de5\u51b5\u5173\u7cfb\u7f51<\/p>\n<p>\u2502 \u251c\u2500\u2500 visualizer.py # \u53ef\u89c6\u5316<\/p>\n<p>\u2502 \u2514\u2500\u2500 synthetic_data.py # \u5408\u6210\u6570\u636e<\/p>\n<p>\u251c\u2500\u2500 tests\/<\/p>\n<p>\u2502 \u251c\u2500\u2500 __init__.py<\/p>\n<p>\u2502 \u2514\u2500\u2500 test_tool_life.py<\/p>\n<p>\u251c\u2500\u2500 results\/<\/p>\n<p>\u2502 \u251c\u2500\u2500 box_life_by_grade.png # \u7bb1\u7ebf\u56fe<\/p>\n<p>\u2502 \u251c\u2500\u2500 weibull_probplot.png # \u5a01\u5e03\u5c14\u6982\u7387\u56fe<\/p>\n<p>\u2502 \u251c\u2500\u2500 anomaly_scatter.png # \u65e9\u635f\u6563\u70b9<\/p>\n<p>\u2502 \u251c\u2500\u2500 condition_graph.png # \u5de5\u51b5\u5173\u7cfb\u7f51<\/p>\n<p>\u2502 \u251c\u2500\u2500 life_hist.png # \u5bff\u547d\u76f4\u65b9\u56fe<\/p>\n<p>\u2502 \u251c\u2500\u2500 grade_life_stats.csv # \u578b\u53f7\u7edf\u8ba1\u8868<\/p>\n<p>\u2502 \u251c\u2500\u2500 early_failure_list.csv # \u65e9\u635f\u6e05\u5355<\/p>\n<p>\u2502 \u2514\u2500\u2500 weibull_report.txt<\/p>\n<p>\u2514\u2500\u2500 run_tool_life.py<\/p>\n<p>\u00a0<\/p>\n<p>4.2 \u6838\u5fc3\u6e90\u7801<\/p>\n<p>\u00a0<\/p>\n<p>&lt;details&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&lt;summary&gt;&lt;\/summary&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&#034;&#034;&#034;\u5200\u5177\u52a0\u5de5\u8bb0\u5f55\u52a0\u8f7d\u5668&#034;&#034;&#034;<\/p>\n<p>\u00a0<\/p>\n<p>import pandas as pd<\/p>\n<p>from pathlib import Path<\/p>\n<p>from typing import Optional<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p>class ToolLogLoader:<\/p>\n<p>\u00a0 \u00a0 &#034;&#034;&#034;\u52a0\u8f7d\u5200\u5177\u52a0\u5de5\u6d41\u6c34\u8bb0\u5f55&#034;&#034;&#034;<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 STOP_REASONS &#061; (&#034;normal_wear&#034;, &#034;chipping&#034;, &#034;edge_break&#034;, &#034;reach_life&#034;)<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def __init__(self, filepath: str &#061; &#034;tool_logs.csv&#034;,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0encoding: str &#061; &#034;utf-8&#034;):<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 self.filepath &#061; Path(filepath)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 self.encoding &#061; encoding<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 self._raw: Optional[pd.DataFrame] &#061; None<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def load(self) -&gt; pd.DataFrame:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 if not self.filepath.exists():<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 raise FileNotFoundError(f&#034;\u6587\u4ef6\u4e0d\u5b58\u5728: {self.filepath}&#034;)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 self._raw &#061; pd.read_csv(self.filepath, encoding&#061;self.encoding)<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 rename &#061; {}<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 for tgt, al in {<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;tool_id&#034;: [&#034;tool_id&#034;, &#034;\u5200\u53f7&#034;, &#034;id&#034;],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;tool_grade&#034;: [&#034;tool_grade&#034;, &#034;\u724c\u53f7&#034;, &#034;grade&#034;],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;coating&#034;: [&#034;coating&#034;, &#034;\u6d82\u5c42&#034;, &#034;coat&#034;],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;material&#034;: [&#034;material&#034;, &#034;\u52a0\u5de5\u6750\u6599&#034;, &#034;mat&#034;],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;machine&#034;: [&#034;machine&#034;, &#034;\u673a\u5e8a&#034;, &#034;mc&#034;],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;start_part&#034;: [&#034;start_part&#034;, &#034;\u8d77\u59cb\u4ef6&#034;, &#034;sp&#034;],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;end_part&#034;: [&#034;end_part&#034;, &#034;\u7ed3\u675f\u4ef6&#034;, &#034;ep&#034;],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;stop_reason&#034;: [&#034;stop_reason&#034;, &#034;\u505c\u7528\u539f\u56e0&#034;, &#034;reason&#034;],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 }.items():<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if tgt not in self._raw.columns:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 for a in al:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if a in self._raw.columns:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 rename[a] &#061; tgt<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 break<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 self._raw &#061; self._raw.rename(columns&#061;rename)<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 req &#061; [&#034;tool_id&#034;, &#034;tool_grade&#034;, &#034;coating&#034;, &#034;material&#034;,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0&#034;machine&#034;, &#034;start_part&#034;, &#034;end_part&#034;, &#034;stop_reason&#034;]<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 miss &#061; [c for c in req if c not in self._raw.columns]<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 if miss:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 raise ValueError(f&#034;\u7f3a\u5c11\u5fc5\u8981\u5217: {miss}&#034;)<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 for c in [&#034;start_part&#034;, &#034;end_part&#034;]:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self._raw[c] &#061; pd.to_numeric(self._raw[c], errors&#061;&#034;coerce&#034;)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 self._raw &#061; self._raw.dropna(subset&#061;[&#034;start_part&#034;, &#034;end_part&#034;])<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 self._raw &#061; self._raw[(self._raw[&#034;end_part&#034;] &gt;&#061; self._raw[&#034;start_part&#034;])]<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 self._raw &#061; self._raw.sort_values([&#034;tool_grade&#034;, &#034;tool_id&#034;]).reset_index(drop&#061;True)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 return self._raw.copy()<\/p>\n<p>\u00a0<\/p>\n<p>&lt;\/details&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&lt;details&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&lt;summary&gt;&lt;\/summary&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&#034;&#034;&#034;\u5355\u5200\u5bff\u547d\u8ba1\u7b97&#034;&#034;&#034;<\/p>\n<p>\u00a0<\/p>\n<p>import numpy as np<\/p>\n<p>import pandas as pd<\/p>\n<p>from typing import Optional<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p>class ToolLifeCalculator:<\/p>\n<p>\u00a0 \u00a0 &#034;&#034;&#034;\u8ba1\u7b97\u6bcf\u628a\u5200\u53ef\u52a0\u5de5\u96f6\u4ef6\u6570&#034;&#034;&#034;<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def __init__(self):<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 pass<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def per_tool(self, df: pd.DataFrame) -&gt; pd.DataFrame:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 rows &#061; []<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 for tool_id, g in df.groupby(&#034;tool_id&#034;):<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 head &#061; g.iloc[0]<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # \u652f\u6301\u4e00\u628a\u5200\u5206\u6bb5\u52a0\u5de5\u65f6\u53d6\u5168\u5c40\u8d77\u6b62<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 sp &#061; int(g[&#034;start_part&#034;].min())<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ep &#061; int(g[&#034;end_part&#034;].max())<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 life &#061; ep &#8211; sp &#043; 1<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 rows.append({<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;tool_id&#034;: tool_id,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;tool_grade&#034;: head[&#034;tool_grade&#034;],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;coating&#034;: head[&#034;coating&#034;],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;material&#034;: head[&#034;material&#034;],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;machine&#034;: head[&#034;machine&#034;],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;start_part&#034;: sp,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;end_part&#034;: ep,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;life_parts&#034;: int(life),<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;stop_reason&#034;: g[&#034;stop_reason&#034;].mode().iloc[0],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 })<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 out &#061; pd.DataFrame(rows)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 return out.sort_values(&#034;tool_id&#034;).reset_index(drop&#061;True)<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def tag_early_failure(self, life_df: pd.DataFrame,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 group_keys&#061;(&#034;tool_grade&#034;, &#034;coating&#034;, &#034;material&#034;),<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 k_sigma: float &#061; 2.0) -&gt; pd.DataFrame:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 &#034;&#034;&#034;\u6309\u540c\u5de5\u51b5\u7ec4\u5747\u503c-2\u03c3\u6807\u8bb0\u65e9\u635f&#034;&#034;&#034;<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 df &#061; life_df.copy()<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 stats &#061; df.groupby(list(group_keys))[&#034;life_parts&#034;].agg([&#034;mean&#034;, &#034;std&#034;]).reset_index()<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 stats[&#034;std&#034;] &#061; stats[&#034;std&#034;].fillna(0.0)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 df &#061; df.merge(stats, on&#061;list(group_keys), how&#061;&#034;left&#034;)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 df[&#034;is_early&#034;] &#061; (df[&#034;life_parts&#034;] &lt; df[&#034;mean&#034;] &#8211; k_sigma * df[&#034;std&#034;]) | \\\\<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0(df[&#034;stop_reason&#034;].isin([&#034;chipping&#034;, &#034;edge_break&#034;]))<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 df[&#034;dev_from_mean&#034;] &#061; (df[&#034;life_parts&#034;] &#8211; df[&#034;mean&#034;]).round(2)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 for c in [&#034;mean&#034;, &#034;std&#034;]:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 df[c] &#061; df[c].round(2)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 return df<\/p>\n<p>\u00a0<\/p>\n<p>&lt;\/details&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&lt;details&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&lt;summary&gt;&lt;\/summary&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&#034;&#034;&#034;\u578b\u53f7\u7ea7\u8010\u7528\u5ea6\u7edf\u8ba1&#034;&#034;&#034;<\/p>\n<p>\u00a0<\/p>\n<p>import numpy as np<\/p>\n<p>import pandas as pd<\/p>\n<p>from scipy import stats<\/p>\n<p>from typing import Optional<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p>class GradeStatistics:<\/p>\n<p>\u00a0 \u00a0 &#034;&#034;&#034;\u6309 (\u724c\u53f7,\u6d82\u5c42,\u6750\u6599) \u805a\u5408\u7edf\u8ba1&#034;&#034;&#034;<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def __init__(self, conf: float &#061; 0.95):<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 self.conf &#061; conf<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def summarize(self, life_df: pd.DataFrame) -&gt; pd.DataFrame:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 keys &#061; [&#034;tool_grade&#034;, &#034;coating&#034;, &#034;material&#034;]<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 g &#061; life_df.groupby(keys)[&#034;life_parts&#034;]<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 n &#061; g.count()<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 mean &#061; g.mean()<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 med &#061; g.median()<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 std &#061; g.std(ddof&#061;1).fillna(0.0)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 p10 &#061; g.quantile(0.10)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 p90 &#061; g.quantile(0.90)<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 # \u5747\u503c\u7f6e\u4fe1\u533a\u95f4<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 rows &#061; []<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 for key_tuple in mean.index:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 sub &#061; life_df[(life_df[&#034;tool_grade&#034;] &#061;&#061; key_tuple[0]) &amp;<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 (life_df[&#034;coating&#034;] &#061;&#061; key_tuple[1]) &amp;<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 (life_df[&#034;material&#034;] &#061;&#061; key_tuple[2])][&#034;life_parts&#034;].values<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if len(sub) &gt; 1:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ci &#061; stats.t.interval(self.conf, len(sub) &#8211; 1,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 loc&#061;sub.mean(), scale&#061;stats.sem(sub))<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ci_lo, ci_hi &#061; round(ci[0], 1), round(ci[1], 1)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 else:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ci_lo &#061; ci_hi &#061; round(float(sub.mean()), 1)<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 rows.append({<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;tool_grade&#034;: key_tuple[0],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;coating&#034;: key_tuple[1],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;material&#034;: key_tuple[2],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;n_tools&#034;: int(n[key_tuple]),<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;mean_life&#034;: round(mean[key_tuple], 1),<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;median_life&#034;: round(med[key_tuple], 1),<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;std_life&#034;: round(std[key_tuple], 1),<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;p10_life&#034;: round(p10[key_tuple], 1),<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;p90_life&#034;: round(p90[key_tuple], 1),<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;ci95_lo&#034;: ci_lo,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;ci95_hi&#034;: ci_hi,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;early_fail_cnt&#034;: int(((life_df[<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 (life_df[&#034;tool_grade&#034;] &#061;&#061; key_tuple[0]) &amp;<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 (life_df[&#034;coating&#034;] &#061;&#061; key_tuple[1]) &amp;<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 (life_df[&#034;material&#034;] &#061;&#061; key_tuple[2])<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ][&#034;is_early&#034;] &#061;&#061; True).sum()),<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 })<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 return pd.DataFrame(rows).sort_values(&#034;mean_life&#034;, ascending&#061;False).reset_index(drop&#061;True)<\/p>\n<p>\u00a0<\/p>\n<p>&lt;\/details&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&lt;details&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&lt;summary&gt;&lt;\/summary&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&#034;&#034;&#034;\u5a01\u5e03\u5c14\u5bff\u547d\u5206\u6790 (scipy)&#034;&#034;&#034;<\/p>\n<p>\u00a0<\/p>\n<p>import numpy as np<\/p>\n<p>import pandas as pd<\/p>\n<p>from scipy import stats<\/p>\n<p>from typing import Dict, Optional<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p>class WeibullAnalyzer:<\/p>\n<p>\u00a0 \u00a0 &#034;&#034;&#034;\u5bf9\u6bcf\u7ec4\u5bff\u547d\u505a\u5a01\u5e03\u5c14\u6700\u5c0f\u5206\u5e03\u62df\u5408&#034;&#034;&#034;<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def __init__(self):<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 pass<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def fit_group(self, life_values: np.ndarray) -&gt; Dict:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 x &#061; np.asarray(life_values, dtype&#061;float)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 x &#061; x[x &gt; 0]<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 if len(x) &lt; 3:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return {&#034;k&#034;: np.nan, &#034;eta&#034;: np.nan, &#034;b10&#034;: np.nan}<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 # weibull_min(c, loc, scale), c\u5373\u5f62\u72b6k<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 c, loc, scale &#061; stats.weibull_min.fit(x, floc&#061;0)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 k &#061; float(c)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 eta &#061; float(scale)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 b10 &#061; float(eta * np.log(1 \/ 0.9) ** (1 \/ k)) if k &gt; 0 else np.nan<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 return {&#034;k&#034;: round(k, 3), &#034;eta&#034;: round(eta, 1), &#034;b10&#034;: round(b10, 1)}<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def fit_all_groups(self, life_df: pd.DataFrame) -&gt; pd.DataFrame:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 keys &#061; [&#034;tool_grade&#034;, &#034;coating&#034;, &#034;material&#034;]<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 rows &#061; []<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 for key_tuple, g in life_df.groupby(keys):<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 res &#061; self.fit_group(g[&#034;life_parts&#034;].values)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 rows.append({<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;tool_grade&#034;: key_tuple[0],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;coating&#034;: key_tuple[1],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;material&#034;: key_tuple[2],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;weibull_k&#034;: res[&#034;k&#034;],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;weibull_eta&#034;: res[&#034;eta&#034;],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;b10_life&#034;: res[&#034;b10&#034;],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;dispersion&#034;: &#034;\u96c6\u4e2d&#034; if (res[&#034;k&#034;] and res[&#034;k&#034;] &gt; 5)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 else (&#034;\u79bb\u6563&#034; if (res[&#034;k&#034;] and res[&#034;k&#034;] &lt; 2) else &#034;\u4e2d\u7b49&#034;),<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 })<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 return pd.DataFrame(rows).sort_values(&#034;weibull_k&#034;, ascending&#061;False).reset_index(drop&#061;True)<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def probplot_data(self, life_values: np.ndarray):<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 &#034;&#034;&#034;\u8fd4\u56de\u5a01\u5e03\u5c14\u6982\u7387\u56fe\u5750\u6807&#034;&#034;&#034;<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 x &#061; np.sort(np.asarray(life_values, dtype&#061;float))<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 x &#061; x[x &gt; 0]<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 n &#061; len(x)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 if n &lt; 2:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return x, np.array([])<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 f &#061; (np.arange(1, n &#043; 1) &#8211; 0.3) \/ (n &#043; 0.4)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 y &#061; np.log(-np.log(1 &#8211; f))<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 return x, y<\/p>\n<p>\u00a0<\/p>\n<p>&lt;\/details&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&lt;details&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&lt;summary&gt;&lt;\/summary&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&#034;&#034;&#034;\u65e9\u635f\u5f02\u5e38\u5200\u8bc6\u522b (scikit-learn)&#034;&#034;&#034;<\/p>\n<p>\u00a0<\/p>\n<p>import numpy as np<\/p>\n<p>import pandas as pd<\/p>\n<p>from sklearn.cluster import KMeans<\/p>\n<p>from sklearn.preprocessing import StandardScaler<\/p>\n<p>from typing import Optional<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p>class AnomalyDetector:<\/p>\n<p>\u00a0 \u00a0 &#034;&#034;&#034;\u57fa\u4e8e\u540c\u5de5\u51b5\u504f\u79bb\u5ea6\u805a\u7c7b\u627e\u65e9\u635f\u5200&#034;&#034;&#034;<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def __init__(self, n_clusters: int &#061; 2, random_state: int &#061; 42):<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 self.n_clusters &#061; n_clusters<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 self.random_state &#061; random_state<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 self.scaler &#061; StandardScaler()<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def detect(self, tagged_df: pd.DataFrame) -&gt; pd.DataFrame:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 df &#061; tagged_df.copy()<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 # \u7279\u5f81&#xff1a;\u5bff\u547d &#043; \u504f\u79bb\u5747\u503c\u6bd4\u4f8b<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 df[&#034;dev_ratio&#034;] &#061; df[&#034;dev_from_mean&#034;] \/ (df[&#034;mean&#034;] &#043; 1e-9)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 X &#061; df[[&#034;life_parts&#034;, &#034;dev_ratio&#034;]].values<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 Xs &#061; self.scaler.fit_transform(X)<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 k &#061; min(self.n_clusters, len(df))<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 km &#061; KMeans(n_clusters&#061;k, random_state&#061;self.random_state, n_init&#061;10)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 df[&#034;cluster&#034;] &#061; km.fit_predict(Xs)<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 # \u5bff\u547d\u4f4e\u7684\u7c07\u6807\u8bb0\u4e3a\u5f02\u5e38\u7c07<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 cmean &#061; df.groupby(&#034;cluster&#034;)[&#034;life_parts&#034;].mean()<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 low_cluster &#061; cmean.idxmin()<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 df[&#034;cluster_is_early&#034;] &#061; df[&#034;cluster&#034;] &#061;&#061; low_cluster<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 # \u7efc\u5408\u6807\u8bb0&#xff1a;\u89c4\u5219\u65e9\u635f OR \u805a\u7c7b\u5f02\u5e38\u7c07<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 df[&#034;final_early_flag&#034;] &#061; df[&#034;is_early&#034;] | df[&#034;cluster_is_early&#034;]<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 return df.sort_values(&#034;life_parts&#034;).reset_index(drop&#061;True)<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def summary(self, df: pd.DataFrame) -&gt; pd.DataFrame:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 sub &#061; df[df[&#034;final_early_flag&#034;]]<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 return sub[[&#034;tool_id&#034;, &#034;tool_grade&#034;, &#034;coating&#034;, &#034;material&#034;,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;machine&#034;, &#034;life_parts&#034;, &#034;mean&#034;, &#034;stop_reason&#034;,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;dev_from_mean&#034;]].copy()<\/p>\n<p>\u00a0<\/p>\n<p>&lt;\/details&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&lt;details&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&lt;summary&gt;&lt;\/summary&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&#034;&#034;&#034;\u5de5\u51b5\u5173\u7cfb\u7f51 (networkx)&#034;&#034;&#034;<\/p>\n<p>\u00a0<\/p>\n<p>import networkx as nx<\/p>\n<p>import pandas as pd<\/p>\n<p>from typing import Optional<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p>class ToolConditionGraph:<\/p>\n<p>\u00a0 \u00a0 &#034;&#034;&#034;\u5200\u5177\u578b\u53f7-\u6750\u6599-\u673a\u5e8a \u4e09\u5c42\u5173\u7cfb\u7f51&#034;&#034;&#034;<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def __init__(self):<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 self.G &#061; nx.Graph()<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def build(self, life_df: pd.DataFrame, stats_df: pd.DataFrame) -&gt; nx.Graph:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 self.G.clear()<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 # \u8282\u70b9<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 for _, r in stats_df.iterrows():<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 gid &#061; f&#034;{r[&#039;tool_grade&#039;]}|{r[&#039;coating&#039;]}&#034;<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.G.add_node(gid, ntype&#061;&#034;grade&#034;,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 mean_life&#061;r[&#034;mean_life&#034;])<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.G.add_node(r[&#034;material&#034;], ntype&#061;&#034;material&#034;)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 for m in life_df[&#034;machine&#034;].unique():<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.G.add_node(m, ntype&#061;&#034;machine&#034;)<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 # \u8fb9&#xff1a;grade-material, \u6743&#061;1\/\u5747\u503c\u5bff\u547d(\u8d8a\u8d39\u8d8a\u5927)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 for _, r in stats_df.iterrows():<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 gid &#061; f&#034;{r[&#039;tool_grade&#039;]}|{r[&#039;coating&#039;]}&#034;<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 w &#061; round(1.0 \/ (r[&#034;mean_life&#034;] &#043; 1e-9), 5)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.G.add_edge(gid, r[&#034;material&#034;], weight&#061;w,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 mean_life&#061;r[&#034;mean_life&#034;])<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 # \u673a\u5e8a\u7ea7\u5e73\u5747\u5bff\u547d<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 mc &#061; life_df.groupby([&#034;machine&#034;, &#034;tool_grade&#034;, &#034;coating&#034;])[&#034;life_parts&#034;].mean().reset_index()<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 for _, r in mc.iterrows():<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 gid &#061; f&#034;{r[&#039;tool_grade&#039;]}|{r[&#039;coating&#039;]}&#034;<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 self.G.add_edge(gid, r[&#034;machine&#034;],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 weight&#061;round(1.0 \/ (r[&#034;life_parts&#034;] &#043; 1e-9), 5),<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 mean_life&#061;round(r[&#034;life_parts&#034;], 1))<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 return self.G<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def bottleneck_paths(self) -&gt; pd.DataFrame:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 &#034;&#034;&#034;\u627e\u5e73\u5747\u5bff\u547d\u6700\u4f4e\u7684 grade-material-machine \u7ec4\u5408&#034;&#034;&#034;<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 rows &#061; []<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 for u, v, d in self.G.edges(data&#061;True):<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if &#034;mean_life&#034; in d:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 rows.append({&#034;node_a&#034;: u, &#034;node_b&#034;: v,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0&#034;mean_life&#034;: d[&#034;mean_life&#034;],<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0&#034;weight&#034;: d[&#034;weight&#034;]})<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 df &#061; pd.DataFrame(rows)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 if df.empty:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return df<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 return df.sort_values(&#034;mean_life&#034;).reset_index(drop&#061;True)<\/p>\n<p>\u00a0<\/p>\n<p>&lt;\/details&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&lt;details&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&lt;summary&gt;&lt;\/summary&gt;<\/p>\n<p>\u00a0<\/p>\n<p>&#034;&#034;&#034;\u53ef\u89c6\u5316&#034;&#034;&#034;<\/p>\n<p>\u00a0<\/p>\n<p>import numpy as np<\/p>\n<p>import pandas as pd<\/p>\n<p>import matplotlib.pyplot as plt<\/p>\n<p>import networkx as nx<\/p>\n<p>from pathlib import Path<\/p>\n<p>\u00a0<\/p>\n<p>plt.rcParams[&#034;font.sans-serif&#034;] &#061; [&#034;SimHei&#034;, &#034;DejaVu Sans&#034;]<\/p>\n<p>plt.rcParams[&#034;axes.unicode_minus&#034;] &#061; False<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p>class ToolVisualizer:<\/p>\n<p>\u00a0 \u00a0 def __init__(self, results_dir: str &#061; &#034;results&#034;):<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 self.results_dir &#061; Path(results_dir)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 self.results_dir.mkdir(exist_ok&#061;True)<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def box_life(self, life_df, stats_df):<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 fig, ax &#061; plt.subplots(figsize&#061;(14, 6))<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 labels &#061; stats_df.apply(lambda r: f&#034;{r[&#039;tool_grade&#039;]}\\\\n{r[&#039;coating&#039;]}\\\\n{r[&#039;material&#039;]}&#034;, axis&#061;1)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 data &#061; []<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 for _, r in stats_df.iterrows():<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 sub &#061; life_df[(life_df[&#034;tool_grade&#034;] &#061;&#061; r[&#034;tool_grade&#034;]) &amp;<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 (life_df[&#034;coating&#034;] &#061;&#061; r[&#034;coating&#034;]) &amp;<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 (life_df[&#034;material&#034;] &#061;&#061; r[&#034;material&#034;])][&#034;life_parts&#034;].values<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 data.append(sub)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ax.boxplot(data, labels&#061;labels, showmeans&#061;True)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ax.set_ylabel(&#034;\u53ef\u52a0\u5de5\u4ef6\u6570&#034;, fontsize&#061;12)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ax.set_title(&#034;\u5404\u578b\u53f7\u5200\u5177\u5bff\u547d\u7bb1\u7ebf\u56fe&#034;, fontsize&#061;14, fontweight&#061;&#034;bold&#034;)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 plt.xticks(rotation&#061;30, ha&#061;&#034;right&#034;, fontsize&#061;8)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ax.grid(axis&#061;&#034;y&#034;, alpha&#061;0.3)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 plt.tight_layout()<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 plt.savefig(self.results_dir \/ &#034;box_life_by_grade.png&#034;,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0dpi&#061;150, bbox_inches&#061;&#034;tight&#034;)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 plt.close()<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def weibull_probplot(self, life_df, weibull_df):<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 fig, ax &#061; plt.subplots(figsize&#061;(12, 7))<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 for _, w in weibull_df.iterrows():<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 sub &#061; life_df[(life_df[&#034;tool_grade&#034;] &#061;&#061; w[&#034;tool_grade&#034;]) &amp;<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 (life_df[&#034;coating&#034;] &#061;&#061; w[&#034;coating&#034;]) &amp;<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 (life_df[&#034;material&#034;] &#061;&#061; w[&#034;material&#034;])][&#034;life_parts&#034;].values<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 x, y &#061; WeibullProbHelper().probplot_data(sub)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if len(x) &lt; 2:<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 continue<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ax.plot(x, y, &#034;.-&#034;, label&#061;f&#034;{w[&#039;tool_grade&#039;]}|{w[&#039;coating&#039;]}|{w[&#039;material&#039;]} k&#061;{w[&#039;weibull_k&#039;]}&#034;)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ax.set_xscale(&#034;log&#034;)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ax.set_xlabel(&#034;\u5bff\u547d\u4ef6\u6570 (log)&#034;, fontsize&#061;12)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ax.set_ylabel(&#034;ln(-ln(1-F))&#034;, fontsize&#061;12)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ax.set_title(&#034;\u5a01\u5e03\u5c14\u6982\u7387\u56fe&#034;, fontsize&#061;14, fontweight&#061;&#034;bold&#034;)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ax.legend(fontsize&#061;7)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ax.grid(alpha&#061;0.3)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 plt.tight_layout()<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 plt.savefig(self.results_dir \/ &#034;weibull_probplot.png&#034;,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0dpi&#061;150, bbox_inches&#061;&#034;tight&#034;)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 plt.close()<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def anomaly_scatter(self, det_df):<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 fig, ax &#061; plt.subplots(figsize&#061;(12, 6))<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 normal &#061; det_df[~det_df[&#034;final_early_flag&#034;]]<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 early &#061; det_df[det_df[&#034;final_early_flag&#034;]]<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ax.scatter(normal[&#034;mean&#034;], normal[&#034;life_parts&#034;], c&#061;&#034;#3498DB&#034;,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0label&#061;&#034;\u6b63\u5e38\u5200&#034;, s&#061;30, alpha&#061;0.7)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ax.scatter(early[&#034;mean&#034;], early[&#034;life_parts&#034;], c&#061;&#034;#E74C3C&#034;,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0label&#061;&#034;\u65e9\u635f\u5200&#034;, s&#061;60, edgecolor&#061;&#034;k&#034;)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 # \u53c2\u8003\u7ebf y&#061;mean<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 allx &#061; det_df[&#034;mean&#034;].values<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ax.plot(allx, allx, &#034;g&#8211;&#034;, alpha&#061;0.5, label&#061;&#034;\u540c\u7ec4\u5747\u503c\u7ebf&#034;)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 for _, r in early.iterrows():<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ax.annotate(r[&#034;tool_id&#034;], (r[&#034;mean&#034;], r[&#034;life_parts&#034;]),<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 fontsize&#061;7, color&#061;&#034;red&#034;)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ax.set_xlabel(&#034;\u540c\u5de5\u51b5\u7ec4\u5e73\u5747\u5bff\u547d(\u4ef6)&#034;, fontsize&#061;12)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ax.set_ylabel(&#034;\u672c\u5200\u5bff\u547d(\u4ef6)&#034;, fontsize&#061;12)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ax.set_title(&#034;\u65e9\u635f\u5200\u5177\u8bc6\u522b\u6563\u70b9\u56fe&#034;, fontsize&#061;14, fontweight&#061;&#034;bold&#034;)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ax.legend()<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ax.grid(alpha&#061;0.3)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 plt.tight_layout()<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 plt.savefig(self.results_dir \/ &#034;anomaly_scatter.png&#034;,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0dpi&#061;150, bbox_inches&#061;&#034;tight&#034;)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 plt.close()<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0 \u00a0 def condition_graph(self, G):<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 fig, ax &#061; plt.subplots(figsize&#061;(14, 9))<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 pos &#061; nx.spring_layout(G, seed&#061;42, k&#061;0.6)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ncolors &#061; []<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 for n, d in G.nodes(data&#061;True):<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 t &#061; d.get(&#034;ntype&#034;, &#034;grade&#034;)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ncolors.append({&#034;grade&#034;: &#034;#E74C3C&#034;, &#034;material&#034;: &#034;#2ECC71&#034;,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#034;machine&#034;: &#034;#3498DB&#034;}.get(t, &#034;#999&#034;))<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 sizes &#061; [300 &#043; (G.nodes[n].get(&#034;mean_life&#034;, 50) * 3 if G.nodes[n].get(&#034;ntype&#034;)&#061;&#061;&#034;grade&#034; else 300) for n in G.nodes()]<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 nx.draw_networkx_nodes(G, pos, node_color&#061;ncolors,<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0node_size&#061;sizes, ax&#061;ax, alpha&#061;0.9)<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 edges &#061; [(u, v) for u, v, d in G.edges(data&#061;True)]<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 ws &#061; [G.edges[u, v][&#034;weight&#034;] * 8000 for u, v in edges]<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 nx.draw_networkx_edg<\/p>\n<p>\u5229\u7528AI\u89e3\u51b3\u5b9e\u9645\u95ee\u9898&#xff0c;\u5982\u679c\u4f60\u89c9\u5f97\u8fd9\u4e2a\u5de5\u5177\u597d\u7528&#xff0c;\u6b22\u8fce\u5173\u6ce8\u957f\u5b89\u7267\u7b1b&#xff01;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5468\u4e09\u591c\u73ed&#xff0c;\u673a\u52a0\u8f66\u95f4\u3002\\&#8221;\u8fd9\u6279\u4ef6\u5e72\u5230 180 \u4ef6&#xff0c;\u5200\u53c8\u5d29\u4e86&#xff0c;\\&#8221;\u5200\u5177\u7ba1\u7406\u5458\u8001\u5468\u628a\u51e0\u6839\u786c\u8d28\u5408\u91d1\u5200\u6446\u684c\u4e0a&#xff0c;\\&#8221;\u7cfb\u7edf\u91cc\u8bb0\u7684\u662f\u6362\u5200\u4e8b\u4ef6&#xff0c;\u53ef\u6211\u60f3\u77e5\u9053&#xff1a;\u540c\u724c\u53f7\u7684\u5200&#xff0c;\u5e72\u8fd9\u4e2a\u6750\u6599\u5230\u5e95\u80fd\u6491\u591a\u5c11\u4ef6&#xff1f;\u662f 150 \u4ef6\u5c31\u5230\u5934&#xff0c;\u8fd8\u662f\u80fd\u5230 220&#xff1f;\u73b0\u5728\u5168\u9760\u8001\u5e08\u5085\u62cd\u8111\u888b&#xff0c;\u6362\u65e9\u4e86\u6d6a\u8d39\u5200&#xff0c;\u6362\u665a\u4e86\u51fa\u5e9f\u54c1\u3002\\&#8221;\u6211\u6253\u5f00 MES \u7684\u5bfc\u51fa\u8868\u3002\\&#8221;\u8fd9\u8868\u91cc\u6709\u4ec0\u4e48&amp;#xff<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[2468,4278,81,737,2606],"topic":[],"class_list":["post-112153","post","type-post","status-publish","format-standard","hentry","category-server","tag-matplotlib","tag-pandas","tag-python","tag-scikit-learn","tag-2606"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>python\u7684\u5148\u8fdb\u5236\u9020\u6280\u672f\u5de5\u4e1a\u573a\u666f\u6a21\u62df\u7b2c\u4e8c\u5341\u56db\u7bc7:\u8bfb\u53d6\u4e0d\u540c\u786c\u8d28\u5408\u91d1\u5200\u5177\u52a0\u5de5\u8bb0\u5f55\uff0c\u7edf\u8ba1\u6bcf\u79cd\u5200\u5177\u53ef\u52a0\u5de5\u96f6\u4ef6\u6570\u91cf\uff0c\u8bc4\u4f30\u5200\u5177\u8010\u7528\u5ea6\u3002 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/112153.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"python\u7684\u5148\u8fdb\u5236\u9020\u6280\u672f\u5de5\u4e1a\u573a\u666f\u6a21\u62df\u7b2c\u4e8c\u5341\u56db\u7bc7:\u8bfb\u53d6\u4e0d\u540c\u786c\u8d28\u5408\u91d1\u5200\u5177\u52a0\u5de5\u8bb0\u5f55\uff0c\u7edf\u8ba1\u6bcf\u79cd\u5200\u5177\u53ef\u52a0\u5de5\u96f6\u4ef6\u6570\u91cf\uff0c\u8bc4\u4f30\u5200\u5177\u8010\u7528\u5ea6\u3002 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u5468\u4e09\u591c\u73ed&#xff0c;\u673a\u52a0\u8f66\u95f4\u3002&quot;\u8fd9\u6279\u4ef6\u5e72\u5230 180 \u4ef6&#xff0c;\u5200\u53c8\u5d29\u4e86&#xff0c;&quot;\u5200\u5177\u7ba1\u7406\u5458\u8001\u5468\u628a\u51e0\u6839\u786c\u8d28\u5408\u91d1\u5200\u6446\u684c\u4e0a&#xff0c;&quot;\u7cfb\u7edf\u91cc\u8bb0\u7684\u662f\u6362\u5200\u4e8b\u4ef6&#xff0c;\u53ef\u6211\u60f3\u77e5\u9053&#xff1a;\u540c\u724c\u53f7\u7684\u5200&#xff0c;\u5e72\u8fd9\u4e2a\u6750\u6599\u5230\u5e95\u80fd\u6491\u591a\u5c11\u4ef6&#xff1f;\u662f 150 \u4ef6\u5c31\u5230\u5934&#xff0c;\u8fd8\u662f\u80fd\u5230 220&#xff1f;\u73b0\u5728\u5168\u9760\u8001\u5e08\u5085\u62cd\u8111\u888b&#xff0c;\u6362\u65e9\u4e86\u6d6a\u8d39\u5200&#xff0c;\u6362\u665a\u4e86\u51fa\u5e9f\u54c1\u3002&quot;\u6211\u6253\u5f00 MES \u7684\u5bfc\u51fa\u8868\u3002&quot;\u8fd9\u8868\u91cc\u6709\u4ec0\u4e48&amp;#xff\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/112153.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-02T11:56:52+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/112153.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/112153.html\",\"name\":\"python\u7684\u5148\u8fdb\u5236\u9020\u6280\u672f\u5de5\u4e1a\u573a\u666f\u6a21\u62df\u7b2c\u4e8c\u5341\u56db\u7bc7:\u8bfb\u53d6\u4e0d\u540c\u786c\u8d28\u5408\u91d1\u5200\u5177\u52a0\u5de5\u8bb0\u5f55\uff0c\u7edf\u8ba1\u6bcf\u79cd\u5200\u5177\u53ef\u52a0\u5de5\u96f6\u4ef6\u6570\u91cf\uff0c\u8bc4\u4f30\u5200\u5177\u8010\u7528\u5ea6\u3002 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-10-02T11:56:52+00:00\",\"dateModified\":\"2026-10-02T11:56:52+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/112153.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/112153.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/112153.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"python\u7684\u5148\u8fdb\u5236\u9020\u6280\u672f\u5de5\u4e1a\u573a\u666f\u6a21\u62df\u7b2c\u4e8c\u5341\u56db\u7bc7:\u8bfb\u53d6\u4e0d\u540c\u786c\u8d28\u5408\u91d1\u5200\u5177\u52a0\u5de5\u8bb0\u5f55\uff0c\u7edf\u8ba1\u6bcf\u79cd\u5200\u5177\u53ef\u52a0\u5de5\u96f6\u4ef6\u6570\u91cf\uff0c\u8bc4\u4f30\u5200\u5177\u8010\u7528\u5ea6\u3002\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"python\u7684\u5148\u8fdb\u5236\u9020\u6280\u672f\u5de5\u4e1a\u573a\u666f\u6a21\u62df\u7b2c\u4e8c\u5341\u56db\u7bc7:\u8bfb\u53d6\u4e0d\u540c\u786c\u8d28\u5408\u91d1\u5200\u5177\u52a0\u5de5\u8bb0\u5f55\uff0c\u7edf\u8ba1\u6bcf\u79cd\u5200\u5177\u53ef\u52a0\u5de5\u96f6\u4ef6\u6570\u91cf\uff0c\u8bc4\u4f30\u5200\u5177\u8010\u7528\u5ea6\u3002 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/112153.html","og_locale":"zh_CN","og_type":"article","og_title":"python\u7684\u5148\u8fdb\u5236\u9020\u6280\u672f\u5de5\u4e1a\u573a\u666f\u6a21\u62df\u7b2c\u4e8c\u5341\u56db\u7bc7:\u8bfb\u53d6\u4e0d\u540c\u786c\u8d28\u5408\u91d1\u5200\u5177\u52a0\u5de5\u8bb0\u5f55\uff0c\u7edf\u8ba1\u6bcf\u79cd\u5200\u5177\u53ef\u52a0\u5de5\u96f6\u4ef6\u6570\u91cf\uff0c\u8bc4\u4f30\u5200\u5177\u8010\u7528\u5ea6\u3002 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u5468\u4e09\u591c\u73ed&#xff0c;\u673a\u52a0\u8f66\u95f4\u3002\"\u8fd9\u6279\u4ef6\u5e72\u5230 180 \u4ef6&#xff0c;\u5200\u53c8\u5d29\u4e86&#xff0c;\"\u5200\u5177\u7ba1\u7406\u5458\u8001\u5468\u628a\u51e0\u6839\u786c\u8d28\u5408\u91d1\u5200\u6446\u684c\u4e0a&#xff0c;\"\u7cfb\u7edf\u91cc\u8bb0\u7684\u662f\u6362\u5200\u4e8b\u4ef6&#xff0c;\u53ef\u6211\u60f3\u77e5\u9053&#xff1a;\u540c\u724c\u53f7\u7684\u5200&#xff0c;\u5e72\u8fd9\u4e2a\u6750\u6599\u5230\u5e95\u80fd\u6491\u591a\u5c11\u4ef6&#xff1f;\u662f 150 \u4ef6\u5c31\u5230\u5934&#xff0c;\u8fd8\u662f\u80fd\u5230 220&#xff1f;\u73b0\u5728\u5168\u9760\u8001\u5e08\u5085\u62cd\u8111\u888b&#xff0c;\u6362\u65e9\u4e86\u6d6a\u8d39\u5200&#xff0c;\u6362\u665a\u4e86\u51fa\u5e9f\u54c1\u3002\"\u6211\u6253\u5f00 MES \u7684\u5bfc\u51fa\u8868\u3002\"\u8fd9\u8868\u91cc\u6709\u4ec0\u4e48&amp;#xff","og_url":"https:\/\/www.wsisp.com\/helps\/112153.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-10-02T11:56:52+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"12 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/112153.html","url":"https:\/\/www.wsisp.com\/helps\/112153.html","name":"python\u7684\u5148\u8fdb\u5236\u9020\u6280\u672f\u5de5\u4e1a\u573a\u666f\u6a21\u62df\u7b2c\u4e8c\u5341\u56db\u7bc7:\u8bfb\u53d6\u4e0d\u540c\u786c\u8d28\u5408\u91d1\u5200\u5177\u52a0\u5de5\u8bb0\u5f55\uff0c\u7edf\u8ba1\u6bcf\u79cd\u5200\u5177\u53ef\u52a0\u5de5\u96f6\u4ef6\u6570\u91cf\uff0c\u8bc4\u4f30\u5200\u5177\u8010\u7528\u5ea6\u3002 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-10-02T11:56:52+00:00","dateModified":"2026-10-02T11:56:52+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/112153.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/112153.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/112153.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"python\u7684\u5148\u8fdb\u5236\u9020\u6280\u672f\u5de5\u4e1a\u573a\u666f\u6a21\u62df\u7b2c\u4e8c\u5341\u56db\u7bc7:\u8bfb\u53d6\u4e0d\u540c\u786c\u8d28\u5408\u91d1\u5200\u5177\u52a0\u5de5\u8bb0\u5f55\uff0c\u7edf\u8ba1\u6bcf\u79cd\u5200\u5177\u53ef\u52a0\u5de5\u96f6\u4ef6\u6570\u91cf\uff0c\u8bc4\u4f30\u5200\u5177\u8010\u7528\u5ea6\u3002"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/112153","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=112153"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/112153\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=112153"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=112153"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=112153"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=112153"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}