carnotpy 0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
carnotpy-0.1/PKG-INFO ADDED
@@ -0,0 +1,11 @@
1
+ Metadata-Version: 2.1
2
+ Name: carnotpy
3
+ Version: 0.1
4
+ Summary: Carnot Connection as a Python Package
5
+ Home-page: UNKNOWN
6
+ Author: Carnot Innovations
7
+ License: UNKNOWN
8
+ Platform: UNKNOWN
9
+
10
+ UNKNOWN
11
+
carnotpy-0.1/README.md ADDED
@@ -0,0 +1,2 @@
1
+ # carnotpy
2
+ Carnot Connection as a Python Package
@@ -0,0 +1,11 @@
1
+ Metadata-Version: 2.1
2
+ Name: carnotpy
3
+ Version: 0.1
4
+ Summary: Carnot Connection as a Python Package
5
+ Home-page: UNKNOWN
6
+ Author: Carnot Innovations
7
+ License: UNKNOWN
8
+ Platform: UNKNOWN
9
+
10
+ UNKNOWN
11
+
@@ -0,0 +1,8 @@
1
+ README.md
2
+ carnotpy.py
3
+ setup.py
4
+ carnotpy.egg-info/PKG-INFO
5
+ carnotpy.egg-info/SOURCES.txt
6
+ carnotpy.egg-info/dependency_links.txt
7
+ carnotpy.egg-info/requires.txt
8
+ carnotpy.egg-info/top_level.txt
@@ -0,0 +1,3 @@
1
+ pandas
2
+ requests
3
+ python-dateutil
@@ -0,0 +1 @@
1
+ carnotpy
@@ -0,0 +1,230 @@
1
+ import pandas as pd
2
+ import datetime
3
+ import requests
4
+ from dateutil.relativedelta import relativedelta
5
+
6
+
7
+
8
+ def process_equipment(payload, equipment_name):
9
+ if payload['filters'].get('equipment_name'):
10
+ if payload.get('pipeline') and len(payload['pipeline']) > 0:
11
+ for stage in payload['pipeline']:
12
+ if stage['type'] == 'filter':
13
+ stage['filter_by'] = stage['filter_by'].replace(payload['filters']['equipment_name'] + ' - ',
14
+ equipment_name + ' - ')
15
+ elif stage.get('formula') and stage['formula'] != '':
16
+ stage['formula'] = stage['formula'].replace(payload['filters']['equipment_name'] + ' - ',
17
+ equipment_name + ' - ')
18
+ elif stage['type'] == 'insert_series':
19
+ stage['name'] = stage['name'].replace(payload['filters']['equipment_name'] + ' - ',
20
+ equipment_name + ' - ')
21
+ if stage.get('filters') and stage['filters']['equipment_name'] == payload['filters'][
22
+ 'equipment_name']:
23
+ stage['filters']['equipment_name'] = equipment_name
24
+ payload['filters']['equipment_name'] = equipment_name
25
+
26
+
27
+ def process_date_range(payload, date_range):
28
+ if payload['useCustomRange']:
29
+ if payload['useCustomRelativeRange']:
30
+ rel_range = payload.get('customRelativeRange', '30 days')
31
+ new_range = None
32
+ base_date = datetime.datetime.now()
33
+ start_date = base_date - datetime.timedelta(days=30)
34
+ if rel_range == 'current week':
35
+ start_date = base_date - datetime.timedelta(days=base_date.weekday())
36
+ elif rel_range == 'current month':
37
+ start_date = base_date.replace(day=1)
38
+ elif rel_range == 'today':
39
+ start_date = base_date.replace(hour=0, minute=0, second=0, microsecond=0)
40
+ elif rel_range == 'current year':
41
+ start_date = base_date.replace(month=1, day=1)
42
+ elif rel_range == 'last week':
43
+ base_date = base_date - datetime.timedelta(weeks=1)
44
+ end_date = base_date.replace(hour=23, minute=59, second=59, microsecond=999999)
45
+ start_date = end_date - datetime.timedelta(days=end_date.weekday())
46
+ elif rel_range == 'last month':
47
+ base_date = base_date.replace(day=1) - datetime.timedelta(days=1)
48
+ end_date = base_date.replace(hour=23, minute=59, second=59, microsecond=999999)
49
+ start_date = end_date.replace(day=1)
50
+ elif rel_range == 'yesterday':
51
+ base_date = base_date - datetime.timedelta(days=1)
52
+ end_date = base_date.replace(hour=23, minute=59, second=59, microsecond=999999)
53
+ start_date = end_date.replace(hour=0, minute=0, second=0, microsecond=0)
54
+ elif rel_range == 'last year':
55
+ base_date = base_date.replace(year=base_date.year - 1, month=12, day=31)
56
+ end_date = base_date.replace(hour=23, minute=59, second=59, microsecond=999999)
57
+ start_date = end_date.replace(year=base_date.year - 1, month=1, day=1)
58
+
59
+ if rel_range in ['yesterday', 'today']:
60
+ new_range = {
61
+ 'start': start_date.strftime('%Y-%m-%d %H:%M:%S'),
62
+ 'end': base_date.strftime('%Y-%m-%d %H:%M:%S')
63
+ }
64
+ else:
65
+ new_range = {
66
+ 'start': start_date.strftime('%Y-%m-%d'),
67
+ 'end': (base_date.strftime('%Y-%m-%d %H:%M:%S') if len(
68
+ base_date.strftime('%Y-%m-%d')) < 12 else base_date.strftime('%Y-%m-%d'))
69
+ }
70
+
71
+ payload['date_range'] = [new_range['start'], new_range['end']]
72
+
73
+ elif payload.get('customRange'):
74
+ if payload['customRangeStartOnly'] and date_range and date_range['end']:
75
+ payload['date_range'] = [payload['customRange']['start'], (
76
+ date_range['end'] + ' 23:59:59' if len(date_range['end']) < 12 else date_range['end'])]
77
+ else:
78
+ payload['date_range'] = [payload['customRange']['start'], (
79
+ payload['customRange']['end'] + ' 23:59:59' if len(payload['customRange']['end']) < 12 else
80
+ payload['customRange']['end'])]
81
+
82
+ elif date_range:
83
+ if payload.get('offsetRange') and payload.get('offsetType'):
84
+ if payload['offsetRangeStartOnly']:
85
+ if payload['offsetType'] in ['year', 'years'] and payload.get('offsetPreciseYear'):
86
+ payload['date_range'] = [
87
+ datetime.datetime.strptime(date_range['start'], '%Y-%m-%d').replace(
88
+ year=payload['offsetPreciseYear']).strftime('%Y-%m-%d'),
89
+ (date_range['end'] + ' 23:59:59' if len(date_range['end']) < 12 else date_range['end'])
90
+ ]
91
+ elif payload['offsetType'] in ['month', 'months']:
92
+ offset = relativedelta(months=-payload['offsetAmount'])
93
+ payload['date_range'] = [
94
+ (datetime.datetime.strptime(date_range['start'], '%Y-%m-%d') + offset).strftime('%Y-%m-%d'),
95
+ (date_range['end'] + ' 23:59:59' if len(date_range['end']) < 12 else date_range['end'])
96
+ ]
97
+ elif payload['offsetType'] in ['year', 'years']:
98
+ offset = relativedelta(years=-payload['offsetAmount'])
99
+ payload['date_range'] = [
100
+ (datetime.datetime.strptime(date_range['start'], '%Y-%m-%d') + offset).strftime('%Y-%m-%d'),
101
+ (date_range['end'] + ' 23:59:59' if len(date_range['end']) < 12 else date_range['end'])
102
+ ]
103
+ else:
104
+ payload['date_range'] = [
105
+ (datetime.datetime.strptime(date_range['start'], '%Y-%m-%d') - datetime.timedelta(
106
+ **{payload['offsetType']: payload['offsetAmount']})).strftime('%Y-%m-%d'),
107
+ (date_range['end'] + ' 23:59:59' if len(date_range['end']) < 12 else date_range['end'])
108
+ ]
109
+ else:
110
+ if payload['offsetType'] in ['year', 'years'] and payload.get('offsetPreciseYear'):
111
+ payload['date_range'] = [
112
+ datetime.datetime.strptime(date_range['start'], '%Y-%m-%d').replace(
113
+ year=payload['offsetPreciseYear']).strftime('%Y-%m-%d'),
114
+ datetime.datetime.strptime(date_range['end'], '%Y-%m-%d').replace(
115
+ year=payload['offsetPreciseYear']).strftime('%Y-%m-%d') + ' 23:59:59'
116
+ ]
117
+ elif payload['offsetType'] in ['month', 'months']:
118
+ offset = relativedelta(months=-payload['offsetAmount'])
119
+ payload['date_range'] = [
120
+ (datetime.datetime.strptime(date_range['start'], '%Y-%m-%d') + offset).strftime('%Y-%m-%d'),
121
+ (datetime.datetime.strptime(date_range['end'], '%Y-%m-%d') + offset).strftime(
122
+ '%Y-%m-%d') + ' 23:59:59'
123
+ ]
124
+ elif payload['offsetType'] in ['year', 'years']:
125
+ offset = relativedelta(years=-payload['offsetAmount'])
126
+ payload['date_range'] = [
127
+ (datetime.datetime.strptime(date_range['start'], '%Y-%m-%d') + offset).strftime('%Y-%m-%d'),
128
+ (datetime.datetime.strptime(date_range['end'], '%Y-%m-%d') + offset).strftime(
129
+ '%Y-%m-%d') + ' 23:59:59'
130
+ ]
131
+ else:
132
+ payload['date_range'] = [
133
+ (datetime.datetime.strptime(date_range['start'], '%Y-%m-%d') - datetime.timedelta(
134
+ **{payload['offsetType']: payload['offsetAmount']})).strftime('%Y-%m-%d'),
135
+ (datetime.datetime.strptime(date_range['end'], '%Y-%m-%d') - datetime.timedelta(
136
+ **{payload['offsetType']: payload['offsetAmount']})).strftime('%Y-%m-%d') + ' 23:59:59'
137
+ ]
138
+ else:
139
+ payload['date_range'] = [date_range['start'], (
140
+ date_range['end'] + ' 23:59:59' if len(date_range['end']) < 12 else date_range['end'])]
141
+
142
+
143
+ class CarnotPy:
144
+
145
+ def __init__(self, url, username, password):
146
+ self.url = url
147
+ self.username = username
148
+ self.password = password
149
+
150
+ def get_token(self):
151
+ result = requests.post(self.url + "/login/", json={"user_name": self.username, "password": self.password})
152
+ assert result.status_code == 200
153
+ return result.json()["token"]
154
+
155
+ def discover(self):
156
+ token = self.get_token()
157
+ result = requests.post(self.url + "/point-discovery/",
158
+ headers={"Authorization": "Bearer " + token}
159
+ )
160
+ assert result.status_code == 200
161
+ return result.json()["result"]
162
+
163
+ def read_history(self, sensor_ids, start_time, end_time):
164
+ token = self.get_token()
165
+ result = requests.post(
166
+ self.url + "/historical-data/",
167
+ json={
168
+ "date_range": [start_time, end_time],
169
+ "sensor_ids": sensor_ids
170
+ },
171
+ headers={"Authorization": "Bearer " + token, 'Content-Type': 'application/json'}
172
+ )
173
+ assert result.status_code == 200
174
+ data = result.json()
175
+ data['timestamp'] = pd.to_datetime(data['timestamp'])
176
+ df = pd.DataFrame(data)
177
+ df = df.set_index('timestamp')
178
+ return df
179
+
180
+ def read_data3(self, payload, token=None):
181
+ if token is None:
182
+ token = self.get_token()
183
+ result = requests.post(
184
+ self.url + "/data3/",
185
+ json=payload,
186
+ headers={"Authorization": "Bearer " + token, 'Content-Type': 'application/json'}
187
+ )
188
+ assert result.status_code == 200
189
+ data = result.json()
190
+ data['timestamp'] = pd.to_datetime(data['timestamp'])
191
+ df = pd.DataFrame(data)
192
+ df = df.set_index('timestamp')
193
+ return df
194
+
195
+ def read_data3_query(self, query, facility_name, date_range, equipment=None, on_only=False, parameters=None):
196
+ token = self.get_token()
197
+ payload_array = query['data-payload']
198
+ df = None
199
+ index = None
200
+ for payload in payload_array:
201
+ payload['parameters'] = parameters
202
+ process_date_range(payload, date_range)
203
+ if 'facility_name' not in payload["filters"]:
204
+ payload["filters"]["facility_name"] = facility_name
205
+ if equipment is not None:
206
+ process_equipment(payload, equipment)
207
+ if on_only or payload.get('onOnly', False):
208
+ if 'pipeline' not in payload:
209
+ payload['pipeline'] = []
210
+ payload['pipeline'].append({
211
+ "type": "filter",
212
+ "filter_op": "eq",
213
+ "filter_by": "* - on",
214
+ "filter_value": 1,
215
+ })
216
+ del(payload["seriesOverrides"])
217
+ new_df = self.read_data3(payload, token=token)
218
+ if index is None:
219
+ index = new_df.index
220
+ new_df.index = range(len(new_df))
221
+ if df is None:
222
+ df = new_df
223
+ else:
224
+ df = df.join(new_df)
225
+
226
+ df.index = index
227
+ return df
228
+
229
+
230
+
carnotpy-0.1/setup.cfg ADDED
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
carnotpy-0.1/setup.py ADDED
@@ -0,0 +1,14 @@
1
+ from setuptools import setup
2
+
3
+ setup(
4
+ name='carnotpy',
5
+ version='0.1',
6
+ author='Carnot Innovations',
7
+ description='Carnot Connection as a Python Package',
8
+ py_modules=['carnotpy'],
9
+ install_requires=[
10
+ 'pandas',
11
+ 'requests',
12
+ 'python-dateutil',
13
+ ],
14
+ )