luxorasap 0.1.15__py3-none-any.whl → 0.1.17__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.
luxorasap/__init__.py CHANGED
@@ -13,7 +13,7 @@ from types import ModuleType
13
13
  try:
14
14
  __version__: str = metadata.version(__name__)
15
15
  except metadata.PackageNotFoundError: # editable install
16
- __version__ = "0.1.15"
16
+ __version__ = "0.1.17"
17
17
 
18
18
  # ─── Lazy loader ─────────────────────────────────────────────────
19
19
  def __getattr__(name: str) -> ModuleType:
@@ -21,7 +21,8 @@ def save_table(
21
21
  index_name: str = "index",
22
22
  normalize_columns: bool = True,
23
23
  directory: str = "enriched/parquet",
24
- override=False
24
+ override=False,
25
+ large_df: bool = False
25
26
  ):
26
27
  """Salva DataFrame como Parquet em ADLS (sobrescrevendo)."""
27
28
 
@@ -34,7 +35,7 @@ def save_table(
34
35
  return
35
36
 
36
37
  df = prep_for_save(df, index=index, index_name=index_name, normalize=normalize_columns)
37
- _client.write_df(df.astype(str), f"{directory}/{table_name}.parquet")
38
+ _client.write_df(df.astype(str), f"{directory}/{table_name}.parquet", large_df=large_df)
38
39
 
39
40
 
40
41
  def incremental_load(
@@ -47,6 +48,7 @@ def incremental_load(
47
48
  index_name: str = "index",
48
49
  normalize_columns: bool = True,
49
50
  directory: str = "enriched/parquet",
51
+ large_df: bool = False
50
52
  ):
51
53
  """Concatena novos dados aos existentes, cortando duplicados pela data."""
52
54
  df["Last_Updated"] = dt.datetime.now()
@@ -64,5 +66,6 @@ def incremental_load(
64
66
  index_name=index_name,
65
67
  normalize_columns=normalize_columns,
66
68
  directory=directory,
67
- override=True
69
+ override=True,
70
+ large_df=large_df
68
71
  )
@@ -4,6 +4,7 @@ from datetime import timezone
4
4
  import pandas as pd
5
5
  import pyarrow as pa, pyarrow.parquet as pq
6
6
  from azure.storage.blob import BlobServiceClient
7
+ import tempfile
7
8
 
8
9
  from ..dataframe import read_bytes
9
10
 
@@ -33,13 +34,30 @@ class BlobParquetClient:
33
34
  return None, False
34
35
 
35
36
 
36
- def write_df(self, df, blob_path: str):
37
- table = pa.Table.from_pandas(df)
38
- buf = io.BytesIO()
39
- pq.write_table(table, buf)
40
- buf.seek(0)
41
- self._blob(blob_path).upload_blob(buf, overwrite=True)
37
+ def write_df(self, df, blob_path: str, large_df: bool = False):
38
+ if not large_df:
39
+ table = pa.Table.from_pandas(df)
40
+ buf = io.BytesIO()
41
+ pq.write_table(table, buf)
42
+ buf.seek(0)
43
+ self._blob(blob_path).upload_blob(buf, overwrite=True)
42
44
 
45
+ else:
46
+ with tempfile.NamedTemporaryFile(delete=False, suffix=".parquet") as f:
47
+ writer = None
48
+ chunk_size = 100_000
49
+ for i in range(0, len(df), chunk_size):
50
+ chunk = pa.Table.from_pandas(df.iloc[i:i+chunk_size])
51
+ if writer is None:
52
+ writer = pq.ParquetWriter(f.name, chunk.schema)
53
+ writer.write_table(chunk)
54
+ writer.close()
55
+
56
+ with open(f.name, "rb") as f_read:
57
+ self._blob(blob_path).upload_blob(f_read, overwrite=True)
58
+
59
+ os.remove(f.name)
60
+
43
61
 
44
62
  def get_df_update_time(self, blob_path: str) -> float:
45
63
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: luxorasap
3
- Version: 0.1.15
3
+ Version: 0.1.17
4
4
  Summary: Toolbox da Luxor para ingestão, análise e automação de dados financeiros.
5
5
  Author-email: Luxor Group <backoffice@luxor.com.br>
6
6
  License: Proprietary – All rights reserved
@@ -1,4 +1,4 @@
1
- luxorasap/__init__.py,sha256=lHZk7izy83rJh7Ij2oSrUOFc4wecgAttn7OMbkT94AA,1356
1
+ luxorasap/__init__.py,sha256=aPCQIYh22iaw5xRNSlLfrz65PJNvNMc4NXPrDfeLITs,1356
2
2
  luxorasap/btgapi/__init__.py,sha256=QUlfb5oiBY6K1Q5x4-a-x2wECe1At5wc2962I5odOJk,620
3
3
  luxorasap/btgapi/auth.py,sha256=PvyCtbEyBO2B1CIeAlNXWugKW1OgiKfPcVzS6K5FBnQ,1872
4
4
  luxorasap/btgapi/reports.py,sha256=ZVEMLoJPXc0r3XjPJPMsKQN0zZd1Npd7umNpAj1bncs,8040
@@ -6,16 +6,16 @@ luxorasap/btgapi/trades.py,sha256=956HZ9BvN9C_VQvKTyBLN0x6ZygwVqBZN11F7OnNbDI,59
6
6
  luxorasap/datareader/__init__.py,sha256=41RAvbrQ4R6oj67S32CrKqolx0CJ2W8cbOF6g5Cqm2g,120
7
7
  luxorasap/datareader/core.py,sha256=P8AjtRFRRmUrqjbjfKRb0wTLW2eHcUva8iWid4uh4PE,155123
8
8
  luxorasap/ingest/__init__.py,sha256=XhxDTN2ar-u6UCPhnxNU_to-nWiit-SpQ6cA_N9eMSs,795
9
- luxorasap/ingest/cloud/__init__.py,sha256=Hm-43YkjRhu3UiFVt1Zx7DmQuNJnK2GVWfCx1T3gKNc,2052
9
+ luxorasap/ingest/cloud/__init__.py,sha256=P4GSvfC4JFMbTSpevhfvbfyn-zqiBMIMWhc_U0mQCFc,2153
10
10
  luxorasap/ingest/legacy_local/dataloader.py,sha256=zKPhuiBSFwkuWN6d8g2s60KkbVk1R_1cGMCtQM9j-0c,11908
11
11
  luxorasap/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  luxorasap/utils/dataframe/__init__.py,sha256=dU_RwTTOi6F3mlhM-0MYWM_qexBN9BmmKc_yrDE1Lwc,207
13
13
  luxorasap/utils/dataframe/reader.py,sha256=Vzjdw-AeS1lnWEHQ8RZNh0kK93NWTp0NWVi_B6mN5N0,616
14
14
  luxorasap/utils/dataframe/transforms.py,sha256=Bm_cv9L9923QIXH82Fa_M4pM94f2AJRPu62Vv_i7tto,1684
15
15
  luxorasap/utils/storage/__init__.py,sha256=U3XRq94yzRp3kgBSUcRzs2tQgJ4o8h8a1ZzwiscA5XM,67
16
- luxorasap/utils/storage/blob.py,sha256=pcEixGxwXM9y5iPPpkX__ySWq0milghJGketYZlRL-0,3171
17
- luxorasap-0.1.15.dist-info/METADATA,sha256=klkzeKwjA2gyPqPqxeI2QqlBMgqYSbiYS2cDTOtN2gM,3804
18
- luxorasap-0.1.15.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
19
- luxorasap-0.1.15.dist-info/entry_points.txt,sha256=XFh-dOwUhlya9DmGvgookMI0ezyUJjcOvTIHDEYS44g,52
20
- luxorasap-0.1.15.dist-info/top_level.txt,sha256=9YOL6bUIpzY06XFBRkUW1e4rgB32Ds91fQPGwUEjxzU,10
21
- luxorasap-0.1.15.dist-info/RECORD,,
16
+ luxorasap/utils/storage/blob.py,sha256=MVGOXnZR62jJPNWIM8sH_-DF-WuxMFVlpmi1llfos78,3949
17
+ luxorasap-0.1.17.dist-info/METADATA,sha256=aqn2ND5T-_1YUIx1HuRWAxStin3ikanLYS0e9dTJ2F4,3804
18
+ luxorasap-0.1.17.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
19
+ luxorasap-0.1.17.dist-info/entry_points.txt,sha256=XFh-dOwUhlya9DmGvgookMI0ezyUJjcOvTIHDEYS44g,52
20
+ luxorasap-0.1.17.dist-info/top_level.txt,sha256=9YOL6bUIpzY06XFBRkUW1e4rgB32Ds91fQPGwUEjxzU,10
21
+ luxorasap-0.1.17.dist-info/RECORD,,