{"id":24108,"date":"2026-05-18T13:40:09","date_gmt":"2026-05-18T13:40:09","guid":{"rendered":"https:\/\/umang.pk\/2026\/05\/18\/%d8%a7%d8%b2%da%af%d8%b1-%d9%85%db%8c%da%ba-%d9%b9%d8%a7%d8%a6%d9%85-%d8%b3%db%8c%d8%b1%db%8c%d8%b2-%da%a9%d8%a7-%da%88%db%8c%d9%b9%d8%a7-%da%a9%db%8c%d8%b3%db%92-%d8%b5%d8%a7%d9%81-%da%a9%d8%b1%db%8c\/"},"modified":"2026-05-18T13:40:09","modified_gmt":"2026-05-18T13:40:09","slug":"%d8%a7%d8%b2%da%af%d8%b1-%d9%85%db%8c%da%ba-%d9%b9%d8%a7%d8%a6%d9%85-%d8%b3%db%8c%d8%b1%db%8c%d8%b2-%da%a9%d8%a7-%da%88%db%8c%d9%b9%d8%a7-%da%a9%db%8c%d8%b3%db%92-%d8%b5%d8%a7%d9%81-%da%a9%d8%b1%db%8c","status":"publish","type":"post","link":"https:\/\/umang.pk\/en_us\/2026\/05\/18\/%d8%a7%d8%b2%da%af%d8%b1-%d9%85%db%8c%da%ba-%d9%b9%d8%a7%d8%a6%d9%85-%d8%b3%db%8c%d8%b1%db%8c%d8%b2-%da%a9%d8%a7-%da%88%db%8c%d9%b9%d8%a7-%da%a9%db%8c%d8%b3%db%92-%d8%b5%d8%a7%d9%81-%da%a9%d8%b1%db%8c\/","title":{"rendered":"\u0627\u0632\u06af\u0631 \u0645\u06cc\u06ba \u0679\u0627\u0626\u0645 \u0633\u06cc\u0631\u06cc\u0632 \u06a9\u0627 \u0688\u06cc\u0679\u0627 \u06a9\u06cc\u0633\u06d2 \u0635\u0627\u0641 \u06a9\u0631\u06cc\u06ba\u06d4"},"content":{"rendered":"\n<div id=\"\">\n<p>\u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 \u0633\u06cc\u0631\u06cc\u0632 \u06a9\u0627 \u0688\u06cc\u0679\u0627 \u0634\u0627\u0630 \u0648 \u0646\u0627\u062f\u0631 \u06c1\u06cc \u0635\u0627\u0641 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0633\u06cc\u0646\u0633\u0631 \u06a9\u06cc \u0628\u0646\u062f\u0634\u060c \u0633\u0633\u0679\u0645 \u06a9\u0644\u0627\u06a9 \u0688\u0631\u0641\u0679\u060c \u0688\u067e\u0644\u06cc\u06a9\u06cc\u0679 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u0631\u06cc\u06a9\u0627\u0631\u0688\u060c \u0627\u0648\u0631 \u062f\u0633\u062a\u06cc \u0688\u06cc\u0679\u0627 \u0627\u0646\u0679\u0631\u06cc \u063a\u0644\u0637\u06cc\u0648\u06ba \u06a9\u0627 \u0633\u0628\u0628 \u0628\u0646\u062a\u06cc \u06c1\u06d2\u06d4 \u062c\u0628 \u062a\u06a9 \u0688\u06cc\u0679\u0627 \u0633\u06cc\u0679 \u0622\u067e \u06a9\u06d2 \u0644\u06cc\u067e \u0679\u0627\u067e \u062a\u06a9 \u067e\u06c1\u0646\u0686\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633\u06d2 \u062c\u0645\u0639\u060c \u0645\u0646\u062a\u0642\u0644\u060c \u0627\u0648\u0631 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u06c1\u0631 \u0642\u062f\u0645 \u0628\u062f\u0639\u0646\u0648\u0627\u0646\u06cc \u06a9\u0627 \u0645\u0645\u06a9\u0646\u06c1 \u0630\u0631\u06cc\u0639\u06c1 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0679\u0627\u0626\u0645 \u0633\u06cc\u0631\u06cc\u0632 \u0688\u06cc\u0679\u0627 \u06a9\u0648 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0646\u0627 \u0679\u06cc\u0628\u0644\u0631 \u0688\u06cc\u0679\u0627 \u06a9\u0648 \u0645\u0646\u0638\u0645 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0634\u06a9\u0644 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0648\u0642\u062a \u0627\u06cc\u06a9 \u0633\u0627\u062e\u062a\u06cc \u0631\u06a9\u0627\u0648\u0679 \u06c1\u06d2\u06d4 \u0622\u067e \u0645\u0627\u0636\u06cc \u06a9\u06d2 \u0645\u0634\u0627\u06c1\u062f\u0627\u062a \u0645\u06cc\u06ba \u0645\u0633\u062a\u0642\u0628\u0644 \u06a9\u06d2 \u0688\u06cc\u0679\u0627 \u06a9\u0648 \u0644\u0627\u0626\u06d2 \u0628\u063a\u06cc\u0631 \u0642\u0637\u0627\u0631\u0648\u06ba \u06a9\u0648 \u0634\u0641\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06cc\u0627 \u06a9\u0627\u0644\u0645 \u06a9\u06d2 \u0630\u0631\u0627\u0626\u0639 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06af\u0645\u0634\u062f\u06c1 \u0627\u0642\u062f\u0627\u0631 \u06a9\u0648 \u0646\u06c1\u06cc\u06ba \u0644\u06af\u0627 \u0633\u06a9\u062a\u06d2\u06d4 \u0635\u0641\u0627\u0626\u06cc \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u0641\u06cc\u0635\u0644\u0648\u06ba \u06a9\u0648 \u0648\u0642\u062a\u06cc \u062a\u0631\u062a\u06cc\u0628 \u06a9\u0627 \u0627\u062d\u062a\u0631\u0627\u0645 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u062f\u0648\u0633\u0631\u06cc \u0635\u0648\u0631\u062a \u0645\u06cc\u06ba\u060c \u0627\u0633 \u06a9\u06d2 \u0627\u0648\u067e\u0631 \u0628\u0646\u06cc \u06c1\u0648\u0626\u06cc \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u06cc \u0633\u0627\u0644\u0645\u06cc\u062a \u0679\u0648\u0679 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u06af\u0627\u0626\u06cc\u0688 \u0622\u067e \u06a9\u0648 Python \u0645\u06cc\u06ba \u06a9\u0644\u06cc\u0646 \u0627\u067e \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2\u060c \u062e\u0627\u0645 \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u0622\u0645\u062f \u0633\u06d2 \u0644\u06d2 \u06a9\u0631 \u0641\u06cc\u0686\u0631 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0646\u06af \u06cc\u0627 \u0645\u0627\u0688\u0644\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u0688\u06cc\u0679\u0627 \u0633\u06cc\u0679 \u062a\u06a9 \u0644\u06d2 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u0645\u06cc\u06ba \u06af\u0645\u0634\u062f\u06c1 \u0642\u062f\u0631 \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u0646\u06d2 \u0627\u0648\u0631 \u0627\u0646 \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a\u060c \u0622\u0624\u0679 \u0644\u06cc\u0626\u0631 \u0634\u0646\u0627\u062e\u062a \u0627\u0648\u0631 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af\u060c \u0641\u0627\u0644\u062a\u0648 \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af\u060c \u0641\u0631\u06cc\u06a9\u0648\u0626\u0646\u0633\u06cc \u0686\u06be\u0627\u0646\u0679\u0646\u0627\u060c \u0634\u0648\u0631 \u06a9\u0648 \u06c1\u0645\u0648\u0627\u0631 \u06a9\u0631\u0646\u0627\u060c \u0627\u0648\u0631 \u062a\u0645\u0627\u0645 \u0646\u0645\u0648\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0633\u06cc\u0646\u0633\u0631 \u0688\u06cc\u0679\u0627 \u067e\u0631 \u0644\u0627\u06af\u0648 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u06a9\u0627 \u0627\u062d\u0627\u0637\u06c1 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0622\u067e GitHub \u0633\u06d2 Colab \u0646\u0648\u0679 \u0628\u06a9 \u0688\u0627\u0624\u0646 \u0644\u0648\u0688 \u06a9\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0633\u0627\u062a\u06be \u0686\u0644 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-prerequisites\">\u0634\u0631\u0637\u06cc\u06ba<\/h2>\n<p>\u0627\u0633 \u06af\u0627\u0626\u06cc\u0688 \u067e\u0631 \u0639\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0622\u067e \u06a9\u0648 \u062f\u0631\u062c \u0630\u06cc\u0644 \u062a\u0642\u0627\u0636\u0648\u06ba \u06a9\u0648 \u067e\u0648\u0631\u0627 \u06a9\u0631\u0646\u0627 \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<ul>\n<li>\n<p>Python \u0627\u0648\u0631 Pandas DataFrames \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0622\u0631\u0627\u0645 \u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0679\u0627\u0626\u0645 \u0627\u0646\u0688\u06cc\u06a9\u0633\u0688 \u0688\u06cc\u0679\u0627 \u0633\u06d2 \u0648\u0627\u0642\u0641<\/p>\n<\/li>\n<li>\n<p>\u0627\u0639\u0644\u06cc \u0633\u0637\u062d \u067e\u0631 \u0641\u06cc\u0686\u0631 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0646\u06af \u0627\u0648\u0631 \u0645\u0634\u06cc\u0646 \u0644\u0631\u0646\u0646\u06af \u0645\u0627\u0688\u0644\u0646\u06af \u0645\u06cc\u06ba \u06a9\u06cc\u0627 \u0634\u0627\u0645\u0644 \u06c1\u06d2 \u0627\u0633 \u06a9\u0648 \u067e\u06c1\u0686\u0627\u0646\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u06c1\u0645 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2 <code>pandas<\/code> \u0627\u0648\u0631 <code>numpy<\/code> \u0688\u06cc\u0679\u0627 \u06c1\u06cc\u0631\u0627 \u067e\u06be\u06cc\u0631\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2\u060c <code>scipy<\/code> \u0633\u06af\u0646\u0644 \u06a9\u0648 \u06c1\u0645\u0648\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u0634\u0645\u0627\u0631\u06cc\u0627\u062a\u06cc \u062c\u0627\u0646\u0686 \u06a9\u06d2 \u0644\u06cc\u06d2 <code>scikit-learn<\/code> \u063a\u06cc\u0631 \u0645\u0639\u0645\u0648\u0644\u06cc \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u0626\u06d2 <code>statsmodels<\/code> \u0645\u0648\u0633\u0645\u06cc \u062e\u0631\u0627\u0628\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2\u06d4 \u0627\u0633 \u06af\u0627\u0626\u06cc\u0688 \u0645\u06cc\u06ba \u06a9\u0648\u0688 \u0686\u0644\u0627\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0633\u06d2 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">pip install pandas numpy scipy scikit-learn statsmodels\n<\/code><\/pre>\n<h2 id=\"heading-table-of-contents\">\u0627\u0646\u0688\u06cc\u06a9\u0633<\/h2>\n<h2 id=\"heading-how-to-audit-your-time-series-before-cleaning-it\">\u0627\u0633\u06d2 \u0635\u0627\u0641 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0679\u0627\u0626\u0645 \u0633\u06cc\u0631\u06cc\u0632 \u06a9\u0627 \u0622\u0688\u0679 \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0688\u06cc\u0679\u0627 \u06a9\u06cc \u0635\u0641\u0627\u0626\u06cc \u06a9\u0627 \u067e\u06c1\u0644\u0627 \u0627\u0635\u0648\u0644 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u06a9\u0648 \u06a9\u0627\u0679\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u062f\u06cc\u06a9\u06be\u06cc\u06ba\u06d4 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0686\u06cc\u0632 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2\u060c \u06c1\u0645\u0648\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u06cc\u0627 \u062d\u0630\u0641 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0622\u067e \u06a9\u0648 \u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u0645\u06a9\u0645\u0644 \u062a\u0635\u0648\u06cc\u0631 \u062f\u0631\u06a9\u0627\u0631 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u06cc\u0627 \u063a\u0644\u0637 \u06c1\u06d2 \u0627\u0648\u0631 \u0645\u0633\u0626\u0644\u06c1 \u06a9\u06c1\u0627\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0627\u0686\u06be\u0627 \u0634\u06a9\u0631\u06cc\u06c1 \u0622\u067e \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u06d2:<\/p>\n<ul>\n<li>\n<p>\u0679\u0627\u0626\u0645 \u0627\u0646\u0688\u06cc\u06a9\u0633: \u06a9\u06cc\u0627 \u06cc\u06c1 \u0628\u0627\u0642\u0627\u0639\u062f\u06c1 \u06c1\u06d2\u061f \u06a9\u06cc\u0627 \u06a9\u0648\u0626\u06cc \u062e\u0627\u0644\u06cc \u062c\u06af\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u061f<\/p>\n<\/li>\n<li>\n<p>\u06af\u0645\u0634\u062f\u06c1 \u0627\u0642\u062f\u0627\u0631 \u06a9\u06cc \u062a\u0642\u0633\u06cc\u0645: \u06a9\u06cc\u0627 \u06af\u0645\u0634\u062f\u06c1 \u0627\u0642\u062f\u0627\u0631 \u0628\u06d2 \u062a\u0631\u062a\u06cc\u0628 \u06c1\u06cc\u06ba \u06cc\u0627 \u06a9\u0644\u0633\u0679\u0631\u0688\u061f<\/p>\n<\/li>\n<li>\n<p>\u0642\u062f\u0631 \u06a9\u06cc \u062d\u062f: \u06a9\u06cc\u0627 \u06a9\u0648\u0626\u06cc \u0642\u0627\u0628\u0644 \u062a\u0648\u062c\u06c1 \u062e\u0644\u0627 \u06cc\u0627 \u0633\u06cc\u0646\u0633\u0631 \u06a9\u06cc \u062e\u0631\u0627\u0628\u06cc\u0627\u06ba \u06c1\u06cc\u06ba\u061f<\/p>\n<\/li>\n<li>\n<p>\u0688\u067e\u0644\u06cc\u06a9\u06cc\u0679 \u0679\u0627\u0626\u0645 \u0627\u0633\u0679\u06cc\u0645\u067e\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0622\u0626\u06cc\u06d2 \u0627\u06cc\u06a9 \u0646\u0645\u0648\u0646\u06c1 \u0688\u06cc\u0679\u0627\u0633\u06cc\u0679 \u0686\u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0633 \u0645\u06cc\u06ba \u0645\u0646\u062f\u0631\u062c\u06c1 \u0628\u0627\u0644\u0627 \u0645\u0633\u0627\u0626\u0644 \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0686\u06be \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\"># Simulate one week of smart grid voltage readings (hourly)\n# with realistic problems injected\nperiods = 168\nindex = pd.date_range(\"2024-06-01\", periods=periods, freq=\"H\")\n\nvoltage = (\n    230.0\n    + 3.5 * np.sin(2 * np.pi * np.arange(periods) \/ 24)\n    + np.random.normal(0, 1.2, periods)\n)\n\n# Inject problems\nvoltage[14:17] = np.nan          # sensor dropout: 3 consecutive missing\nvoltage[42] = np.nan             # isolated missing\nvoltage[78] = 312.4              # spike outlier\nvoltage[101:104] = np.nan        # another dropout\nvoltage[130] = 187.2             # dip outlier\n\nseries = pd.Series(voltage, index=index, name=\"voltage_v\")\n\n# --- Audit ---\nprint(\"=== TIME SERIES AUDIT ===\")\nprint(f\"Period:        {series.index.min()} \u2192 {series.index.max()}\")\nprint(f\"Observations:  {len(series)}\")\nprint(f\"Expected freq: {pd.infer_freq(series.index)}\")\nprint(f\"\\nMissing values: {series.isna().sum()} ({series.isna().mean()*100:.1f}%)\")\nprint(f\"Value range:    [{series.min():.2f}, {series.max():.2f}]\")\nprint(f\"Mean \u00b1 Std:     {series.mean():.2f} \u00b1 {series.std():.2f}\")\n\n# Identify consecutive missing runs\nmissing_mask = series.isna()\nmissing_runs = []\nrun_start = None\nfor i, (ts, is_missing) in enumerate(missing_mask.items()):\n    if is_missing and run_start is None:\n        run_start = ts\n    elif not is_missing and run_start is not None:\n        missing_runs.append((run_start, missing_mask.index[i - 1]))\n        run_start = None\n\nprint(f\"\\nMissing runs ({len(missing_runs)} total):\")\nfor start, end in missing_runs:\n    print(f\"  {start} \u2192 {end}\")\n<\/code><\/pre>\n<p><strong>\u062d\u0633\u0627\u0628 \u06a9\u062a\u0627\u0628:<\/strong><\/p>\n<pre><code class=\"language-plaintext\">=== TIME SERIES AUDIT ===\nPeriod:        2024-06-01 00:00:00 \u2192 2024-06-07 23:00:00\nObservations:  168\nExpected freq: h\n\nMissing values: 7 (4.2%)\nValue range:    [187.20, 312.40]\nMean \u00b1 Std:     230.22 \u00b1 7.81\n\nMissing runs (3 total):\n  2024-06-01 14:00:00 \u2192 2024-06-01 16:00:00\n  2024-06-02 18:00:00 \u2192 2024-06-02 18:00:00\n  2024-06-05 05:00:00 \u2192 2024-06-05 07:00:00\n<\/code><\/pre>\n<p>\u0635\u0641\u0627\u0626\u06cc \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06cc\u06c1 \u0622\u0688\u0679 \u0622\u067e \u06a9\u0648 \u0646\u0642\u0635\u0627\u0646 \u06a9\u0627 \u0646\u0642\u0634\u06c1 \u062f\u06d2 \u06af\u0627\u06d4 \u0627\u06c1\u0645 \u06a9\u0627\u0645 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0641\u0631\u0642 \u06a9\u0631\u0646\u0627 \u06c1\u06d2: <strong>\u0627\u0644\u06af \u062a\u06be\u0644\u06af \u063a\u0627\u0626\u0628 \u0642\u062f\u0631<\/strong>\u06cc\u06c1 \u0645\u0642\u0627\u0645\u06cc \u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642 \u0633\u06d2 \u0645\u0646\u0633\u0648\u0628 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u061b <strong>\u0644\u0645\u0628\u06cc \u062f\u0648\u0631\u06cc \u06a9\u06cc \u062f\u0648\u0691\u06cc\u06ba \u063a\u0627\u0626\u0628 \u06c1\u06cc\u06ba\u06d4<\/strong>\u0627\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0646\u06cc\u0686\u06d2 \u062f\u06be\u0627\u0631\u06d2 \u06a9\u06d2 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062e\u062a\u0644\u0641 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc\u0648\u06ba \u06cc\u0627 \u062c\u06be\u0646\u0688\u0648\u06ba \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u067e\u0691 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-how-to-reindex-to-a-canonical-frequency\">\u0645\u0639\u06cc\u0627\u0631\u06cc \u0641\u0631\u06cc\u06a9\u0648\u0626\u0646\u0633\u06cc \u067e\u0631 \u0631\u06cc \u0627\u0646\u0688\u06cc\u06a9\u0633 \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0644\u0627\u067e\u062a\u06c1 \u0627\u0642\u062f\u0627\u0631 \u06a9\u0648 \u0634\u0645\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0679\u0627\u0626\u0645 \u0627\u0646\u0688\u06cc\u06a9\u0633 \u0627\u0635\u0644 \u0645\u06cc\u06ba \u06c1\u06d2 <em>\u0628\u0627\u0642\u0627\u0639\u062f\u06c1<\/em>. \u062c\u0645\u0639 \u0634\u062f\u06c1 \u0679\u0627\u0626\u0645 \u0633\u06cc\u0631\u06cc\u0632 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u0639\u0627\u0645 \u0645\u0633\u0626\u0644\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06af\u0645\u0634\u062f\u06c1 \u0679\u0627\u0626\u0645 \u0627\u0633\u0679\u06cc\u0645\u067e \u0627\u0633 \u0637\u0631\u062d \u062f\u06a9\u06be\u0627\u0626\u06d2 \u062c\u0627\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0635\u0631\u0641 \u063a\u0627\u0626\u0628 \u06c1\u06cc\u06ba: <code>NaN<\/code> \u0642\u0637\u0627\u0631 &#8211; \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2: <code>.fillna()<\/code> \u0627\u06af\u0631 \u0622\u067e \u0641\u0648\u0646 \u06a9\u0631\u06cc\u06ba \u06af\u06d2 \u062a\u0648 \u0622\u067e \u06a9\u0648 \u06a9\u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u0645\u0644\u06d2 \u06af\u0627\u06d4<\/p>\n<pre><code class=\"language-python\"># Simulate a sensor feed with missing timestamps (not just missing values)\nirregular_index = index.delete([14, 15, 16, 42, 101, 102, 103])\nirregular_series = series.dropna().reindex(irregular_index)\n\nprint(f\"Original length:   {len(series)}\")\nprint(f\"Irregular length:  {len(irregular_series)}\")\nprint(f\"Inferred freq:     {pd.infer_freq(irregular_series.index)}\")  # None = irregular\n\n# Reindex to the full canonical hourly grid\ncanonical_index = pd.date_range(\n    start=irregular_series.index.min(),\n    end=irregular_series.index.max(),\n    freq=\"H\"\n)\n\nreindexed = irregular_series.reindex(canonical_index)\n\nprint(f\"\\nAfter reindex:\")\nprint(f\"Length:         {len(reindexed)}\")\nprint(f\"Missing values: {reindexed.isna().sum()}\")\nprint(f\"Inferred freq:  {pd.infer_freq(reindexed.index)}\")\n<\/code><\/pre>\n<p><strong>\u062d\u0633\u0627\u0628 \u06a9\u062a\u0627\u0628:<\/strong><\/p>\n<pre><code class=\"language-plaintext\">Original length:   168\nIrregular length:  161\nInferred freq:     None\n\nAfter reindex:\nLength:         168\nMissing values: 7\nInferred freq:  h\n<\/code><\/pre>\n<p><code>pd.infer_freq<\/code>    \u0648\u0627\u067e\u0633 \u0622 \u0631\u06c1\u0627 \u06c1\u06d2 <code>None<\/code> \u06cc\u06c1 \u0627\u06cc\u06a9 \u0627\u0634\u0627\u0631\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0627\u06cc\u06a9\u0633\u067e\u0648\u0646\u0646\u0679 \u0645\u06cc\u06ba \u062e\u0644\u0627 \u06c1\u06d2\u06d4 \u0645\u0639\u06cc\u0627\u0631\u06cc \u06af\u0631\u0688 \u0645\u06cc\u06ba \u062f\u0648\u0628\u0627\u0631\u06c1 \u0627\u0646\u0688\u06cc\u06a9\u0633 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u063a\u0627\u0626\u0628 \u0679\u0627\u0626\u0645 \u0633\u0679\u06cc\u0645\u067e \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>NaN<\/code> \u0627\u0628 \u06c1\u0645 \u0627\u0633\u06d2 \u0645\u062a\u0628\u0627\u062f\u0644 \u0645\u0646\u0637\u0642 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u062a\u0644\u0627\u0634 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-how-to-handle-missing-values\">\u06af\u0645\u0634\u062f\u06c1 \u0627\u0642\u062f\u0627\u0631 \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u062a\u0645\u0627\u0645 \u06af\u0645\u0634\u062f\u06c1 \u0627\u0642\u062f\u0627\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u0627 \u0633\u0644\u0648\u06a9 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u06c1\u0645\u0648\u0627\u0631 \u0633\u06af\u0646\u0644\u0632 \u0645\u06cc\u06ba\u060c \u0648\u0627\u062d\u062f \u0627\u0644\u06af \u062a\u06be\u0644\u06af \u06af\u0645\u0634\u062f\u06c1 \u0631\u06cc\u0688\u0646\u06af \u06a9\u0648 \u0627\u0646\u0679\u0631\u067e\u0648\u0644\u06cc\u0634\u0646 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0628\u06be\u0631\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u0627\u06c1\u0645\u060c \u0627\u062a\u0627\u0631 \u0686\u0691\u06be\u0627\u0624 \u0648\u0627\u0644\u06d2 \u0633\u06af\u0646\u0644 \u06a9\u0627 3 \u06af\u06be\u0646\u0679\u06d2 \u06a9\u0627 \u0633\u06cc\u0646\u0633\u0631 \u0688\u0631\u0627\u067e \u0622\u0624\u0679 \u06c1\u06cc\u0631\u0627 \u067e\u06be\u06cc\u0631\u06cc \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062f\u06a9\u06be\u0627\u0626\u06cc \u062f\u06d2 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u06a9\u0648 \u0648\u0642\u0641\u06c1 \u06a9\u06cc \u0644\u0645\u0628\u0627\u0626\u06cc \u0627\u0648\u0631 \u0633\u06af\u0646\u0644 \u06a9\u06d2 \u0631\u0648\u06cc\u06d2 \u062f\u0648\u0646\u0648\u06ba \u0633\u06d2 \u0645\u0645\u0627\u062b\u0644 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<h3 id=\"heading-forward-fill-for-step-function-signals\">\u0641\u0627\u0631\u0648\u0631\u0688 \u0641\u0644 &#8211; \u0633\u0679\u06cc\u067e \u0641\u0646\u06a9\u0634\u0646 \u0633\u06af\u0646\u0644\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2<\/h3>\n<p>\u0641\u0627\u0631\u0648\u0631\u0688 \u0627\u0633\u0679\u0641\u0646\u06af \u0627\u0633 \u0648\u0642\u062a \u0645\u0646\u0627\u0633\u0628 \u06c1\u06d2 \u062c\u0628 \u06a9\u0648\u0626\u06cc \u0645\u062a\u063a\u06cc\u0631 \u0627\u067e\u0646\u06cc \u0622\u062e\u0631\u06cc \u0645\u0639\u0644\u0648\u0645 \u0642\u062f\u0631 \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 \u06cc\u06c1 \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1 \u06c1\u0648\u062c\u0627\u0626\u06d2\u060c \u062c\u06cc\u0633\u06d2 \u0645\u0634\u06cc\u0646 \u06a9\u06cc \u062d\u0627\u0644\u062a\u060c \u0633\u06cc\u0679 \u067e\u0648\u0627\u0626\u0646\u0679\u060c \u06cc\u0627 \u0648\u0627\u0636\u062d \u067e\u0631\u0686\u0645\u06d4<\/p>\n<pre><code class=\"language-python\"># Equipment operating mode \u2014 a step signal\nmode_data = pd.Series(\n    [\"running\", \"running\", np.nan, np.nan, \"idle\", \"idle\", np.nan, \"running\"],\n    index=pd.date_range(\"2024-06-01\", periods=8, freq=\"H\"),\n    name=\"operating_mode\"\n)\n\nfilled_mode = mode_data.ffill()\nprint(pd.DataFrame({\"original\": mode_data, \"ffill\": filled_mode}))\n<\/code><\/pre>\n<p><strong>\u062d\u0633\u0627\u0628 \u06a9\u062a\u0627\u0628:<\/strong><\/p>\n<pre><code class=\"language-plaintext\">                    original    ffill\n2024-06-01 00:00:00  running  running\n2024-06-01 01:00:00  running  running\n2024-06-01 02:00:00      NaN  running\n2024-06-01 03:00:00      NaN  running\n2024-06-01 04:00:00     idle     idle\n2024-06-01 05:00:00     idle     idle\n2024-06-01 06:00:00      NaN     idle\n2024-06-01 07:00:00  running  running\n<\/code><\/pre>\n<h3 id=\"heading-time-weighted-interpolation-for-continuous-signals\">\u0648\u0642\u062a \u06a9\u0627 \u0648\u0632\u0646 \u0648\u0627\u0644\u0627 \u0627\u0646\u0679\u0631\u067e\u0648\u0644\u06cc\u0634\u0646 \u2013 \u0645\u0633\u0644\u0633\u0644 \u0633\u06af\u0646\u0644\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2<\/h3>\n<p>\u0645\u0633\u0644\u0633\u0644 \u0633\u06cc\u0646\u0633\u0631 \u0631\u06cc\u0688\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0679\u0627\u0626\u0645 \u0648\u06cc\u0679\u0688 \u0644\u06a9\u06cc\u0631\u06cc \u0627\u0646\u0679\u0631\u067e\u0648\u0644\u06cc\u0634\u0646 \u0641\u0627\u0633\u062f \u0641\u0627\u0635\u0644\u06c1 \u06a9\u0648 \u062f\u0631\u0633\u062a \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u06cc\u06c1 \u0646\u06c1\u06cc\u06ba \u0645\u0627\u0646\u062a\u0627 \u06a9\u06c1 \u0648\u0642\u0641\u06c1 \u0628\u0631\u0627\u0628\u0631 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\"># Fill the voltage series using time-based interpolation\nvoltage_clean = reindexed.interpolate(method=\"time\")\n\n# Compare original vs filled around the first gap\ngap_window = voltage_clean[\"2024-06-01 12:00\":\"2024-06-01 18:00\"]\noriginal_window = reindexed[\"2024-06-01 12:00\":\"2024-06-01 18:00\"]\n\ncomparison = pd.DataFrame({\n    \"original\":     original_window,\n    \"interpolated\": gap_window.round(3),\n    \"was_missing\":  original_window.isna(),\n})\nprint(comparison)\n<\/code><\/pre>\n<p><strong>\u062d\u0633\u0627\u0628 \u06a9\u062a\u0627\u0628:<\/strong><\/p>\n<pre><code class=\"language-plaintext\">                       original  interpolated  was_missing\n2024-06-01 12:00:00  230.290355       230.290        False\n2024-06-01 13:00:00  226.798197       226.798        False\n2024-06-01 14:00:00         NaN       226.848         True\n2024-06-01 15:00:00         NaN       226.897         True\n2024-06-01 16:00:00         NaN       226.947         True\n2024-06-01 17:00:00  226.996356       226.996        False\n2024-06-01 18:00:00  225.410371       225.410        False\n<\/code><\/pre>\n<h3 id=\"heading-seasonal-decomposition-imputation-for-long-gaps\">\u0645\u0648\u0633\u0645\u06cc \u0633\u0691\u0646 \u06a9\u0627 \u0627\u0644\u0632\u0627\u0645 &#8211; \u0637\u0648\u06cc\u0644 \u0648\u0642\u0641\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2<\/h3>\n<p>\u0645\u0648\u0633\u0645\u06cc \u0633\u06af\u0646\u0644 \u0645\u06cc\u06ba \u0686\u0646\u062f \u0642\u062f\u0645\u0648\u06ba \u0633\u06d2 \u0644\u0645\u0628\u06d2 \u0648\u0642\u0641\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0648\u0642\u0641\u06c1 \u06a9\u0648 \u0627\u0646\u0679\u0631\u067e\u0648\u0644 \u06a9\u0631\u0646\u0627 \u0645\u0648\u0633\u0645\u06cc \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u0646\u0638\u0631 \u0627\u0646\u062f\u0627\u0632 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0628\u06c1\u062a\u0631 \u0637\u0631\u06cc\u0642\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0633\u06cc\u0631\u06cc\u0632 \u06a9\u0648 \u06af\u0644\u0627 \u062c\u0627\u0626\u06d2\u060c \u06c1\u0631 \u062c\u0632\u0648 \u06a9\u0648 \u0627\u0646\u0641\u0631\u0627\u062f\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0644\u06af\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2\u060c \u0627\u0648\u0631 \u067e\u06be\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0634\u06a9\u06cc\u0644 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">from statsmodels.tsa.seasonal import seasonal_decompose\n\n# Use a longer series for decomposition (needs enough periods)\nlong_voltage = pd.Series(\n    230.0\n    + 3.5 * np.sin(2 * np.pi * np.arange(336) \/ 24)\n    + np.random.normal(0, 1.0, 336),\n    index=pd.date_range(\"2024-06-01\", periods=336, freq=\"H\")\n)\n\n# Inject a 6-hour gap\nlong_voltage.iloc[100:106] = np.nan\n\n# Interpolate first to give decompose a complete series to work with\ntemp_filled = long_voltage.interpolate(method=\"time\")\ndecomp = seasonal_decompose(temp_filled, model=\"additive\", period=24)\n\n# Reconstruct: trend + seasonal + zero residual for missing positions\nreconstructed = long_voltage.copy()\nmissing_idx = long_voltage[long_voltage.isna()].index\nreconstructed[missing_idx] = (\n    decomp.trend[missing_idx].fillna(method=\"ffill\")\n    + decomp.seasonal[missing_idx]\n)\n\nprint(f\"Missing before: {long_voltage.isna().sum()}\")\nprint(f\"Missing after:  {reconstructed.isna().sum()}\")\nprint(\"\\nFilled values at gap:\")\nprint(reconstructed[missing_idx].round(3))\n<\/code><\/pre>\n<p><strong>\u062d\u0633\u0627\u0628 \u06a9\u062a\u0627\u0628:<\/strong><\/p>\n<pre><code class=\"language-plaintext\">\n                       original  interpolated  was_missing\n2024-06-01 12:00:00  230.290355       230.290        False\n2024-06-01 13:00:00  226.798197       226.798        False\n2024-06-01 14:00:00         NaN       226.848         True\n2024-06-01 15:00:00         NaN       226.897         True\n2024-06-01 16:00:00         NaN       226.947         True\n2024-06-01 17:00:00  226.996356       226.996        False\n2024-06-01 18:00:00  225.410371       225.410        False\n<\/code><\/pre>\n<p>\u0645\u0648\u0633\u0645\u06cc \u0633\u0691\u0646 \u06a9\u0627 \u0645\u062a\u0628\u0627\u062f\u0644 \u062f\u0646 \u06a9\u06d2 \u0648\u0642\u062a \u06a9\u06d2 \u067e\u06cc\u0679\u0631\u0646 \u06a9\u06cc \u067e\u06cc\u0631\u0648\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u06cc\u0633\u0627 \u06a9\u06c1 \u0622\u067e \u062f\u06cc\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0628\u06be\u0631\u06cc \u06c1\u0648\u0626\u06cc \u0642\u062f\u0631\u06cc\u06ba \u0648\u0642\u0641\u06c1 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0627\u06cc\u06a9 \u0641\u0644\u06cc\u0679 \u0644\u0627\u0626\u0646 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0645\u062a\u0648\u0642\u0639 \u06cc\u0648\u0645\u06cc\u06c1 \u0645\u0646\u062d\u0646\u06cc \u062e\u0637\u0648\u0637 \u06a9\u06cc \u067e\u06cc\u0631\u0648\u06cc \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-how-to-detect-and-handle-outliers\">\u0628\u0627\u06c1\u0631 \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u0648\u06ba \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u0646\u06d2 \u0627\u0648\u0631 \u0627\u0646 \u0633\u06d2 \u0646\u0645\u0679\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1<\/h2>\n<p>\u0679\u0627\u0626\u0645 \u0633\u06cc\u0631\u06cc\u0632 \u0645\u06cc\u06ba \u0622\u0624\u0679 \u0644\u06cc\u0631\u0632 \u0679\u06cc\u0628\u0644\u0631 \u0688\u06cc\u0679\u0627 \u06a9\u06cc \u0646\u0633\u0628\u062a \u0632\u06cc\u0627\u062f\u06c1 \u0686\u06cc\u0644\u0646\u062c\u0646\u06af \u06c1\u06cc\u06ba \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642 \u0627\u06c1\u0645 \u06c1\u06d2\u06d4 \u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c \u063a\u06cc\u0631 \u0645\u0639\u0645\u0648\u0644\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0632\u06cc\u0627\u062f\u06c1 \u06cc\u0627 \u06a9\u0645 \u0648\u0648\u0644\u0679\u06cc\u062c \u0633\u06cc\u0646\u0633\u0631 \u0627\u0633\u067e\u0627\u0626\u06a9\u0633 \u06cc\u0627 \u062d\u0642\u06cc\u0642\u06cc \u06af\u0631\u0688 \u0648\u0627\u0642\u0639\u0627\u062a \u06c1\u0648 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0645\u062c\u06be\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0627\u06cc\u06a9 \u0637\u0631\u06cc\u0642\u06c1 \u062f\u0631\u06a9\u0627\u0631 \u06c1\u06d2: <em>\u0648\u0642\u062a\u06cc \u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642<\/em>\u06cc\u06c1 \u0635\u0631\u0641 \u0639\u0627\u0644\u0645\u06cc \u0627\u0639\u062f\u0627\u062f \u0648 \u0634\u0645\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-z-score-with-rolling-window\">\u0631\u0648\u0644\u0646\u06af \u0648\u0646\u0688\u0648 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0632\u06cc\u0688 \u0633\u06a9\u0648\u0631<\/h3>\n<p>\u0639\u0627\u0644\u0645\u06cc Z-\u0627\u0633\u06a9\u0648\u0631 \u0628\u06d2 \u0636\u0627\u0628\u0637\u06af\u06cc\u0648\u06ba \u06a9\u06cc \u0633\u06cc\u0631\u06cc\u0632 \u0645\u06cc\u06ba \u0645\u0642\u0627\u0645\u06cc \u0628\u06d2 \u0636\u0627\u0628\u0637\u06af\u06cc\u0648\u06ba \u06a9\u0648 \u06cc\u0627\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0631\u0648\u0644\u0646\u06af \u0632\u06cc\u0688 \u0627\u0633\u06a9\u0648\u0631\u0632 \u063a\u06cc\u0631 \u0645\u0639\u0645\u0648\u0644\u06cc \u0627\u0642\u062f\u0627\u0631 \u06a9\u0648 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <em>\u0627\u067e\u0646\u06d2 \u0645\u0642\u0627\u0645\u06cc \u067e\u0691\u0648\u0633\u06cc\u0648\u06ba \u06a9\u06d2 \u0645\u0642\u0627\u0628\u0644\u06d2 \u0645\u06cc\u06ba<\/em>.<\/p>\n<p><strong>\u0645\u06cc\u0645\u0648<\/strong>: \u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba\u06d4 <strong>\u0646\u0627\u0646 \u0633\u0679\u06cc\u0634\u0646\u0631\u06cc \u0633\u06cc\u0631\u06cc\u0632<\/strong> \u0627\u06cc\u06a9 \u0648\u0642\u062a\u06cc \u0633\u0644\u0633\u0644\u06c1 \u062c\u0633 \u0645\u06cc\u06ba \u0634\u0645\u0627\u0631\u06cc\u0627\u062a\u06cc \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u062c\u06cc\u0633\u06d2 \u06a9\u06c1 \u0648\u0633\u0637\u060c \u062a\u063a\u06cc\u0631\u060c \u0627\u0648\u0631 \u0631\u062c\u062d\u0627\u0646 \u0645\u0633\u062a\u0642\u0644 \u0646\u06c1\u06cc\u06ba \u0631\u06c1\u062a\u06d2 \u0628\u0644\u06a9\u06c1 \u0648\u0642\u062a \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0628\u062f\u0644\u062a\u06d2 \u0631\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">window = 24  # 24-hour rolling window\n\nroll_mean = voltage_clean.rolling(window, center=True, min_periods=1).mean()\nroll_std  = voltage_clean.rolling(window, center=True, min_periods=1).std()\n\nrolling_z = (voltage_clean - roll_mean) \/ roll_std\n\nthreshold = 3.0\noutliers_z = rolling_z[rolling_z.abs() > threshold]\n\nprint(f\"Rolling Z-score outliers detected: {len(outliers_z)}\")\nprint(outliers_z.round(3))\n<\/code><\/pre>\n<p><strong>\u062d\u0633\u0627\u0628 \u06a9\u062a\u0627\u0628:<\/strong><\/p>\n<pre><code class=\"language-plaintext\">Rolling Z-score outliers detected: 2\n2024-06-04 06:00:00    4.646\n2024-06-06 10:00:00   -4.484\nName: voltage_v, dtype: float64\n<\/code><\/pre>\n<p>Z-score outlier \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u0646\u0627 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b Gaussian (\u0639\u0627\u0645) \u062a\u0642\u0633\u06cc\u0645\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u0645\u0648\u0632\u0648\u06ba \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u0641\u0631\u0636 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0688\u06cc\u0679\u0627 \u0645\u0639\u06cc\u0627\u0631\u06cc \u0627\u0646\u062d\u0631\u0627\u0641 \u0633\u06d2 \u0645\u0627\u067e\u0627 \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06c1\u0645 \u0622\u06c1\u0646\u06af\u06cc \u067e\u06be\u06cc\u0644\u0627\u0624 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0648\u0633\u0637 \u06a9\u06d2 \u06af\u0631\u062f \u0645\u0631\u06a9\u0648\u0632 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-iqr-based-outlier-detection\">IQR \u067e\u0631 \u0645\u0628\u0646\u06cc \u0622\u0624\u0679 \u0644\u06cc\u0626\u0631 \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u0646\u0627<\/h3>\n<p>\u0627\u0646\u0679\u0631\u06a9\u0648\u0627\u0631\u0679\u0627\u0626\u0644 \u0631\u06cc\u0646\u062c (IQR) \u0637\u0631\u06cc\u0642\u06c1 \u063a\u06cc\u0631 \u06af\u0627\u0648\u0633\u06cc \u062a\u0642\u0633\u06cc\u0645\u0648\u06ba \u0645\u06cc\u06ba \u0622\u0624\u0679 \u0644\u06cc\u0631\u0632 \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0637\u0627\u0642\u062a\u0648\u0631 \u06c1\u06d2\u06d4 \u0627\u0646\u0679\u0631\u06a9\u0648\u0627\u0631\u0679\u0627\u0626\u0644 \u0631\u06cc\u0646\u062c (IQR) \u062a\u06cc\u0633\u0631\u06d2 \u0686\u0648\u062a\u06be\u0627\u0626\u06cc (Q3) \u0627\u0648\u0631 \u067e\u06c1\u0644\u06d2 \u06a9\u0648\u0627\u0631\u0679\u0627\u0626\u0644 (Q1) \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0641\u0631\u0642 \u06c1\u06d2\u060c \u062c\u0648 \u0688\u06cc\u0679\u0627 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646\u06cc 50% \u06a9\u06cc \u062a\u0642\u0633\u06cc\u0645 \u06a9\u06cc \u0646\u0645\u0627\u0626\u0646\u062f\u06af\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">Q1 = voltage_clean.quantile(0.25)\nQ3 = voltage_clean.quantile(0.75)\nIQR = Q3 - Q1\n\nlower_bound = Q1 - 1.5 * IQR\nupper_bound = Q3 + 1.5 * IQR\n\noutliers_iqr = voltage_clean[\n    (voltage_clean < lower_bound) | (voltage_clean > upper_bound)\n]\n\nprint(f\"IQR bounds: [{lower_bound:.2f}, {upper_bound:.2f}]\")\nprint(f\"Outliers detected: {len(outliers_iqr)}\")\nprint(outliers_iqr.round(2))\n<\/code><\/pre>\n<p><strong>\u062d\u0633\u0627\u0628 \u06a9\u062a\u0627\u0628:<\/strong><\/p>\n<pre><code class=\"language-plaintext\">IQR bounds: [220.16, 239.46]\nOutliers detected: 2\n2024-06-04 06:00:00    312.4\n2024-06-06 10:00:00    187.2\nName: voltage_v, dtype: float64\n<\/code><\/pre>\n<h3 id=\"heading-isolation-forest-for-multivariate-outlier-detection\">\u0622\u0626\u0633\u0648\u0644\u06cc\u0634\u0646 \u0641\u0627\u0631\u06cc\u0633\u0679 &#8211; \u0645\u0644\u0679\u06cc \u0648\u06cc\u0631\u06cc\u0679 \u0622\u0624\u0679 \u0644\u06cc\u0626\u0631 \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2<\/h3>\n<p>\u0627\u06cc\u06a9 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0633\u06cc\u0646\u0633\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be\u060c \u0627\u06a9\u06cc\u0644\u06d2 \u0627\u06cc\u06a9 \u0686\u06cc\u0646\u0644 \u06a9\u06cc \u0631\u06cc\u0688\u0646\u06af \u0639\u0627\u0645 \u062f\u06a9\u06be\u0627\u0626\u06cc \u062f\u06d2 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u062c\u0628 \u062f\u0648\u0633\u0631\u06d2 \u0686\u06cc\u0646\u0644\u0632 \u06a9\u06cc \u0631\u06cc\u0688\u0646\u06af\u0632 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u0644\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u062a\u0648 \u0628\u06d2 \u0636\u0627\u0628\u0637\u06af\u06cc\u0627\u06ba \u0633\u0627\u0645\u0646\u06d2 \u0622\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u062a\u0646\u06c1\u0627\u0626\u06cc \u06a9\u0627 \u062c\u0646\u06af\u0644 \u0642\u062f\u0631\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633 \u06a9\u0648 \u0633\u0646\u0628\u06be\u0627\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\"># Build a multi-sensor DataFrame\nnp.random.seed(42)\nn = 200\n\nsensor_df = pd.DataFrame({\n    \"voltage_v\":    230 + 3 * np.sin(2 * np.pi * np.arange(n) \/ 24) + np.random.normal(0, 1, n),\n    \"current_a\":    15  + 0.8 * np.sin(2 * np.pi * np.arange(n) \/ 24) + np.random.normal(0, 0.3, n),\n    \"frequency_hz\": 50  + np.random.normal(0, 0.05, n),\n}, index=pd.date_range(\"2024-06-01\", periods=n, freq=\"H\"))\n\n# Inject a multivariate anomaly \u2014 voltage drops, current spikes together\nsensor_df.iloc[88, 0] = 194.2   # voltage dip\nsensor_df.iloc[88, 1] = 28.7    # current surge (consistent with fault)\n\nclf = IsolationForest(contamination=0.02, random_state=42)\nsensor_df[\"anomaly_score\"] = clf.fit_predict(sensor_df[[\"voltage_v\", \"current_a\", \"frequency_hz\"]])\n\nanomalies = sensor_df[sensor_df[\"anomaly_score\"] == -1]\nprint(f\"Anomalies detected: {len(anomalies)}\")\nprint(anomalies[[\"voltage_v\", \"current_a\", \"frequency_hz\"]].round(2))\n<\/code><\/pre>\n<p><strong>\u062d\u0633\u0627\u0628 \u06a9\u062a\u0627\u0628:<\/strong><\/p>\n<pre><code class=\"language-plaintext\">Anomalies detected: 4\n                     voltage_v  current_a  frequency_hz\n2024-06-02 07:00:00     234.75      15.84         49.90\n2024-06-04 06:00:00     233.09      15.82         50.15\n2024-06-04 16:00:00     194.20      28.70         50.08\n2024-06-06 05:00:00     235.09      15.41         49.91\n<\/code><\/pre>\n<p>\u0639\u0645\u0644\u06cc \u0637\u0648\u0631 \u067e\u0631\u060c \u0688\u0648\u0645\u06cc\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062e\u0635\u0648\u0635 \u062d\u062f \u06a9\u06d2 \u0627\u0635\u0648\u0644 \u0622\u0624\u0679 \u0644\u0626\u06cc\u0631 \u0633\u06a9\u0648\u0631 \u06a9\u0648 \u0679\u0631\u06cc\u06a9 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-outlier-treatment\">\u0622\u0624\u0679 \u0644\u06cc\u0626\u0631 \u06c1\u06cc\u0646\u0688\u0644\u0646\u06af<\/h3>\n<p>\u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0628\u0627\u06c1\u0631 \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u0648\u06ba \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a \u06c1\u0648 \u062c\u0627\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0627\u0646 \u0633\u06d2 \u06a9\u0626\u06cc \u0637\u0631\u06cc\u0642\u0648\u06ba \u0633\u06d2 \u0646\u0645\u0679\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2:<\/p>\n<ul>\n<li>\n<p>\u06c1\u0645 \u0627\u0646\u062a\u06c1\u0627\u0626\u06cc \u0627\u0642\u062f\u0627\u0631 \u06a9\u0648 \u0627\u06cc\u06a9 \u062d\u062f \u062a\u06a9 \u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u06a9\u06d2 Winsorization \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u0633 \u067e\u0631 \u067e\u0627\u0628\u0646\u062f\u06cc \u0644\u06af\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u0633\u06d2 \u0627\u0646\u0679\u0631\u067e\u0648\u0644\u06cc\u0679\u0688 \u06cc\u0627 \u062a\u062e\u0645\u06cc\u0646\u06c1 \u0634\u062f\u06c1 \u0642\u062f\u0631 \u0633\u06d2 \u0628\u062f\u0644 \u062f\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0628\u0631\u0627\u06c1 \u06a9\u0631\u0645 \u0627\u0633 \u067e\u0631 \u062c\u06be\u0646\u0688\u0627 \u0644\u06af\u0627\u0626\u06cc\u06ba \u062a\u0627\u06a9\u06c1 \u0645\u0627\u0688\u0644 \u0627\u0633\u06d2 \u0645\u0646\u0627\u0633\u0628 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0633\u0646\u0628\u06be\u0627\u0644 \u0633\u06a9\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"language-python\"># Winsorize: cap at the IQR bounds\nvoltage_winsorized = voltage_clean.clip(lower=lower_bound, upper=upper_bound)\n\n# Replace outliers with time-interpolated values\nvoltage_outlier_fixed = voltage_clean.copy()\nvoltage_outlier_fixed[outliers_iqr.index] = np.nan\nvoltage_outlier_fixed = voltage_outlier_fixed.interpolate(method=\"time\")\n\nprint(\"Outlier treatment comparison:\")\nfor ts in outliers_iqr.index:\n    print(f\"\\n  {ts}\")\n    print(f\"    Original:     {voltage_clean[ts]:.2f}\")\n    print(f\"    Winsorized:   {voltage_winsorized[ts]:.2f}\")\n    print(f\"    Interpolated: {voltage_outlier_fixed[ts]:.2f}\")\n<\/code><\/pre>\n<p><strong>\u062d\u0633\u0627\u0628 \u06a9\u062a\u0627\u0628:<\/strong><\/p>\n<pre><code class=\"language-plaintext\">Outlier treatment comparison:\n\n  2024-06-04 06:00:00\n    Original:     312.40\n    Winsorized:   239.46\n    Interpolated: 232.01\n\n  2024-06-06 10:00:00\n    Original:     187.20\n    Winsorized:   220.16\n    Interpolated: 231.43\n<\/code><\/pre>\n<p>Winsorization \u0646\u0642\u0637\u06c1 \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2 \u0644\u06cc\u06a9\u0646 \u0627\u0633\u06d2 \u0627\u06cc\u06a9 \u0642\u0627\u0628\u0644 \u0639\u0645\u0644 \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u062a\u06a9 \u06a9\u0627\u0679 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0622\u067e \u0627\u0633 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u06a9\u0686\u06be \u063a\u06cc\u0631 \u0645\u0639\u0645\u0648\u0644\u06cc \u06c1\u0648\u0627 \u06c1\u06d2 \u062a\u0648 \u06cc\u06c1 \u0645\u0641\u06cc\u062f \u06c1\u06d2\u06d4 \u0627\u0646\u0679\u0631\u067e\u0648\u0644\u06cc\u0634\u0646 \u0628\u0627\u06c1\u0631 \u0648\u0627\u0644\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u0633\u0627 \u0633\u0644\u0648\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u06cc\u0633\u06d2 \u0648\u06c1 \u063a\u0627\u0626\u0628 \u06c1\u0648\u06ba\u06d4 \u06cc\u06c1 \u0628\u06c1\u062a\u0631 \u06c1\u06d2 \u0627\u06af\u0631 \u0622\u067e \u06a9\u0648 \u0644\u06af\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0631\u06cc\u0688\u0646\u06af \u0635\u0631\u0641 \u063a\u0644\u0637 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-how-to-remove-duplicates\">\u0688\u067e\u0644\u06cc\u06a9\u06cc\u0679\u0633 \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u06c1\u0679\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/h2>\n<p>\u062c\u0628 \u0688\u06cc\u0679\u0627 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646\u0632 \u06a9\u06cc \u0646\u0627\u06a9\u0627\u0645\u06cc \u067e\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2 \u062a\u0648 \u0688\u067e\u0644\u06cc\u06a9\u06cc\u0679 \u0679\u0627\u0626\u0645 \u0627\u0633\u0679\u06cc\u0645\u067e \u0639\u0627\u0645 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0679\u06cc\u0628\u0644\u0631 \u0688\u067e\u0644\u06cc\u06a9\u06cc\u0679\u0633 \u06a9\u06d2 \u0628\u0631\u0639\u06a9\u0633\u060c \u0679\u0627\u0626\u0645 \u0633\u06cc\u0631\u06cc\u0632 \u0688\u067e\u0644\u06cc\u06a9\u06cc\u0679\u0633 \u06c1\u0645\u06cc\u0634\u06c1 \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06d2 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634\u06cc\u06ba \u0627\u06cc\u06a9 \u06c1\u06cc \u0679\u0627\u0626\u0645 \u0627\u0633\u0679\u06cc\u0645\u067e \u06a9\u06d2 \u0644\u06cc\u06d2 \u0642\u062f\u0631\u06d2 \u0645\u062e\u062a\u0644\u0641 \u0631\u06cc\u0688\u0646\u06af \u062f\u06d2 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\"># Inject duplicate timestamps with slightly different values (retry scenario)\ndup_index = index.tolist()\ndup_index.insert(20, index[20])  # exact duplicate timestamp\ndup_index.insert(55, index[55])  # retry duplicate\n\ndup_values = voltage_clean.tolist()\ndup_values.insert(20, voltage_clean.iloc[20])\ndup_values.insert(55, voltage_clean.iloc[55] + 0.7)  # slightly different value\n\ndup_series = pd.Series(dup_values, index=pd.DatetimeIndex(dup_index), name=\"voltage_v\")\n\nprint(f\"Length with duplicates: {len(dup_series)}\")\nprint(f\"Duplicate timestamps:   {dup_series.index.duplicated().sum()}\")\n\n# Strategy 1: keep first (original reading)\ndedup_first = dup_series[~dup_series.index.duplicated(keep=\"first\")]\n\n# Strategy 2: keep mean (average across retries)\ndedup_mean = dup_series.groupby(level=0).mean()\n\nprint(f\"\\nAfter dedup (keep first): {len(dedup_first)}\")\nprint(f\"After dedup (mean):       {len(dedup_mean)}\")\n\n# Show the retry duplicate\nts_retry = index[55]\nprint(f\"\\nRetry duplicate at {ts_retry}:\")\nprint(f\"  Values:      {dup_series[ts_retry].values.round(3)}\")\nprint(f\"  Keep first:  {dedup_first[ts_retry]:.3f}\")\nprint(f\"  Mean:        {dedup_mean[ts_retry]:.3f}\")\n<\/code><\/pre>\n<p><strong>\u062d\u0633\u0627\u0628 \u06a9\u062a\u0627\u0628:<\/strong><\/p>\n<pre><code class=\"language-plaintext\">Length with duplicates: 170\nDuplicate timestamps:   2\n\nAfter dedup (keep first): 168\nAfter dedup (mean):       168\n\nRetry duplicate at 2024-06-03 07:00:00:\n  Values:      [235.198 234.498]\n  Keep first:  235.198\n  Mean:        234.848\n<\/code><\/pre>\n<p>\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0633\u06cc\u0646\u0633\u0631 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u06a9\u06cc\u067e \u0641\u0631\u0633\u0679 \u062f\u0631\u0633\u062a \u0688\u06cc\u0641\u0627\u0644\u0679 \u06c1\u06d2\u06d4 \u067e\u06c1\u0644\u0627 \u067e\u0627\u0633 \u0627\u0635\u0644 \u067e\u0691\u06be\u0627 \u06c1\u0648\u0627 \u06c1\u06d2\u06d4 \u0627\u0648\u0633\u0637 \u0627\u0633 \u0648\u0642\u062a \u0645\u0639\u0646\u06cc \u062e\u06cc\u0632 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0628 \u0627\u06cc\u06a9 \u06c1\u06cc \u0645\u0642\u062f\u0627\u0631 \u06a9\u06cc \u067e\u06cc\u0645\u0627\u0626\u0634 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0622\u0632\u0627\u062f \u0633\u06cc\u0646\u0633\u0631 \u0633\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634\u06cc\u06ba \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-frequency-alignment-and-resampling\">\u0641\u0631\u06cc\u06a9\u0648\u0626\u06cc\u0646\u0633\u06cc \u0633\u06cc\u062f\u06be \u0627\u0648\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0646\u0645\u0648\u0646\u06c1 \u06a9\u0627\u0631\u06cc<\/h2>\n<p>\u062d\u0642\u06cc\u0642\u06cc \u062f\u0646\u06cc\u0627 \u06a9\u06cc \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646\u06cc\u06ba \u0627\u06a9\u062b\u0631 \u0688\u06cc\u0679\u0627 \u06a9\u0648 \u0645\u062e\u062a\u0644\u0641 \u0641\u0631\u06cc\u06a9\u0648\u0626\u0646\u0633\u06cc\u0648\u06ba \u067e\u0631 \u0645\u0644\u0627 \u062f\u06cc\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c \u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06c1 \u06a9\u06d2 \u0645\u0648\u0633\u0645\u06cc \u0641\u06cc\u0688 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u0645\u0646\u0679 \u06a9\u06cc \u0645\u06cc\u0679\u0631 \u0631\u06cc\u0688\u0646\u06af \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4 \u0622\u067e \u06a9\u0648 \u062a\u0639\u062f\u062f \u06a9\u0648 \u06cc\u06a9\u062c\u0627 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\"># 1-minute power draw readings\npower_1min = pd.Series(\n    42 + 18 * ((pd.date_range(\"2024-06-01\", periods=1440, freq=\"T\").hour.isin(range(8, 19)))).astype(int)\n    + np.random.normal(0, 2, 1440),\n    index=pd.date_range(\"2024-06-01\", periods=1440, freq=\"T\"),\n    name=\"power_kw\"\n)\n\n# Downsample to hourly: mean is appropriate for power (average over the hour)\npower_hourly_mean = power_1min.resample(\"H\").mean().round(2)\n\n# Downsample to hourly: max (peak demand within the hour)\npower_hourly_max = power_1min.resample(\"H\").max().round(2)\n\n# Downsample to hourly: sum (total energy = kWh)\nenergy_hourly_kwh = (power_1min.resample(\"H\").sum() \/ 60).round(3)\n\ncomparison = pd.DataFrame({\n    \"mean_kw\":    power_hourly_mean,\n    \"peak_kw\":    power_hourly_max,\n    \"energy_kwh\": energy_hourly_kwh,\n}).iloc[7:13]\n\nprint(comparison)\n<\/code><\/pre>\n<p><strong>\u062d\u0633\u0627\u0628 \u06a9\u062a\u0627\u0628:<\/strong><\/p>\n<pre><code class=\"language-plaintext\">                     mean_kw  peak_kw  energy_kwh\n2024-06-01 07:00:00    42.13    46.28      42.133\n2024-06-01 08:00:00    60.56    64.81      60.557\n2024-06-01 09:00:00    59.91    64.88      59.912\n2024-06-01 10:00:00    60.07    65.16      60.066\n2024-06-01 11:00:00    60.08    64.99      60.083\n2024-06-01 12:00:00    59.72    63.65      59.724\n<\/code><\/pre>\n<p>\u0622\u067e \u062c\u0648 \u0645\u062c\u0645\u0648\u0639\u06c1 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0648\u06c1 \u0628\u06c1\u0627\u0648 \u06a9\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06c1\u062a \u0627\u06c1\u0645 \u06c1\u06d2\u06d4 \u0627\u0648\u0633\u0637 \u0637\u0627\u0642\u062a \u0644\u0648\u0688 \u067e\u0631\u0648\u0641\u0627\u0626\u0644\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0648\u0632\u0648\u06ba \u06c1\u06d2\u06d4 \u0635\u0644\u0627\u062d\u06cc\u062a \u06a9\u06cc \u0645\u0646\u0635\u0648\u0628\u06c1 \u0628\u0646\u062f\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0686\u0648\u0679\u06cc \u06a9\u06cc \u0637\u0627\u0642\u062a \u0645\u0646\u0627\u0633\u0628 \u06c1\u06d2\u06d4 \u06a9\u0644 (kWh \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644) \u0628\u0644\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0648\u0632\u0648\u06ba \u06c1\u06d2\u06d4 \u0634\u0627\u06cc\u062f \u0622\u067e \u062f\u06cc\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u06a9\u06cc\u0648\u06ba\u06d4 <em>\u0635\u062d\u06cc\u062d<\/em> \u062c\u0648\u0627\u0628 \u062a\u06a9\u0646\u06cc\u06a9\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0688\u0648\u0645\u06cc\u0646 \u0645\u062e\u0635\u0648\u0635 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-smoothing-noise\">\u06c1\u0645\u0648\u0627\u0631 \u0634\u0648\u0631<\/h2>\n<p>\u062e\u0627\u0645 \u0633\u06cc\u0646\u0633\u0631 \u0688\u06cc\u0679\u0627 \u0645\u06cc\u06ba \u0627\u06a9\u062b\u0631 \u0627\u0639\u0644\u06cc \u062a\u0639\u062f\u062f \u0634\u0648\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0633\u06af\u0646\u0644 \u06a9\u0648 \u062f\u06be\u0646\u062f\u0644\u0627 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0641\u06cc\u0686\u0631 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0646\u06af \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u0645\u0648\u0627\u0631 \u06a9\u0631\u0646\u0627 \u0645\u0627\u0688\u0644 \u06a9\u0648 \u0645\u0646\u0627\u0633\u0628 \u0634\u0648\u0631 \u0633\u06d2 \u0631\u0648\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0632\u06cc\u0627\u062f\u06c1 \u06c1\u0645\u0648\u0627\u0631 \u06a9\u0631\u0646\u0627 \u062d\u0642\u06cc\u0642\u06cc \u062f\u0646\u06cc\u0627 \u06a9\u06cc \u062e\u0631\u0627\u0628\u06cc \u06a9\u0648 \u062e\u062a\u0645 \u06a9\u0631 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-exponential-weighted-moving-average\">\u062a\u06cc\u0632\u06cc \u0633\u06d2 \u0648\u0632\u0646\u06cc \u062d\u0631\u06a9\u062a \u067e\u0630\u06cc\u0631\u06cc \u0627\u0648\u0633\u0637<\/h3>\n<p>\u0627\u06cc\u06a9\u0633\u067e\u0648\u0646\u06cc\u0646\u0634\u06cc\u0644\u06cc \u0648\u06cc\u0679\u0688 \u0645\u0648\u0648\u0646\u06af \u0627\u06cc\u0648\u0631\u06cc\u062c (EWMA) \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <em>\u062d\u0627\u0644\u06cc\u06c1 \u0645\u0634\u0627\u06c1\u062f\u0627\u062a \u06a9\u0648 \u0632\u06cc\u0627\u062f\u06c1 \u0648\u0632\u0646 \u062f\u06cc\u06ba\u06d4<\/em> \u0633\u0637\u062d \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0632\u06cc \u0633\u06d2 \u0688\u06be\u0627\u0644 \u0644\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u063a\u06cc\u0631 \u0645\u0639\u0645\u0648\u0644\u06cc \u0633\u06af\u0646\u0644\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0633\u0627\u062f\u06c1 \u0645\u0648\u0648\u0646\u06af \u0627\u06cc\u0648\u0631\u06cc\u062c \u0633\u06d2 \u0628\u06c1\u062a\u0631 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\"># Noisy temperature sensor (\u00b0C)\ntemp_noisy = pd.Series(\n    3.5\n    + 1.2 * np.sin(2 * np.pi * np.arange(168) \/ 24)\n    + np.random.normal(0, 0.8, 168),  # high noise\n    index=pd.date_range(\"2024-06-01\", periods=168, freq=\"H\"),\n    name=\"temperature_c\"\n)\n\ntemp_ewma = temp_noisy.ewm(span=6, adjust=False).mean()\ntemp_sma  = temp_noisy.rolling(window=6, center=True).mean()\n\ncomparison = pd.DataFrame({\n    \"raw\":  temp_noisy,\n    \"ewma\": temp_ewma.round(3),\n    \"sma\":  temp_sma.round(3),\n}).iloc[22:30]\n\nprint(comparison)\n<\/code><\/pre>\n<p><strong>\u062d\u0633\u0627\u0628 \u06a9\u062a\u0627\u0628:<\/strong><\/p>\n<pre><code class=\"language-plaintext\">                          raw   ewma    sma\n2024-06-01 22:00:00  3.212372  2.843  3.035\n2024-06-01 23:00:00  3.106840  2.918  3.176\n2024-06-02 00:00:00  3.712290  3.145  3.011\n2024-06-02 01:00:00  3.344376  3.202  3.294\n2024-06-02 02:00:00  2.148946  2.901  3.705\n2024-06-02 03:00:00  4.241105  3.284  4.087\n2024-06-02 04:00:00  5.677429  3.968  4.381\n2024-06-02 05:00:00  5.400083  4.377  4.765\n<\/code><\/pre>\n<h3 id=\"heading-savitzky-golay-filter\">Savitzky-Golay \u0641\u0644\u0679\u0631<\/h3>\n<p>\u0633\u06af\u0646\u0644\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062c\u06c1\u0627\u06ba \u0686\u0648\u0679\u06cc \u06a9\u06cc \u0634\u06a9\u0644\u0648\u06ba \u06a9\u0648 \u0645\u062d\u0636 \u06c1\u0645\u0648\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0628\u062c\u0627\u0626\u06d2 \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u060c Savitzky-Golay \u0641\u0644\u0679\u0631 \u0633\u0644\u0627\u0626\u06cc\u0688\u0646\u06af \u0648\u0646\u0688\u0648 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u06a9\u062b\u06cc\u0631 \u0627\u0644\u062b\u0627\u0646\u06cc \u06a9\u0648 \u0641\u0679 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u062d\u0642\u06cc\u0642\u06cc \u0627\u0633\u067e\u0627\u0626\u06a9 \u0627\u0648\u0646\u0686\u0627\u0626\u06cc \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u0631\u06a9\u06be\u0646\u06d2 \u0645\u06cc\u06ba \u0628\u06c1\u062a\u0631 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-python\">from scipy.signal import savgol_filter\n\ntemp_savgol = pd.Series(\n    savgol_filter(temp_noisy.values, window_length=11, polyorder=2),\n    index=temp_noisy.index,\n    name=\"temp_savgol\"\n).round(3)\n\nprint(pd.DataFrame({\n    \"raw\":    temp_noisy,\n    \"savgol\": temp_savgol,\n}).iloc[22:30])\n<\/code><\/pre>\n<p><strong>\u062d\u0633\u0627\u0628 \u06a9\u062a\u0627\u0628:<\/strong><\/p>\n<pre><code class=\"language-plaintext\">                          raw  savgol\n2024-06-01 22:00:00  3.212372   2.960\n2024-06-01 23:00:00  3.106840   2.944\n2024-06-02 00:00:00  3.712290   3.114\n2024-06-02 01:00:00  3.344376   3.379\n2024-06-02 02:00:00  2.148946   3.809\n2024-06-02 03:00:00  4.241105   4.288\n2024-06-02 04:00:00  5.677429   4.749\n2024-06-02 05:00:00  5.400083   5.138\n<\/code><\/pre>\n<h2 id=\"heading-schema-and-sanity-validation\">\u0633\u06a9\u06cc\u0645\u0627 \u0627\u0648\u0631 \u0639\u0642\u0644 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642<\/h2>\n<p>\u062a\u0635\u062f\u06cc\u0642 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0635\u0641\u0627\u0626\u06cc \u0646\u0627\u0645\u06a9\u0645\u0644 \u06c1\u06d2\u06d4 \u0622\u067e \u06a9\u0648 \u062e\u0648\u062f\u06a9\u0627\u0631 \u062c\u0627\u0646\u0686 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u062c\u0648 \u06a9\u06c1 \u062c\u0628 \u0628\u06be\u06cc \u0646\u06cc\u0627 \u0688\u06cc\u0679\u0627 \u0622\u062a\u0627 \u06c1\u06d2 \u0686\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0622\u067e \u06a9\u0648 \u0645\u0633\u0627\u0626\u0644 \u062a\u0644\u0627\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 \u0648\u06c1 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0688\u0627\u0648\u0646 \u0627\u0633\u0679\u0631\u06cc\u0645 \u0645\u0627\u0688\u0644 \u06a9\u0648 \u062a\u0648\u0691 \u062f\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-python\">def validate_time_series(series: pd.Series, config: dict) -> dict:\n    \"\"\"\n    Run schema and sanity checks on a time series.\n    Returns a report dict with pass\/fail per check.\n    \"\"\"\n    report = {}\n\n    # Frequency check\n    inferred = pd.infer_freq(series.index)\n    report[\"freq_regular\"] = inferred == config[\"expected_freq\"]\n\n    # Missing value threshold\n    missing_rate = series.isna().mean()\n    report[\"missing_below_threshold\"] = missing_rate <= config[\"max_missing_rate\"]\n    report[\"missing_rate\"] = round(missing_rate, 4)\n\n    # Value range check\n    in_range = series.dropna().between(config[\"min_value\"], config[\"max_value\"])\n    report[\"values_in_range\"] = in_range.all()\n    report[\"out_of_range_count\"] = (~in_range).sum()\n\n    # Duplicate timestamps\n    report[\"no_duplicates\"] = not series.index.duplicated().any()\n\n    # Monotonic index\n    report[\"index_monotonic\"] = series.index.is_monotonic_increasing\n\n    return report\n\n\nconfig = {\n    \"expected_freq\":    \"H\",\n    \"max_missing_rate\": 0.05,\n    \"min_value\":        210.0,\n    \"max_value\":        250.0,\n}\n\nreport = validate_time_series(voltage_outlier_fixed, config)\n\nprint(\"=== VALIDATION REPORT ===\")\nfor check, result in report.items():\n    if check in (\"missing_rate\", \"out_of_range_count\"):\n        print(f\"  {check}: {result}\")\n    else:\n        status = \"\u2713 PASS\" if result else \"\u2717 FAIL\"\n        print(f\"  {status}  {check}\")\n<\/code><\/pre>\n<p><strong>\u062d\u0633\u0627\u0628 \u06a9\u062a\u0627\u0628:<\/strong><\/p>\n<pre><code class=\"language-plaintext\">=== VALIDATION REPORT ===\n  \u2717 FAIL  freq_regular\n  \u2713 PASS  missing_below_threshold\n  missing_rate: 0.0\n  \u2713 PASS  values_in_range\n  out_of_range_count: 0\n  \u2713 PASS  no_duplicates\n  \u2713 PASS  index_monotonic\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0646\u0646\u062f\u06c1 \u0627\u06cc\u06a9 \u0642\u0633\u0645 \u06a9\u0627 \u0641\u0646\u06a9\u0634\u0646 \u06c1\u06d2 \u062c\u0648 \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u0645\u06cc\u06ba \u0688\u06cc\u0679\u0627 \u0627\u06a9\u0679\u06be\u0627 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u0645\u0631\u0627\u062d\u0644 \u06a9\u0648 \u0633\u0645\u06cc\u0679\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633\u06d2 \u0635\u0627\u0641 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06cc\u06c1 \u062f\u06cc\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0686\u0644\u0627\u0626\u06cc\u06ba \u06a9\u06c1 \u06a9\u06cc\u0627 \u0679\u0648\u0679\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0635\u0641\u0627\u0626\u06cc \u06a9\u06d2 \u0628\u0639\u062f \u06cc\u06c1 \u062f\u06cc\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u06c1 \u0622\u06cc\u0627 \u0633\u0628 \u06a9\u0686\u06be \u06af\u0632\u0631 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-the-complete-cleaning-checklist\">\u0645\u06a9\u0645\u0644 \u0635\u0641\u0627\u0626\u06cc \u0686\u06cc\u06a9 \u0644\u0633\u0679<\/h2>\n<p>\u0622\u0646\u06d2 \u0648\u0627\u0644\u06cc \u0679\u0627\u0626\u0645 \u0633\u06cc\u0631\u06cc\u0632 \u0688\u06cc\u0679\u0627\u0633\u06cc\u0679 \u067e\u0631 \u0686\u0644\u0646\u06d2 \u06a9\u0627 \u0645\u06a9\u0645\u0644 \u0633\u0644\u0633\u0644\u06c1 \u062f\u0631\u062c \u0630\u06cc\u0644 \u06c1\u06d2:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u0642\u062f\u0645<\/th>\n<th>\u0679\u06cc\u06a9\u0646\u0627\u0644\u0648\u062c\u06cc<\/th>\n<th>\u06a9\u0628 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>\u0622\u0688\u0679<\/strong><\/td>\n<td>\u0627\u0646\u0688\u06cc\u06a9\u0633\u060c \u063a\u0627\u0626\u0628 \u0646\u0642\u0634\u06d2\u060c \u0642\u062f\u0631 \u06a9\u06cc \u062d\u062f \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/td>\n<td>\u06c1\u0645\u06cc\u0634\u06c1 - \u06a9\u0633\u06cc \u0627\u0648\u0631 \u0686\u06cc\u0632 \u0633\u06d2 \u067e\u06c1\u0644\u06d2<\/td>\n<\/tr>\n<tr>\n<td><strong>\u0631\u06cc \u0627\u0646\u0688\u06cc\u06a9\u0633<\/strong><\/td>\n<td><code>reindex<\/code>    \u0645\u0639\u06cc\u0627\u0631\u06cc \u062a\u0639\u062f\u062f \u06a9\u06d2 \u0633\u0627\u062a\u06be<\/td>\n<td>\u0627\u06af\u0631 \u06a9\u0648\u0626\u06cc \u0679\u0627\u0626\u0645 \u0627\u0633\u0679\u06cc\u0645\u067e \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u062a\u0648 \u0648\u06c1 NaN \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/td>\n<\/tr>\n<tr>\n<td><strong>\u063a\u0627\u0626\u0628: \u0645\u062e\u062a\u0635\u0631 \u0648\u0642\u0641\u06d2<\/strong><\/td>\n<td>\u0648\u0642\u062a \u06a9\u06cc \u0645\u062f\u0627\u062e\u0644\u062a<\/td>\n<td>\u0645\u0633\u0644\u0633\u0644 \u0633\u06af\u0646\u0644\u060c \u0648\u0642\u0641\u06c1 \u2264 3 \u0645\u0631\u0627\u062d\u0644<\/td>\n<\/tr>\n<tr>\n<td><strong>\u063a\u0627\u0626\u0628: \u0633\u0679\u06cc\u067e \u0633\u06af\u0646\u0644<\/strong><\/td>\n<td>\u0622\u06af\u06d2 \u0628\u06be\u0631\u0646\u0627<\/td>\n<td>\u0632\u0645\u0631\u06c1 \u062f\u0627\u0631 \u06cc\u0627 \u0633\u06cc\u0679 \u067e\u0648\u0627\u0626\u0646\u0679 \u0688\u06cc\u0679\u0627<\/td>\n<\/tr>\n<tr>\n<td><strong>\u063a\u0627\u0626\u0628: \u0637\u0648\u06cc\u0644 \u0648\u0642\u0641\u06c1<\/strong><\/td>\n<td>\u0645\u0648\u0633\u0645\u06cc \u0633\u0691\u0646 \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc<\/td>\n<td>\u0645\u0648\u0633\u0645\u06cc \u0633\u06af\u0646\u0644\u060c \u0648\u0642\u0641\u06c1 > 6 \u0642\u062f\u0645<\/td>\n<\/tr>\n<tr>\n<td><strong>\u0628\u06cc\u0631\u0648\u0646\u06cc: \u063a\u06cc\u0631 \u0645\u062a\u063a\u06cc\u0631<\/strong><\/td>\n<td>\u0631\u0648\u0644\u0646\u06af Z-score \u06cc\u0627 IQR<\/td>\n<td>\u0633\u0646\u06af\u0644 \u0633\u06cc\u0646\u0633\u0631\u060c \u0645\u0642\u0627\u0645\u06cc \u0628\u06d2 \u0636\u0627\u0628\u0637\u06af\u06cc<\/td>\n<\/tr>\n<tr>\n<td><strong>Outlier: \u0645\u0644\u0679\u06cc \u0648\u06cc\u0631\u06cc\u0679<\/strong><\/td>\n<td>\u0627\u0644\u06af \u062a\u06be\u0644\u06af \u062c\u0646\u06af\u0644<\/td>\n<td>\u0645\u062a\u0639\u062f\u062f \u0645\u062a\u0639\u0644\u0642\u06c1 \u0633\u06cc\u0646\u0633\u0631<\/td>\n<\/tr>\n<tr>\n<td><strong>\u0622\u0624\u0679 \u0644\u06cc\u0626\u0631 \u06c1\u06cc\u0646\u0688\u0644\u0646\u06af<\/strong><\/td>\n<td>Winsorize \u06cc\u0627 interpolate<\/td>\n<td>\u0627\u0633 \u0628\u0627\u062a \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 \u06c1\u06d2 \u06a9\u06c1 \u0648\u0627\u0642\u0639\u06c1 \u062d\u0642\u06cc\u0642\u06cc \u06c1\u06d2 \u06cc\u0627 \u0646\u06c1\u06cc\u06ba\u06d4<\/td>\n<\/tr>\n<tr>\n<td><strong>\u0646\u0642\u0644<\/strong><\/td>\n<td>\u067e\u06c1\u0644\u06d2 \u06cc\u0627 \u06af\u0631\u0648\u067e \u0627\u0648\u0633\u0637 \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u06cc\u06ba<\/td>\n<td>\u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u0688\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u06cc \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u0631\u06cc\u06ba\u06d4<\/td>\n<\/tr>\n<tr>\n<td><strong>\u062f\u0648\u0628\u0627\u0631\u06c1 \u0646\u0645\u0648\u0646\u06c1 \u0644\u06cc\u0646\u0627<\/strong><\/td>\n<td><code>.resample()<\/code>    \u0635\u062d\u06cc\u062d \u06af\u0646\u062a\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be<\/td>\n<td>\u0634\u0627\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u062a\u0639\u062f\u062f \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628<\/td>\n<\/tr>\n<tr>\n<td><strong>\u06c1\u0645\u0648\u0627\u0631 \u06a9\u0631\u0646\u0627<\/strong><\/td>\n<td>EWMA \u06cc\u0627 Savitzky-Golay<\/td>\n<td>\u0641\u0646\u06a9\u0634\u0646\u0644 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0646\u06af \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0634\u0648\u0631 \u0633\u06cc\u0646\u0633\u0631<\/td>\n<\/tr>\n<tr>\n<td><strong>\u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba<\/strong><\/td>\n<td>\u0633\u06a9\u06cc\u0645\u0627 + \u0633\u0646\u0679\u06cc \u0686\u06cc\u06a9<\/td>\n<td>\u0635\u0641\u0627\u0626\u06cc \u06a9\u06d2 \u0628\u0639\u062f\u060c \u06c1\u0631 \u0646\u0626\u06d2 \u0628\u06cc\u0686<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"heading-wrapping-up\">\u062e\u062a\u0645<\/h2>\n<p>\u0622\u0631\u0688\u0631 \u0627\u06c1\u0645 \u06c1\u06d2\u06d4 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba\u06d4 \u06c1\u0645\u0648\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u062a\u0628\u0627\u062f\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u0628\u0631\u0627\u06c1 \u06a9\u0631\u0645 \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u06d2 \u0628\u0639\u062f \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u06cc\u06ba\u06d4 \u0642\u062f\u0645\u0648\u06ba \u06a9\u0648 \u0686\u06be\u0648\u0691\u0646\u0627 \u06cc\u0627 \u0627\u0646\u06c1\u06cc\u06ba \u063a\u0644\u0637 \u062a\u0631\u062a\u06cc\u0628 \u0645\u06cc\u06ba \u06a9\u0631\u0646\u0627 \u0627\u0646 \u0637\u0631\u06cc\u0642\u0648\u06ba \u0633\u06d2 \u063a\u0644\u0637\u06cc\u0627\u06ba \u067e\u06cc\u062f\u0627 \u06a9\u0631\u06d2 \u06af\u0627 \u062c\u0646 \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u0646\u0627 \u0628\u06c1\u062a \u0645\u0634\u06a9\u0644 \u06c1\u06d2 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0622\u067e \u0645\u0627\u0688\u0644 \u06a9\u06cc \u067e\u06cc\u0634\u06cc\u0646 \u06af\u0648\u0626\u06cc\u0648\u06ba \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<p>\u06a9\u0644\u06cc\u0646\u0646\u06af \u0679\u0627\u0626\u0645 \u0633\u06cc\u0631\u06cc\u0632 \u06a9\u0648\u0626\u06cc \u062f\u0644\u06a9\u0634 \u06a9\u0627\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0635\u0627\u0641 \u06a9\u06cc\u06d2 \u06af\u0626\u06d2 \u0688\u06cc\u0679\u0627 \u0627\u0648\u0631 \u0627\u062d\u062a\u06cc\u0627\u0637 \u0633\u06d2 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u06cc\u06d2 \u06af\u0626\u06d2 \u0641\u06cc\u0686\u0631\u0632 \u067e\u0631 \u062a\u0631\u0628\u06cc\u062a \u06cc\u0627\u0641\u062a\u06c1 \u0645\u0627\u0688\u0644\u0632 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u06c1\u0645\u06cc\u0634\u06c1 \u06c1\u06cc \u062e\u0631\u0627\u0628 \u0635\u0627\u0641 \u0688\u06cc\u0679\u0627 \u067e\u0631 \u062a\u0631\u0628\u06cc\u062a \u06cc\u0627\u0641\u062a\u06c1 \u0632\u06cc\u0627\u062f\u06c1 \u0646\u0641\u06cc\u0633 \u0645\u0627\u0688\u0644\u0632 \u06a9\u0648 \u067e\u06cc\u0686\u06be\u06d2 \u0686\u06be\u0648\u0691 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u06a9\u0648 \u0635\u062d\u06cc\u062d \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0646\u0627 \u0633\u0628 \u0633\u06d2 \u0645\u0624\u062b\u0631 \u0686\u06cc\u0632 \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u0679\u0627\u0626\u0645 \u0633\u06cc\u0631\u06cc\u0632 \u06a9\u06d2 \u0688\u06cc\u0679\u0627 \u067e\u0631 \u0622\u0633\u0627\u0646 \u062a\u0631\u06cc\u0646 \u0627\u0644\u06af\u0648\u0631\u062a\u06be\u0645 \u0686\u0644\u0627\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 \u0633\u06cc\u0631\u06cc\u0632 \u06a9\u0627 \u0688\u06cc\u0679\u0627 \u0634\u0627\u0630 \u0648 \u0646\u0627\u062f\u0631 \u06c1\u06cc \u0635\u0627\u0641 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0633\u06cc\u0646\u0633\u0631 \u06a9\u06cc \u0628\u0646\u062f\u0634\u060c \u0633\u0633\u0679\u0645 \u06a9\u0644\u0627\u06a9 \u0688\u0631\u0641\u0679\u060c \u0688\u067e\u0644\u06cc\u06a9\u06cc\u0679 \u067e\u0627\u0626\u067e \u0644\u0627\u0626\u0646 \u0631\u06cc\u06a9\u0627\u0631\u0688\u060c \u0627\u0648\u0631 \u062f\u0633\u062a\u06cc \u0688\u06cc\u0679\u0627 \u0627\u0646\u0679\u0631\u06cc \u063a\u0644\u0637\u06cc\u0648\u06ba \u06a9\u0627 \u0633\u0628\u0628 \u0628\u0646\u062a\u06cc \u06c1\u06d2\u06d4 \u062c\u0628 \u062a\u06a9 \u0688\u06cc\u0679\u0627 \u0633\u06cc\u0679 \u0622\u067e \u06a9\u06d2 \u0644\u06cc\u067e \u0679\u0627\u067e \u062a\u06a9 \u067e\u06c1\u0646\u0686\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633\u06d2 \u062c\u0645\u0639\u060c \u0645\u0646\u062a\u0642\u0644\u060c \u0627\u0648\u0631 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u06c1\u0631 \u0642\u062f\u0645 \u0628\u062f\u0639\u0646\u0648\u0627\u0646\u06cc \u06a9\u0627 \u0645\u0645\u06a9\u0646\u06c1 [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-24108","post","type-post","status-publish","format-standard","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/24108","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/comments?post=24108"}],"version-history":[{"count":0,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/24108\/revisions"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media?parent=24108"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/categories?post=24108"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/tags?post=24108"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}