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 +11 -0
- carnotpy-0.1/README.md +2 -0
- carnotpy-0.1/carnotpy.egg-info/PKG-INFO +11 -0
- carnotpy-0.1/carnotpy.egg-info/SOURCES.txt +8 -0
- carnotpy-0.1/carnotpy.egg-info/dependency_links.txt +1 -0
- carnotpy-0.1/carnotpy.egg-info/requires.txt +3 -0
- carnotpy-0.1/carnotpy.egg-info/top_level.txt +1 -0
- carnotpy-0.1/carnotpy.py +230 -0
- carnotpy-0.1/setup.cfg +4 -0
- carnotpy-0.1/setup.py +14 -0
carnotpy-0.1/PKG-INFO
ADDED
carnotpy-0.1/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
carnotpy
|
carnotpy-0.1/carnotpy.py
ADDED
|
@@ -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
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
|
+
)
|