Merge branch 'dev'

style(local): code standars
This commit is contained in:
lxd1190 2018-11-01 21:12:18 +08:00
commit 5bd6f8e7ef
25 changed files with 639 additions and 77 deletions

7
.idea/misc.xml Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7" project-jdk-type="Python SDK" />
<component name="PyCharmProfessionalAdvertiser">
<option name="shown" value="true" />
</component>
</project>

562
.idea/workspace.xml Normal file
View File

@ -0,0 +1,562 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="158442e4-d283-42b8-a593-a6e34f918125" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/app/config/common.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/config/common.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/config/database.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/config/database.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/config/errorcode.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/config/errorcode.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/controller/api/views.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/controller/api/views.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/controller/manage.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/controller/manage.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/dao/time_series_detector/anomaly_op.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/dao/time_series_detector/anomaly_op.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/dao/time_series_detector/sample_op.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/dao/time_series_detector/sample_op.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/dao/time_series_detector/train_op.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/dao/time_series_detector/train_op.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/service/time_series_detector/algorithm/ewma_and_polynomial.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/service/time_series_detector/algorithm/ewma_and_polynomial.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/service/time_series_detector/algorithm/gbdt.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/service/time_series_detector/algorithm/gbdt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/service/time_series_detector/algorithm/isolation_forest.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/service/time_series_detector/algorithm/isolation_forest.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/service/time_series_detector/algorithm/polynomial_interpolation.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/service/time_series_detector/algorithm/polynomial_interpolation.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/service/time_series_detector/algorithm/xgboosting.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/service/time_series_detector/algorithm/xgboosting.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/service/time_series_detector/anomaly_service.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/service/time_series_detector/anomaly_service.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/service/time_series_detector/detect_service.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/service/time_series_detector/detect_service.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/service/time_series_detector/feature/classification_features.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/service/time_series_detector/feature/classification_features.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/service/time_series_detector/feature/feature_service.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/service/time_series_detector/feature/feature_service.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/service/time_series_detector/feature/fitting_features.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/service/time_series_detector/feature/fitting_features.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/service/time_series_detector/feature/statistical_features.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/service/time_series_detector/feature/statistical_features.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/service/time_series_detector/sample_service.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/service/time_series_detector/sample_service.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/service/time_series_detector/task_service.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/service/time_series_detector/task_service.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/utils/utils.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/utils/utils.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/docker/start.sh" beforeDir="false" afterPath="$PROJECT_DIR$/docker/start.sh" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FUSProjectUsageTrigger">
<session id="1535547038">
<usages-collector id="statistics.lifecycle.project">
<counts>
<entry key="project.open.time.1" value="1" />
<entry key="project.opened" value="1" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.extensions.open">
<counts>
<entry key="gbdt_default_model" value="1" />
<entry key="py" value="61" />
<entry key="sql" value="1" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.types.open">
<counts>
<entry key="PLAIN_TEXT" value="1" />
<entry key="Python" value="61" />
<entry key="SQL" value="1" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.extensions.edit">
<counts>
<entry key="py" value="9" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.types.edit">
<counts>
<entry key="Python" value="9" />
</counts>
</usages-collector>
</session>
</component>
<component name="FileEditorManager">
<leaf>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/sample_service.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="21" selection-start-column="21" selection-end-column="21" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/task_service.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="21" selection-start-column="21" selection-end-column="21" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/app/utils/utils.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="21" selection-start-column="21" selection-end-column="21" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/app/config/common.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="21" selection-start-column="21" selection-end-column="21" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/app/config/database.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="21" selection-start-column="21" selection-end-column="21" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/app/config/errorcode.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="21" selection-start-column="21" selection-end-column="21" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/app/dao/time_series_detector/sample_op.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="616">
<caret line="264" column="37" selection-start-line="264" selection-start-column="37" selection-end-line="264" selection-end-column="37" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/app/controller/api/views.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="95">
<caret line="20" column="13" selection-start-line="20" selection-start-column="13" selection-end-line="20" selection-end-column="13" />
<folding>
<element signature="e#24#63#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/feature/fitting_features.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="228">
<caret line="13" column="1" selection-start-line="13" selection-start-column="1" selection-end-line="13" selection-end-column="1" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/app/utils/__init__.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
</file>
</leaf>
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>18</find>
<find>180</find>
<find>delete</find>
</findStrings>
<dirStrings>
<dir>E:\Metis\app</dir>
<dir>E:\Metis\app\dao</dir>
<dir>E:\Metis\app\service</dir>
</dirStrings>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/app/config/common.py" />
<option value="$PROJECT_DIR$/app/config/database.py" />
<option value="$PROJECT_DIR$/app/config/errorcode.py" />
<option value="$PROJECT_DIR$/app/dao/time_series_detector/anomaly_op.py" />
<option value="$PROJECT_DIR$/app/dao/time_series_detector/train_op.py" />
<option value="$PROJECT_DIR$/app/service/time_series_detector/feature/classification_features.py" />
<option value="$PROJECT_DIR$/app/service/time_series_detector/feature/feature_service.py" />
<option value="$PROJECT_DIR$/app/service/time_series_detector/feature/statistical_features.py" />
<option value="$PROJECT_DIR$/app/service/time_series_detector/anomaly_service.py" />
<option value="$PROJECT_DIR$/app/service/time_series_detector/sample_service.py" />
<option value="$PROJECT_DIR$/app/service/time_series_detector/task_service.py" />
<option value="$PROJECT_DIR$/app/utils/utils.py" />
<option value="$PROJECT_DIR$/app/dao/time_series_detector/sample_op.py" />
<option value="$PROJECT_DIR$/app/service/time_series_detector/feature/fitting_features.py" />
</list>
</option>
</component>
<component name="ProjectFrameBounds" extendedState="7">
<option name="x" value="-90" />
<option name="y" value="119" />
<option name="width" value="1400" />
<option name="height" value="996" />
</component>
<component name="ProjectView">
<navigator proportions="" version="1">
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="ProjectPane">
<subPane>
<expand>
<path>
<item name="Metis" type="b2602c69:ProjectViewProjectNode" />
<item name="Metis" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="Metis" type="b2602c69:ProjectViewProjectNode" />
<item name="Metis" type="462c0819:PsiDirectoryNode" />
<item name="app" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="Metis" type="b2602c69:ProjectViewProjectNode" />
<item name="Metis" type="462c0819:PsiDirectoryNode" />
<item name="app" type="462c0819:PsiDirectoryNode" />
<item name="config" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="Metis" type="b2602c69:ProjectViewProjectNode" />
<item name="Metis" type="462c0819:PsiDirectoryNode" />
<item name="app" type="462c0819:PsiDirectoryNode" />
<item name="controller" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="Metis" type="b2602c69:ProjectViewProjectNode" />
<item name="Metis" type="462c0819:PsiDirectoryNode" />
<item name="app" type="462c0819:PsiDirectoryNode" />
<item name="controller" type="462c0819:PsiDirectoryNode" />
<item name="api" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="Metis" type="b2602c69:ProjectViewProjectNode" />
<item name="Metis" type="462c0819:PsiDirectoryNode" />
<item name="app" type="462c0819:PsiDirectoryNode" />
<item name="controller" type="462c0819:PsiDirectoryNode" />
<item name="api" type="462c0819:PsiDirectoryNode" />
<item name="migrations" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="Metis" type="b2602c69:ProjectViewProjectNode" />
<item name="Metis" type="462c0819:PsiDirectoryNode" />
<item name="app" type="462c0819:PsiDirectoryNode" />
<item name="dao" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="Metis" type="b2602c69:ProjectViewProjectNode" />
<item name="Metis" type="462c0819:PsiDirectoryNode" />
<item name="app" type="462c0819:PsiDirectoryNode" />
<item name="dao" type="462c0819:PsiDirectoryNode" />
<item name="time_series_detector" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="Metis" type="b2602c69:ProjectViewProjectNode" />
<item name="Metis" type="462c0819:PsiDirectoryNode" />
<item name="app" type="462c0819:PsiDirectoryNode" />
<item name="model" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="Metis" type="b2602c69:ProjectViewProjectNode" />
<item name="Metis" type="462c0819:PsiDirectoryNode" />
<item name="app" type="462c0819:PsiDirectoryNode" />
<item name="model" type="462c0819:PsiDirectoryNode" />
<item name="time_series_detector" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="Metis" type="b2602c69:ProjectViewProjectNode" />
<item name="Metis" type="462c0819:PsiDirectoryNode" />
<item name="app" type="462c0819:PsiDirectoryNode" />
<item name="service" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="Metis" type="b2602c69:ProjectViewProjectNode" />
<item name="Metis" type="462c0819:PsiDirectoryNode" />
<item name="app" type="462c0819:PsiDirectoryNode" />
<item name="service" type="462c0819:PsiDirectoryNode" />
<item name="time_series_detector" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="Metis" type="b2602c69:ProjectViewProjectNode" />
<item name="Metis" type="462c0819:PsiDirectoryNode" />
<item name="app" type="462c0819:PsiDirectoryNode" />
<item name="service" type="462c0819:PsiDirectoryNode" />
<item name="time_series_detector" type="462c0819:PsiDirectoryNode" />
<item name="algorithm" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="Metis" type="b2602c69:ProjectViewProjectNode" />
<item name="Metis" type="462c0819:PsiDirectoryNode" />
<item name="app" type="462c0819:PsiDirectoryNode" />
<item name="service" type="462c0819:PsiDirectoryNode" />
<item name="time_series_detector" type="462c0819:PsiDirectoryNode" />
<item name="feature" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="Metis" type="b2602c69:ProjectViewProjectNode" />
<item name="Metis" type="462c0819:PsiDirectoryNode" />
<item name="app" type="462c0819:PsiDirectoryNode" />
<item name="sql" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="Metis" type="b2602c69:ProjectViewProjectNode" />
<item name="Metis" type="462c0819:PsiDirectoryNode" />
<item name="app" type="462c0819:PsiDirectoryNode" />
<item name="sql" type="462c0819:PsiDirectoryNode" />
<item name="time_series_detector" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="Metis" type="b2602c69:ProjectViewProjectNode" />
<item name="Metis" type="462c0819:PsiDirectoryNode" />
<item name="app" type="462c0819:PsiDirectoryNode" />
<item name="utils" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
</pane>
<pane id="Scope" />
</panes>
</component>
<component name="PropertiesComponent">
<property name="last_opened_file_path" value="D:/ProgramData/Anaconda3/Scripts/pylint.exe" />
<property name="settings.editor.selected.configurable" value="preferences.externalTools" />
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="SvnConfiguration">
<configuration />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="158442e4-d283-42b8-a593-a6e34f918125" name="Default Changelist" comment="" />
<created>1541053168778</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1541053168778</updated>
</task>
<servers />
</component>
<component name="TodoView" selected-index="2">
<todo-panel id="selected-file">
<is-autoscroll-to-source value="true" />
</todo-panel>
<todo-panel id="all">
<are-packages-shown value="true" />
<is-autoscroll-to-source value="true" />
</todo-panel>
</component>
<component name="ToolWindowManager">
<frame x="-8" y="-8" width="1936" height="1056" extended-state="6" />
<editor active="true" />
<layout>
<window_info id="Favorites" side_tool="true" />
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.24973656" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info anchor="bottom" id="Version Control" />
<window_info anchor="bottom" id="Python Console" weight="0.32899022" />
<window_info anchor="bottom" id="Terminal" />
<window_info anchor="bottom" id="Event Log" side_tool="true" />
<window_info anchor="bottom" id="Message" order="0" />
<window_info anchor="bottom" id="Find" order="1" />
<window_info anchor="bottom" id="Run" order="2" />
<window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
<window_info anchor="bottom" id="TODO" order="6" visible="true" weight="0.32899022" />
<window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
</layout>
</component>
<component name="VcsContentAnnotationSettings">
<option name="myLimit" value="2678400000" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/app/sql/time_series_detector/anomaly.sql">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="418">
<caret line="22" column="82" selection-start-line="22" selection-start-column="82" selection-end-line="22" selection-end-column="82" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/__init__.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/app/controller/manage.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/tests/test_feature.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/tests/fixtures.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/app/dao/time_series_detector/__init__.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/app/dao/time_series_detector/anomaly_op.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="21" selection-start-column="21" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/dao/time_series_detector/train_op.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="21" selection-start-column="21" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/model/time_series_detector/gbdt_default_model">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/algorithm/ewma.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/algorithm/ewma_and_polynomial.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/algorithm/gbdt.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/algorithm/isolation_forest.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/algorithm/statistic.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/algorithm/xgboosting.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/algorithm/polynomial_interpolation.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/feature/classification_features.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="247">
<caret line="14" column="35" lean-forward="true" selection-start-line="14" selection-start-column="35" selection-end-line="14" selection-end-column="35" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/feature/feature_service.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="21" selection-start-column="21" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/feature/statistical_features.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="21" selection-start-column="21" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/anomaly_service.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="21" selection-start-column="21" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/detect_service.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/sample_service.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="21" selection-start-column="21" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/task_service.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="21" selection-start-column="21" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/utils/__init__.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/app/utils/utils.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="21" selection-start-column="21" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/config/common.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="21" selection-start-column="21" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/config/database.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="21" selection-start-column="21" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/config/errorcode.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="21" selection-start-column="21" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/dao/time_series_detector/sample_op.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="616">
<caret line="264" column="37" selection-start-line="264" selection-start-column="37" selection-end-line="264" selection-end-column="37" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/controller/api/views.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="95">
<caret line="20" column="13" selection-start-line="20" selection-start-column="13" selection-end-line="20" selection-end-column="13" />
<folding>
<element signature="e#24#63#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/app/service/time_series_detector/feature/fitting_features.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="228">
<caret line="13" column="1" selection-start-line="13" selection-start-column="1" selection-end-line="13" selection-end-column="1" />
</state>
</provider>
</entry>
</component>
</project>

View File

@ -1,3 +1,4 @@
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Tencent is pleased to support the open source community by making Metis available.
@ -13,6 +14,6 @@ INPUT_LEN_CH_MAX = 64
INPUT_ITEM_PER_PAGE_MAX = 100
INPUT_LIST_LEN_MAX = 5
VALUE_LEN_MAX = 50000
UPLOAD_PATH = '/tmp/tmpfile_%s.csv'
UPLOAD_FILE = '/tmp/tmpfile_%s.csv'
MARK_POSITIVE = 1
MARK_NEGATIVE = 2

View File

@ -1,3 +1,4 @@
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Tencent is pleased to support the open source community by making Metis available.
@ -7,8 +8,8 @@ https://opensource.org/licenses/BSD-3-Clause
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
"""
db = 'metis'
user = 'metis'
passwd = 'metis@123'
host = '127.0.0.1'
port = 3306
DB = 'metis'
USER = 'metis'
PASSWD = 'metis@123'
HOST = '127.0.0.1'
PORT = 3306

View File

@ -1,3 +1,4 @@
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Tencent is pleased to support the open source community by making Metis available.
@ -20,15 +21,15 @@ TRAIN_ERR = 2003
LACK_SAMPLE = 2004
ERR_CODE = {
0: "操作成功",
1000: "抛出异常",
1001: "数据库操作失败",
1002: "参数检查失败",
1003: "文件格式有误",
1004: "非post请求",
1005: "非get请求",
2001: "特征计算出错",
2002: "读取特征数据失败",
2003: "训练出错",
2004: "缺少正样本或负样本"
OP_SUCCESS: "操作成功",
THROW_EXP: "抛出异常",
OP_DB_FAILED: "数据库操作失败",
CHECK_PARAM_FAILED: "参数检查失败",
FILE_FORMAT_ERR: "文件格式有误",
NOT_POST: "非post请求",
NOT_GET: "非get请求",
CAL_FEATURE_ERR: "特征计算出错",
READ_FEATURE_FAILED: "读取特征数据失败",
TRAIN_ERR: "训练出错",
LACK_SAMPLE: "缺少正样本或负样本"
}

View File

@ -23,7 +23,7 @@ def check_post(func):
return render_json(return_dict)
return f
@check_post
def search_anomaly(request):
anomaly_service = AnomalyService()

View File

@ -1,30 +1,9 @@
#!/usr/bin/env python
import os
import sys
import signal
import errno
def wait_child(signum, frame):
print('receive SIGCHLD')
try:
while True:
cpid, status = os.waitpid(-1, os.WNOHANG)
if cpid == 0:
print('no child process was immediately available')
break
exitcode = status >> 8
print('child process %s exit with exitcode %s', cpid, exitcode)
except OSError as e:
if e.errno == errno.ECHILD:
print ('current process has no existing unwaited-for child processes.')
else:
raise
print('handle SIGCHLD end')
if __name__ == "__main__":
signal.signal(signal.SIGCHLD, wait_child)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.settings")
try:
from django.core.management import execute_from_command_line

View File

@ -1,3 +1,4 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Tencent is pleased to support the open source community by making Metis available.
@ -19,7 +20,7 @@ from app.config.errorcode import *
class AbnormalOperation(object):
def __init__(self):
self.__conn = MySQLdb.connect(host=database.host, port=database.port, user=database.user, passwd=database.passwd, db=database.db)
self.__conn = MySQLdb.connect(host=database.HOST, port=database.PORT, user=database.USER, passwd=database.PASSWD, db=database.DB)
self.__cur = self.__conn.cursor()
self.__cur.execute("SET NAMES UTF8")
self.__sample = SampleOperation()

View File

@ -1,3 +1,4 @@
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Tencent is pleased to support the open source community by making Metis available.
@ -20,7 +21,7 @@ from app.config.errorcode import *
class SampleOperation(object):
def __init__(self):
self.__conn = MySQLdb.connect(host=database.host, port=database.port, user=database.user, passwd=database.passwd, db=database.db)
self.__conn = MySQLdb.connect(host=database.HOST, port=database.PORT, user=database.USER, passwd=database.PASSWD, db=database.DB)
self.__cur = self.__conn.cursor()
self.__cur.execute("SET NAMES UTF8")
@ -179,7 +180,7 @@ class SampleOperation(object):
])
head = ['指标集名称', '指标集id', '指标名称', '指标id', '样本来源', '训练集_测试集', '正样本_负样本', '样本窗口', 'dataC', 'dataB', 'dataA', '数据时间戳']
uuid_str = uuid.uuid4().hex[:8]
download_file_path = UPLOAD_PATH % uuid_str
download_file_path = UPLOAD_FILE % uuid_str
with open(download_file_path, 'w') as pfile:
pfile.write(codecs.BOM_UTF8)
writer = csv.writer(pfile)
@ -261,7 +262,7 @@ class SampleOperation(object):
command = "delete from sample_dataset where id = %s "
num = self.__cur.execute(command, id_num)
self.__conn.commit()
return OP_SUCCESS, {"count":num}
return OP_SUCCESS, {"count": num}
def delete_sample_by_anomaly_id(self, data):
id_num = data['id']

View File

@ -1,3 +1,4 @@
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Tencent is pleased to support the open source community by making Metis available.
@ -16,7 +17,7 @@ from app.config.errorcode import *
class TrainOperation(object):
def __init__(self):
self.__conn = MySQLdb.connect(host=database.host, port=database.port, user=database.user, passwd=database.passwd, db=database.db)
self.__conn = MySQLdb.connect(host=database.HOST, port=database.PORT, user=database.USER, passwd=database.PASSWD, db=database.DB)
self.__cur = self.__conn.cursor()
self.__cur.execute("SET NAMES UTF8")

View File

@ -10,6 +10,7 @@ Unless required by applicable law or agreed to in writing, software distributed
from app.service.time_series_detector.algorithm import ewma
from app.service.time_series_detector.algorithm import polynomial_interpolation
from app.config.common import *
class EwmaAndPolynomialInterpolation(object):
@ -26,7 +27,7 @@ class EwmaAndPolynomialInterpolation(object):
self.degree = degree
self.threshold = threshold
def predict(self, X, window=180):
def predict(self, X, window=DEFAULT_WINDOW):
"""
Predict if a particular sample is an outlier or not.

View File

@ -16,6 +16,8 @@ from sklearn.externals import joblib
from app.service.time_series_detector.feature import feature_service
from app.utils.utils import *
from app.config.errorcode import *
from app.config.common import *
MODEL_PATH = os.path.join(os.path.dirname(__file__), '../../../model/time_series_detector/')
DEFAULT_MODEL = MODEL_PATH + "gbdt_default_model"
@ -43,7 +45,7 @@ class Gbdt(object):
self.max_depth = max_depth
self.learning_rate = learning_rate
def __calculate_features(self, data, window=180):
def __calculate_features(self, data, window=DEFAULT_WINDOW):
"""
Caculate time features.
@ -59,7 +61,7 @@ class Gbdt(object):
features.append(temp)
return features
def gbdt_train(self, data, task_id, window=180):
def gbdt_train(self, data, task_id, window=DEFAULT_WINDOW):
"""
Train a gbdt model.
@ -86,7 +88,7 @@ class Gbdt(object):
return TRAIN_ERR, str(ex)
return OP_SUCCESS, ""
def predict(self, X, window=180, model_name=DEFAULT_MODEL):
def predict(self, X, window=DEFAULT_WINDOW, model_name=DEFAULT_MODEL):
"""
Predict if a particular sample is an outlier or not.

View File

@ -9,6 +9,7 @@ Unless required by applicable law or agreed to in writing, software distributed
"""
from sklearn.ensemble import IsolationForest
from app.config.common import *
class IForest(object):
@ -48,7 +49,7 @@ class IForest(object):
self.random_state = random_state
self.verbose = verbose
def predict(self, X, window=180):
def predict(self, X, window=DEFAULT_WINDOW):
"""
Predict if a particular sample is an outlier or not.

View File

@ -12,6 +12,7 @@ import numpy as np
from sklearn.linear_model import Ridge
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
from app.config.common import *
class PolynomialInterpolation(object):
@ -30,7 +31,7 @@ class PolynomialInterpolation(object):
self.degree = degree
self.threshold = threshold
def predict(self, X, window=180):
def predict(self, X, window=DEFAULT_WINDOW):
"""
Predict if a particular sample is an outlier or not.

View File

@ -13,6 +13,7 @@ import xgboost as xgb
from app.service.time_series_detector.feature import feature_service
from app.utils.utils import *
from app.config.errorcode import *
from app.config.common import *
MODEL_PATH = os.path.join(os.path.dirname(__file__), '../../../model/time_series_detector/')
DEFAULT_MODEL = MODEL_PATH + "xgb_default_model"
@ -87,7 +88,7 @@ class XGBoosting(object):
times = times + 1
return OP_SUCCESS, ""
def __calculate_features(self, data, feature_file_name, window=180):
def __calculate_features(self, data, feature_file_name, window=DEFAULT_WINDOW):
"""
Caculate time features and save as libsvm format.
@ -145,7 +146,7 @@ class XGBoosting(object):
return TRAIN_ERR, str(ex)
return OP_SUCCESS, ""
def predict(self, X, window=180, model_name=DEFAULT_MODEL):
def predict(self, X, window=DEFAULT_WINDOW, model_name=DEFAULT_MODEL):
"""
:param X: the time series to detect of
:type X: pandas.Series

View File

@ -1,4 +1,4 @@
#!/usr/bin/python
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Tencent is pleased to support the open source community by making Metis available.

View File

@ -17,6 +17,7 @@ from app.dao.time_series_detector import train_op
from app.utils.utils import *
from app.service.time_series_detector.algorithm import isolation_forest, ewma, polynomial_interpolation, statistic, xgboosting
from app.config.errorcode import *
from app.config.common import *
MODEL_PATH = os.path.join(os.path.dirname(__file__), '../../model/time_series_detector/')
@ -139,7 +140,7 @@ class DetectService(object):
if "window" in data:
window = data["window"]
else:
window = 180
window = DEFAULT_WINDOW
if len(data['dataC'].split(',')) != (2 * window + 1):
return CHECK_PARAM_FAILED, "dataC is not long enough"
if len(data['dataB'].split(',')) != (2 * window + 1):
@ -166,7 +167,7 @@ class DetectService(object):
if "window" in data:
window = data["window"]
else:
window = 180
window = DEFAULT_WINDOW
statistic_result = self.statistic_obj.predict(time_series)
ewma_result = self.ewma_obj.predict(time_series)
polynomial_result = self.polynomial_obj.predict(time_series, window)

View File

@ -1,4 +1,4 @@
#!/usr/bin/python
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Tencent is pleased to support the open source community by making Metis available.

View File

@ -1,4 +1,4 @@
#!/usr/bin/python
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Tencent is pleased to support the open source community by making Metis available.

View File

@ -1,4 +1,4 @@
#!/usr/bin/python
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Tencent is pleased to support the open source community by making Metis available.
@ -9,8 +9,9 @@ Unless required by applicable law or agreed to in writing, software distributed
"""
import numpy as np
from app.config.common import *
`
def time_series_moving_average(x):
"""
Returns the difference between the last element of x and the smoothed value after Moving Average Algorithm
@ -25,7 +26,7 @@ def time_series_moving_average(x):
:return type: list with float
"""
temp_list = []
for w in range(1, 50, 5):
for w in range(1, min(50, DEFAULT_WINDOW), 5):
temp = np.mean(x[-w:])
temp_list.append(temp)
return list(np.array(temp_list) - x[-1])
@ -45,7 +46,7 @@ def time_series_weighted_moving_average(x):
:return type: list with float
"""
temp_list = []
for w in range(1, 50, 5):
for w in range(1, min(50, DEFAULT_WINDOW), 5):
w = min(len(x), w) # avoid the case len(value_list) < w
coefficient = np.array(range(1, w + 1))
temp_list.append((np.dot(coefficient, x[-w:])) / (w * (w + 1) / 2))
@ -167,7 +168,7 @@ def time_series_periodic_features(data_c_left, data_c_right, data_b_left, data_b
Others are similar.
'''
for w in range(1, 180, 30):
for w in range(1, DEFAULT_WINDOW, DEFAULT_WINDOW / 6):
periodic_features.append(min(max(data_c_left[-w:]) - data_a[-1], 0))
periodic_features.append(min(max(data_c_right[:w]) - data_a[-1], 0))
periodic_features.append(min(max(data_b_left[-w:]) - data_a[-1], 0))
@ -181,7 +182,7 @@ def time_series_periodic_features(data_c_left, data_c_right, data_b_left, data_b
Add the difference of mean values between two subsequences
'''
for w in range(1, 180, 20):
for w in range(1, DEFAULT_WINDOW, DEFAULT_WINDOW / 9):
temp_value = np.mean(data_c_left[-w:]) - np.mean(data_a[-w:])
periodic_features.append(abs(temp_value))
if temp_value < 0:

View File

@ -1,4 +1,4 @@
#!/usr/bin/python
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Tencent is pleased to support the open source community by making Metis available.

View File

@ -1,4 +1,4 @@
#!/usr/bin/python
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Tencent is pleased to support the open source community by making Metis available.
@ -22,7 +22,7 @@ class SampleService(object):
def __init__(self):
self.__sample = SampleOperation()
uuid_str = uuid.uuid4().hex[:8]
self.__upload_file_path = UPLOAD_PATH % uuid_str
self.__upload_file_path = UPLOAD_FILE % uuid_str
@exce_service
def import_sample(self, data):
@ -82,7 +82,7 @@ class SampleService(object):
return self.__sample.query_sample(json.loads(body))
def sample_download(self, body):
ret_code = 1000
ret_code = THROW_EXP
try:
if len(body) > VALUE_LEN_MAX:
return ""

View File

@ -1,4 +1,4 @@
#!/usr/bin/python
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Tencent is pleased to support the open source community by making Metis available.

View File

@ -1,4 +1,4 @@
#!/usr/bin/python
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Tencent is pleased to support the open source community by making Metis available.
@ -10,13 +10,12 @@ Unless required by applicable law or agreed to in writing, software distributed
import numpy as np
import traceback
import json
from functools import wraps
from app.config.errorcode import *
from app.config.common import *
def is_standard_time_series(time_series, window=180):
def is_standard_time_series(time_series, window=DEFAULT_WINDOW):
"""
Check the length of time_series. If window = 180, then the length of time_series should be 903.
The mean value of last window should be larger than 0.
@ -30,7 +29,7 @@ def is_standard_time_series(time_series, window=180):
return bool(len(time_series) == 5 * window + 3 and np.mean(time_series[(4 * window + 2):]) > 0)
def split_time_series(time_series, window=180):
def split_time_series(time_series, window=DEFAULT_WINDOW):
"""
Spilt the time_series into five parts. Each has a length of window + 1

View File

@ -1,7 +1,8 @@
#!/bin/bash
if [ $# == 0 ]
then
echo "Need at least 1 argument!"
exit
echo "Usage:$0 <IP Address>"
exit 1
fi
ip=$1
@ -9,7 +10,7 @@ docker rm -f metis-db
docker rm -f metis-svr
docker rm -f metis-web
docker run --net=host --name=metis-db -i -t -d -p 3306:3306 -v /data/metis/mysql/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=metis@123 zhiyunmetis/metis-db
docker run --net=host --name=metis-db -d -p 3306:3306 -v /data/metis/mysql/:/var/lib/mysql:Z -e MYSQL_ROOT_PASSWORD=metis@123 zhiyunmetis/metis-db
sleep 6
docker run --net=host --name=metis-svr -i -t -d -p 8080:8080 -v /data/metis/module/:/metis/app/model/time_series_detector zhiyunmetis/metis-svr /bin/sh /metis/init.sh
docker run --net=host --name=metis-web -i -t -d -p 80:80 zhiyunmetis/metis-web /bin/sh /metis/init.sh ${ip}
docker run --net=host --name=metis-svr -d -p 8080:8080 -v /data/metis/module/:/metis/app/model/time_series_detector:Z zhiyunmetis/metis-svr /bin/sh /metis/init.sh
docker run --net=host --name=metis-web -d -p 80:80 zhiyunmetis/metis-web /bin/sh /metis/init.sh ${ip}