ecopipeline 0.8.8__py3-none-any.whl → 0.8.10__py3-none-any.whl

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.
@@ -732,11 +732,17 @@ def fm_api_to_df(config: ConfigManager, startTime: datetime = None, endTime: dat
732
732
  time_diff = endTime - startTime
733
733
  midpointTime = startTime + time_diff / 2
734
734
  # recursively construct the df
735
- df_1 = fm_api_to_df(config, startTime, midpointTime)
736
- df_2 = fm_api_to_df(config, midpointTime, endTime)
735
+ df_1 = fm_api_to_df(config, startTime, midpointTime, create_csv=False)
736
+ df_2 = fm_api_to_df(config, midpointTime, endTime, create_csv=False)
737
737
  df = pd.concat([df_1, df_2])
738
738
  df = df.sort_index()
739
739
  df = df.groupby(df.index).mean()
740
+ if create_csv:
741
+ filename = f"{startTime.strftime('%Y%m%d%H%M%S')}.csv"
742
+ original_directory = os.getcwd()
743
+ os.chdir(config.data_directory)
744
+ df.to_csv(filename, index_label='time_pt')
745
+ os.chdir(original_directory)
740
746
  return df
741
747
 
742
748
  print(f"Failed to make GET request. Status code: {response.status_code} {response.json()}")
@@ -761,7 +767,7 @@ def pull_egauge_data(config: ConfigManager, eGauge_ids: list, eGauge_usr : str,
761
767
 
762
768
  os.chdir(original_directory)
763
769
 
764
- def tb_api_to_df(config: ConfigManager, startTime: datetime = None, endTime: datetime = None, create_csv : bool = True):
770
+ def tb_api_to_df(config: ConfigManager, startTime: datetime = None, endTime: datetime = None, create_csv : bool = True, query_hours : int = 12):
765
771
  """
766
772
  Function connects to the things board manager api to pull data and returns a dataframe.
767
773
 
@@ -779,11 +785,14 @@ def tb_api_to_df(config: ConfigManager, startTime: datetime = None, endTime: dat
779
785
  is local time from the data's index.
780
786
  create_csv : bool
781
787
  create csv files as you process such that API need not be relied upon for reprocessing
788
+ query_hours : int
789
+ number of hours to query at a time from ThingsBoard API
782
790
 
783
791
  Returns
784
792
  -------
785
793
  pd.DataFrame:
786
- Pandas Dataframe containing data from the API pull with column headers the same as the variable names in the data from the pull
794
+ Pandas Dataframe containing data from the API pull with column headers the same as the variable names in the data from the pull.
795
+ Will return with index in UTC so needs to be converted after to appropriate timezone
787
796
  """
788
797
  if endTime is None:
789
798
  endTime = datetime.now()
@@ -791,15 +800,22 @@ def tb_api_to_df(config: ConfigManager, startTime: datetime = None, endTime: dat
791
800
  # 28 hours to ensure encapsulation of last day
792
801
  startTime = endTime - timedelta(hours=28)
793
802
 
794
- if endTime - timedelta(hours=12) > startTime:
803
+ if endTime - timedelta(hours=query_hours) > startTime:
795
804
  time_diff = endTime - startTime
796
805
  midpointTime = startTime + time_diff / 2
797
806
  # recursively construct the df
798
- df_1 = tb_api_to_df(config, startTime, midpointTime)
799
- df_2 = tb_api_to_df(config, midpointTime, endTime)
807
+ df_1 = tb_api_to_df(config, startTime, midpointTime, create_csv=False,query_hours=query_hours)
808
+ df_2 = tb_api_to_df(config, midpointTime, endTime, create_csv=False,query_hours=query_hours)
800
809
  df = pd.concat([df_1, df_2])
801
810
  df = df.sort_index()
802
811
  df = df.groupby(df.index).mean()
812
+ if create_csv:
813
+ filename = f"{startTime.strftime('%Y%m%d%H%M%S')}.csv"
814
+ original_directory = os.getcwd()
815
+ os.chdir(config.data_directory)
816
+ df.to_csv(filename, index_label='time_pt')
817
+ os.chdir(original_directory)
818
+
803
819
  return df
804
820
  url = f'https://thingsboard.cloud/api/plugins/telemetry/DEVICE/{config.api_device_id}/values/timeseries'
805
821
  token = config.get_thingsboard_token()
@@ -1110,13 +1110,9 @@ def create_data_statistics_df(df: pd.DataFrame) -> pd.DataFrame:
1110
1110
  total_missing = df_full.isna().resample('D').sum().astype(int)
1111
1111
  # Function to calculate max consecutive missing values
1112
1112
  def max_consecutive_nans(x):
1113
- try:
1114
- # print(f"here is x :{x}")
1115
- is_na = pd.Series(x).isna().reset_index(drop=True)
1116
- groups = (is_na != is_na.shift()).cumsum()
1117
- return is_na.groupby(groups).sum().max() or 0
1118
- except:
1119
- raise Exception(f"{x} is the problem!")
1113
+ is_na = pd.Series(x).isna().reset_index(drop=True)
1114
+ groups = (is_na != is_na.shift()).cumsum()
1115
+ return is_na.groupby(groups).sum().max() or 0
1120
1116
 
1121
1117
  # Function to calculate average consecutive missing values
1122
1118
  def avg_consecutive_nans(x):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ecopipeline
3
- Version: 0.8.8
3
+ Version: 0.8.10
4
4
  Summary: Contains functions for use in Ecotope Datapipelines
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: License :: OSI Approved :: GNU General Public License (GPL)
@@ -2,18 +2,18 @@ ecopipeline/__init__.py,sha256=d48mO5La6OrQDkRe_qqoY6lUx7x-e8krOH388jmWjwU,218
2
2
  ecopipeline/event_tracking/__init__.py,sha256=q49j46fXMUjNUPzL4FvXEppB93i3lUni-QUZpp61tt0,64
3
3
  ecopipeline/event_tracking/event_tracking.py,sha256=LOCLE7ju320O7CrwnWRIqHRa2uAqoq-KvXZ3zWQ2S74,13224
4
4
  ecopipeline/extract/__init__.py,sha256=gQ3sak6NJ63Gpo-hZXrtZfeKOTHLRyAVXfTgxxRpqPo,675
5
- ecopipeline/extract/extract.py,sha256=EAe1oSmmSMd-mG9QY-4wTzXwY4ziUaQw5Vrkgt4ZXNY,48542
5
+ ecopipeline/extract/extract.py,sha256=lWyjD7f95nfmJ-BojAGFA-2mXiyPgXceDci-jAJmCSE,49494
6
6
  ecopipeline/load/__init__.py,sha256=NLa_efQJZ8aP-J0Y5xx9DP7mtfRH9jY6Jz1ZMZN_BAA,292
7
7
  ecopipeline/load/load.py,sha256=Ptxr0MOjns_HeVSmZsLLApHJGB-z6XOB2m8LNiVaD7E,23860
8
8
  ecopipeline/transform/__init__.py,sha256=hYb4F64fXdXtjBSYCqv6gLFBwKZjjnl0z7s291pFE98,2505
9
9
  ecopipeline/transform/bayview.py,sha256=TP24dnTsUD95X-f6732egPZKjepFLJgDm9ImGr-fppY,17899
10
10
  ecopipeline/transform/lbnl.py,sha256=EQ54G4rJXaZ7pwVusKcdK2KBehSdCsNo2ybphtMGs7o,33400
11
- ecopipeline/transform/transform.py,sha256=J-QxcwjWkocPrHJ_mQD4m57HenwwQZnFYgU0BSMTkgQ,49229
11
+ ecopipeline/transform/transform.py,sha256=S8fpAb45XBcYzeGNkxELiHM8-1jlNQqADV7_m-2oeWI,49097
12
12
  ecopipeline/utils/ConfigManager.py,sha256=-g1wtExdvhYO5Y6Q3cRbywa__DxRMFruLrB4YanwaPY,12168
13
13
  ecopipeline/utils/__init__.py,sha256=ccWUR0m7gD9DfcgsxBCLOfi4lho6RdYuB2Ugy_g6ZdQ,28
14
14
  ecopipeline/utils/unit_convert.py,sha256=VFh1we2Y8KV3u21BeWb-U3TlZJXo83q5vdxxkpgcuME,3064
15
- ecopipeline-0.8.8.dist-info/licenses/LICENSE,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- ecopipeline-0.8.8.dist-info/METADATA,sha256=bmYXzXG0itQmMRAMBIBbstHteeYgiFVpbRVF5gyMOf8,2329
17
- ecopipeline-0.8.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
18
- ecopipeline-0.8.8.dist-info/top_level.txt,sha256=WOPFJH2LIgKqm4lk2OnFF5cgVkYibkaBxIxgvLgO7y0,12
19
- ecopipeline-0.8.8.dist-info/RECORD,,
15
+ ecopipeline-0.8.10.dist-info/licenses/LICENSE,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ ecopipeline-0.8.10.dist-info/METADATA,sha256=Jpq72FqjQUHRG0VUeCaLOLMzaVJqWANDzpe_QZouTnI,2330
17
+ ecopipeline-0.8.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
18
+ ecopipeline-0.8.10.dist-info/top_level.txt,sha256=WOPFJH2LIgKqm4lk2OnFF5cgVkYibkaBxIxgvLgO7y0,12
19
+ ecopipeline-0.8.10.dist-info/RECORD,,