luxorasap 0.2.10__tar.gz → 0.2.12__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.
Files changed (39) hide show
  1. {luxorasap-0.2.10 → luxorasap-0.2.12}/PKG-INFO +1 -1
  2. {luxorasap-0.2.10 → luxorasap-0.2.12}/pyproject.toml +2 -2
  3. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/__init__.py +1 -1
  4. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/datareader/core.py +37 -25
  5. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap.egg-info/PKG-INFO +1 -1
  6. {luxorasap-0.2.10 → luxorasap-0.2.12}/README.md +0 -0
  7. {luxorasap-0.2.10 → luxorasap-0.2.12}/setup.cfg +0 -0
  8. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/btgapi/__init__.py +0 -0
  9. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/btgapi/auth.py +0 -0
  10. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/btgapi/reports.py +0 -0
  11. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/btgapi/trades.py +0 -0
  12. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/datareader/__init__.py +0 -0
  13. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/ingest/__init__.py +0 -0
  14. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/ingest/cloud/__init__.py +0 -0
  15. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/ingest/legacy_local/dataloader.py +0 -0
  16. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/utils/__init__.py +0 -0
  17. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/utils/dataframe/__init__.py +0 -0
  18. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/utils/dataframe/reader.py +0 -0
  19. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/utils/dataframe/transforms.py +0 -0
  20. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/utils/storage/__init__.py +0 -0
  21. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/utils/storage/blob.py +0 -0
  22. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/utils/storage/change_tracker.py +0 -0
  23. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/utils/tools/__init__.py +0 -0
  24. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap/utils/tools/excel.py +0 -0
  25. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap.egg-info/SOURCES.txt +0 -0
  26. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap.egg-info/dependency_links.txt +0 -0
  27. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap.egg-info/entry_points.txt +0 -0
  28. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap.egg-info/requires.txt +0 -0
  29. {luxorasap-0.2.10 → luxorasap-0.2.12}/src/luxorasap.egg-info/top_level.txt +0 -0
  30. {luxorasap-0.2.10 → luxorasap-0.2.12}/tests/test_btgapi_auth.py +0 -0
  31. {luxorasap-0.2.10 → luxorasap-0.2.12}/tests/test_btgapi_reports.py +0 -0
  32. {luxorasap-0.2.10 → luxorasap-0.2.12}/tests/test_btgapi_trades.py +0 -0
  33. {luxorasap-0.2.10 → luxorasap-0.2.12}/tests/test_datareader.py +0 -0
  34. {luxorasap-0.2.10 → luxorasap-0.2.12}/tests/test_ingest_cloud.py +0 -0
  35. {luxorasap-0.2.10 → luxorasap-0.2.12}/tests/test_ingest_legacy_local.py +0 -0
  36. {luxorasap-0.2.10 → luxorasap-0.2.12}/tests/test_utils_change_tracker.py +0 -0
  37. {luxorasap-0.2.10 → luxorasap-0.2.12}/tests/test_utils_dataframe.py +0 -0
  38. {luxorasap-0.2.10 → luxorasap-0.2.12}/tests/test_utils_storage.py +0 -0
  39. {luxorasap-0.2.10 → luxorasap-0.2.12}/tests/tests_utils_pickle_excel.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: luxorasap
3
- Version: 0.2.10
3
+ Version: 0.2.12
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
@@ -10,7 +10,7 @@ build-backend = "setuptools.build_meta"
10
10
  #############################
11
11
  [project]
12
12
  name = "luxorasap"
13
- version = "0.2.10"
13
+ version = "0.2.12"
14
14
  description = "Toolbox da Luxor para ingestão, análise e automação de dados financeiros."
15
15
  readme = "README.md"
16
16
  requires-python = ">=3.9"
@@ -78,7 +78,7 @@ exclude = ["tests*"]
78
78
  # bumpver (sem-ver)
79
79
  #############################
80
80
  [tool.bumpver]
81
- current_version = "0.2.10"
81
+ current_version = "0.2.12"
82
82
  version_pattern = "MAJOR.MINOR.PATCH"
83
83
 
84
84
  # regex explícito – obrigatório no bumpver 2024+
@@ -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.2.10"
16
+ __version__ = "0.2.12"
17
17
 
18
18
  # ─── Lazy loader ─────────────────────────────────────────────────
19
19
  def __getattr__(name: str) -> ModuleType:
@@ -156,7 +156,6 @@ class LuxorQuery:
156
156
 
157
157
 
158
158
  def __load_table(self, table_name, index=False, index_name="index", dtypes_override={}, auto_convert_mapped_types=True):
159
-
160
159
  def __load_parquet(table_name):
161
160
  table_path = f"{self.blob_directory}/{table_name}.parquet"#self.tables_path/"parquet"/f"{table_name}.parquet"
162
161
 
@@ -1911,7 +1910,12 @@ class LuxorQuery:
1911
1910
  .fillna(0)+1).reset_index()
1912
1911
 
1913
1912
  us_margin_cost = self.get_prices("sofr + 75bps", period="60m", currency=currency, usdbrl_ticker=usdbrl_ticker)
1914
- us_margin_cost["Date"] = us_margin_cost["Date"].dt.date
1913
+ try:
1914
+ us_margin_cost["Date"] = us_margin_cost["Date"].dt.date
1915
+ except AttributeError:
1916
+ logging.info(f'Erro ao converter usd_margin_cost para date. currency:{currency}, usdbrl_ticker:{usdbrl_ticker}\
1917
+ {us_margin_cost.dtypes}')
1918
+
1915
1919
  us_margin_cost = (us_margin_cost[["Date", "Last_Price"]]
1916
1920
  .rename(columns={"Last_Price":"us_margin_cost"})
1917
1921
  .set_index("Date").pct_change()
@@ -2156,28 +2160,34 @@ class LuxorQuery:
2156
2160
  types_to_recalculate = ['ndf usdbrl']
2157
2161
  # Separando os dados em dois grupos, para editar um deles
2158
2162
  df_exposure = df.query("Type.isin(@types_to_recalculate)").copy()
2159
-
2160
- df = df.query("~Type.isin(@types_to_recalculate)").copy()
2161
- # Calculo especifico para pnl do FX.
2162
- df_exposure["Total_Pnl"] = df_exposure["Pnl_Bought"] + df_exposure["Pnl_Sold"] \
2163
- + df_exposure["Pnl_Unchanged"]
2164
-
2165
- df_exposure = df_exposure.set_index(["Asset_ID"])
2166
- # Valor de mercado sera o PnL acumulado
2167
- df_exposure["Total_Pnl"] = df_exposure.groupby(["Asset_ID"])["Total_Pnl"].cumsum()
2168
- df_exposure = df_exposure.reset_index()
2169
- df_exposure["Close_Mkt_Value"] = df_exposure["Total_Pnl"]
2170
- df_exposure["Open_Mkt_Value"] = df_exposure["Close_Mkt_Value"].shift(1, fill_value=0)
2171
-
2172
- # Retirando qualquer possibilidade de impacto para aporte e resgate
2173
- df_exposure["Shares_Bought_Cost"] = 0
2174
- df_exposure["Amount_Sold"] = 0
2175
- # TODO Pensar o que vai mudar no caso de uma zeragem parcial
2176
- df_exposure = df_exposure.drop(columns="Total_Pnl")
2177
-
2178
-
2179
- # Juntando dfs novamente
2180
- df = pd.concat([df, df_exposure])
2163
+ if len(df_exposure) > 0:
2164
+ df = df.query("~Type.isin(@types_to_recalculate)").copy()
2165
+ # Calculo especifico para pnl do FX.
2166
+
2167
+ df_exposure["Pnl_Bought"] = df_exposure["Pnl_Bought"].astype('float')
2168
+ df_exposure["Pnl_Sold"] = df_exposure["Pnl_Sold"].astype('float')
2169
+ df_exposure["Pnl_Unchanged"] = df_exposure["Pnl_Unchanged"].astype('float')
2170
+
2171
+ df_exposure["Total_Pnl"] = df_exposure["Pnl_Bought"] + df_exposure["Pnl_Sold"] \
2172
+ + df_exposure["Pnl_Unchanged"]
2173
+
2174
+ df_exposure = df_exposure.set_index(["Asset_ID"])
2175
+ # Valor de mercado sera o PnL acumulado
2176
+
2177
+ df_exposure["Total_Pnl"] = df_exposure.groupby(["Asset_ID"])["Total_Pnl"].cumsum()
2178
+ df_exposure = df_exposure.reset_index()
2179
+ df_exposure["Close_Mkt_Value"] = df_exposure["Total_Pnl"]
2180
+ df_exposure["Open_Mkt_Value"] = df_exposure["Close_Mkt_Value"].shift(1, fill_value=0)
2181
+
2182
+ # Retirando qualquer possibilidade de impacto para aporte e resgate
2183
+ df_exposure["Shares_Bought_Cost"] = 0
2184
+ df_exposure["Amount_Sold"] = 0
2185
+ # TODO Pensar o que vai mudar no caso de uma zeragem parcial
2186
+ df_exposure = df_exposure.drop(columns="Total_Pnl")
2187
+
2188
+
2189
+ # Juntando dfs novamente
2190
+ df = pd.concat([df, df_exposure])
2181
2191
 
2182
2192
  # Calculando net de aporte e resgate por ativo
2183
2193
  df["Cash_Flow"] = abs(df["Shares_Bought_Cost"]) + -abs(df["Amount_Sold"])
@@ -2237,10 +2247,12 @@ class LuxorQuery:
2237
2247
  # Racional: Resgates rentabilizam no dia (ja estao no inicial)
2238
2248
  # Aportes rentabilizam no dia (nao estano no inicial)
2239
2249
  df["Open_AUM"] = df.reset_index().groupby("Today")["Open_Mkt_Value"].sum()
2240
- df["Open_AUM_Adjusted"] = (df["Open_AUM"] +
2250
+ df["Open_AUM_Adjusted"] = (df["Open_AUM"] +
2251
+
2241
2252
  df["Net_Subscriptions_Redemptions"]*(df["Net_Subscriptions_Redemptions"] > 0)
2242
2253
  )
2243
2254
 
2255
+ df["Open_AUM_Adjusted"] = df["Open_AUM_Adjusted"].fillna(0)
2244
2256
  df["Daily_Attribution"] = np.where(df["Open_AUM_Adjusted"] == 0,0, df["Daily_Pnl"] / df["Open_AUM_Adjusted"])
2245
2257
  df["Daily_Return"] = df.reset_index().groupby("Today")["Daily_Attribution"].sum()
2246
2258
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: luxorasap
3
- Version: 0.2.10
3
+ Version: 0.2.12
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
File without changes
File without changes