Commit
·
b77b6a6
1
Parent(s):
c7370ec
updating dashboards with new data
Browse files- data/all_trades_profitability.parquet +2 -2
- data/all_trades_profitability_bak.parquet +3 -0
- data/daily_info.parquet +2 -2
- data/error_by_markets.parquet +2 -2
- data/invalid_trades.parquet +2 -2
- data/service_map.pkl +2 -2
- data/tools_accuracy.csv +2 -2
- data/unknown_traders.parquet +2 -2
- data/winning_df.parquet +2 -2
- scripts/active_traders.py +91 -0
- scripts/daily_data.py +1 -0
- scripts/get_mech_info.py +5 -62
- scripts/markets.py +72 -2
- scripts/profitability.py +23 -16
- scripts/pull_data.py +8 -4
- scripts/staking.py +19 -14
data/all_trades_profitability.parquet
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:
|
3 |
-
size
|
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:6a9fa6fcb351f21334b3a79194c82d9b344be2549d7cd9398c3dea84646291dc
|
3 |
+
size 11576111
|
data/all_trades_profitability_bak.parquet
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:ebdebf4884de2bb27a71c4d5144a6dad8f5f5c6f2675ac3b12993c4240b0e2de
|
3 |
+
size 7910144
|
data/daily_info.parquet
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:
|
3 |
-
size
|
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:dafbb1cf7614f3040c27aeb6f130e19068e9ca56159ed21a584abd4a925db977
|
3 |
+
size 566350
|
data/error_by_markets.parquet
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:
|
3 |
-
size
|
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:026835121a261b46a391e397160f878413bd1f337903324bb1cd6ef88bc2d90c
|
3 |
+
size 12990
|
data/invalid_trades.parquet
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:
|
3 |
-
size
|
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:8a47b04bfae501edb6051f0089117b51fc96cdb4eeb4ad5ef3ebfbcd7ee19590
|
3 |
+
size 755966
|
data/service_map.pkl
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:
|
3 |
-
size
|
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:da35d7c845c32bc90c5f298210458dfa01b8745bf95bd23b62a49c044ca06ac7
|
3 |
+
size 167913
|
data/tools_accuracy.csv
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:
|
3 |
-
size
|
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:3a26951af78022999c8651278aff7a96ed271a6d325907096982b5333a7af7b7
|
3 |
+
size 1099
|
data/unknown_traders.parquet
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:
|
3 |
-
size
|
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:cd2aa16659f93661ac3e9744f55ba17d921bf5f65c843a60f01232dd587254bf
|
3 |
+
size 365566
|
data/winning_df.parquet
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:
|
3 |
-
size
|
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:10f727eac679040aa5f1dc1856580010c315b3f72810cdbcaa6175f5a8343c0e
|
3 |
+
size 12528
|
scripts/active_traders.py
ADDED
@@ -0,0 +1,91 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import pandas as pd
|
2 |
+
import pickle
|
3 |
+
from web3_utils import DATA_DIR, TMP_DIR
|
4 |
+
from staking import check_list_addresses
|
5 |
+
|
6 |
+
|
7 |
+
def get_trader_type(address: str, service_map: dict) -> str:
|
8 |
+
# check if it is part of any service id on the map
|
9 |
+
keys = service_map.keys()
|
10 |
+
last_key = max(keys)
|
11 |
+
|
12 |
+
for key, value in service_map.items():
|
13 |
+
if value["safe_address"].lower() == address.lower():
|
14 |
+
# found a service
|
15 |
+
return "Olas"
|
16 |
+
|
17 |
+
return "non_Olas"
|
18 |
+
|
19 |
+
|
20 |
+
def compute_active_traders_dataset():
|
21 |
+
"""Function to prepare the active traders dataset"""
|
22 |
+
with open(DATA_DIR / "service_map.pkl", "rb") as f:
|
23 |
+
service_map = pickle.load(f)
|
24 |
+
# read tools info
|
25 |
+
tools_df = pd.read_parquet(TMP_DIR / "tools.parquet")
|
26 |
+
# rename the request_month_year_week
|
27 |
+
tools_df.rename(
|
28 |
+
columns={"request_month_year_week": "month_year_week"}, inplace=True
|
29 |
+
)
|
30 |
+
tool_traders = tools_df.trader_address.unique()
|
31 |
+
mapping = check_list_addresses(tool_traders)
|
32 |
+
# add trader type to tools_df
|
33 |
+
tools_df["trader_type"] = tools_df.trader_address.apply(lambda x: mapping[x])
|
34 |
+
tools_df = tools_df[
|
35 |
+
["month_year_week", "market_creator", "trader_type", "trader_address"]
|
36 |
+
]
|
37 |
+
tools_df.drop_duplicates(inplace=True)
|
38 |
+
# read trades info
|
39 |
+
all_trades = pd.read_parquet(DATA_DIR / "all_trades_profitability.parquet")
|
40 |
+
|
41 |
+
# read unknown info
|
42 |
+
unknown_traders = pd.read_parquet(DATA_DIR / "unknown_traders.parquet")
|
43 |
+
unknown_traders["creation_timestamp"] = pd.to_datetime(
|
44 |
+
unknown_traders["creation_timestamp"]
|
45 |
+
)
|
46 |
+
unknown_traders["creation_timestamp"] = unknown_traders[
|
47 |
+
"creation_timestamp"
|
48 |
+
].dt.tz_convert("UTC")
|
49 |
+
unknown_traders = unknown_traders.sort_values(
|
50 |
+
by="creation_timestamp", ascending=True
|
51 |
+
)
|
52 |
+
unknown_traders["month_year_week"] = (
|
53 |
+
unknown_traders["creation_timestamp"]
|
54 |
+
.dt.to_period("W")
|
55 |
+
.dt.start_time.dt.strftime("%b-%d-%Y")
|
56 |
+
)
|
57 |
+
unknown_traders["trader_type"] = "unknown"
|
58 |
+
unknown_traders = unknown_traders[
|
59 |
+
["month_year_week", "trader_type", "market_creator", "trader_address"]
|
60 |
+
]
|
61 |
+
unknown_traders.drop_duplicates(inplace=True)
|
62 |
+
|
63 |
+
all_trades["creation_timestamp"] = pd.to_datetime(all_trades["creation_timestamp"])
|
64 |
+
all_trades["creation_timestamp"] = all_trades["creation_timestamp"].dt.tz_convert(
|
65 |
+
"UTC"
|
66 |
+
)
|
67 |
+
all_trades = all_trades.sort_values(by="creation_timestamp", ascending=True)
|
68 |
+
all_trades["month_year_week"] = (
|
69 |
+
all_trades["creation_timestamp"]
|
70 |
+
.dt.to_period("W")
|
71 |
+
.dt.start_time.dt.strftime("%b-%d-%Y")
|
72 |
+
)
|
73 |
+
all_trades["trader_type"] = all_trades["staking"].apply(
|
74 |
+
lambda x: "non_Olas" if x == "non_Olas" else "Olas"
|
75 |
+
)
|
76 |
+
all_trades = all_trades[
|
77 |
+
["month_year_week", "market_creator", "trader_type", "trader_address"]
|
78 |
+
]
|
79 |
+
all_trades.drop_duplicates(inplace=True)
|
80 |
+
filtered_traders_data = pd.concat([all_trades, tools_df], axis=0)
|
81 |
+
filtered_traders_data.drop_duplicates(inplace=True)
|
82 |
+
if len(unknown_traders) > 0:
|
83 |
+
# merge
|
84 |
+
filtered_traders_data = pd.concat(
|
85 |
+
[filtered_traders_data, unknown_traders], axis=0
|
86 |
+
)
|
87 |
+
filtered_traders_data.to_parquet(TMP_DIR / "active_traders.parquet")
|
88 |
+
|
89 |
+
|
90 |
+
if __name__ == "__main__":
|
91 |
+
compute_active_traders_dataset()
|
scripts/daily_data.py
CHANGED
@@ -58,3 +58,4 @@ def prepare_live_metrics(
|
|
58 |
|
59 |
if __name__ == "__main__":
|
60 |
prepare_live_metrics()
|
|
|
|
58 |
|
59 |
if __name__ == "__main__":
|
60 |
prepare_live_metrics()
|
61 |
+
# generate_retention_activity_file()
|
scripts/get_mech_info.py
CHANGED
@@ -117,63 +117,6 @@ def update_json_files():
|
|
117 |
merge_json_files("tools_info.json", "new_tools_info.json")
|
118 |
|
119 |
|
120 |
-
def update_fpmmTrades_parquet(trades_filename: str) -> pd.DataFrame:
|
121 |
-
# Read old trades parquet file
|
122 |
-
try:
|
123 |
-
old_trades_df = pd.read_parquet(TMP_DIR / "fpmmTrades.parquet")
|
124 |
-
except Exception as e:
|
125 |
-
print(f"Error reading old trades parquet file {e}")
|
126 |
-
return None
|
127 |
-
|
128 |
-
try:
|
129 |
-
new_trades_df = pd.read_parquet(DATA_DIR / trades_filename)
|
130 |
-
except Exception as e:
|
131 |
-
print(f"Error reading new trades parquet file {e}")
|
132 |
-
return None
|
133 |
-
|
134 |
-
# lowercase and strip creator_address
|
135 |
-
new_trades_df["trader_address"] = (
|
136 |
-
new_trades_df["trader_address"].str.lower().str.strip()
|
137 |
-
)
|
138 |
-
# ensure creationTimestamp compatibility
|
139 |
-
try:
|
140 |
-
new_trades_df["creationTimestamp"] = new_trades_df["creationTimestamp"].apply(
|
141 |
-
lambda x: transform_to_datetime(x)
|
142 |
-
)
|
143 |
-
|
144 |
-
except Exception as e:
|
145 |
-
print(f"Transformation not needed")
|
146 |
-
try:
|
147 |
-
old_trades_df["creationTimestamp"] = old_trades_df["creationTimestamp"].apply(
|
148 |
-
lambda x: transform_to_datetime(x)
|
149 |
-
)
|
150 |
-
except Exception as e:
|
151 |
-
print(f"Transformation not needed")
|
152 |
-
|
153 |
-
# merge two dataframes
|
154 |
-
merge_df = pd.concat([old_trades_df, new_trades_df], ignore_index=True)
|
155 |
-
# avoid numpy objects
|
156 |
-
merge_df["fpmm.arbitrationOccurred"] = merge_df["fpmm.arbitrationOccurred"].astype(
|
157 |
-
bool
|
158 |
-
)
|
159 |
-
merge_df["fpmm.isPendingArbitration"] = merge_df[
|
160 |
-
"fpmm.isPendingArbitration"
|
161 |
-
].astype(bool)
|
162 |
-
|
163 |
-
# Check for duplicates
|
164 |
-
print(f"Initial length before removing duplicates in fpmmTrades= {len(merge_df)}")
|
165 |
-
|
166 |
-
# Remove duplicates
|
167 |
-
# fpmm.outcomes is a numpy array
|
168 |
-
merge_df.drop_duplicates("id", keep="last", inplace=True)
|
169 |
-
print(f"Final length after removing duplicates in fpmmTrades= {len(merge_df)}")
|
170 |
-
|
171 |
-
# save the parquet file
|
172 |
-
merge_df.to_parquet(TMP_DIR / "fpmmTrades.parquet", index=False)
|
173 |
-
|
174 |
-
return
|
175 |
-
|
176 |
-
|
177 |
def update_all_trades_parquet(new_trades_df: pd.DataFrame) -> pd.DataFrame:
|
178 |
# Read old all_trades parquet file
|
179 |
try:
|
@@ -315,11 +258,11 @@ def get_mech_events_since_last_run(logger):
|
|
315 |
# Read the latest date from stored data
|
316 |
try:
|
317 |
all_trades = pd.read_parquet(DATA_DIR / "all_trades_profitability.parquet")
|
318 |
-
latest_timestamp = max(all_trades.creation_timestamp)
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
print(f"Updating data since {latest_timestamp}")
|
324 |
except Exception:
|
325 |
print("Error while reading the profitability parquet file")
|
|
|
117 |
merge_json_files("tools_info.json", "new_tools_info.json")
|
118 |
|
119 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
120 |
def update_all_trades_parquet(new_trades_df: pd.DataFrame) -> pd.DataFrame:
|
121 |
# Read old all_trades parquet file
|
122 |
try:
|
|
|
258 |
# Read the latest date from stored data
|
259 |
try:
|
260 |
all_trades = pd.read_parquet(DATA_DIR / "all_trades_profitability.parquet")
|
261 |
+
# latest_timestamp = max(all_trades.creation_timestamp)
|
262 |
+
cutoff_date = "2025-01-13"
|
263 |
+
latest_timestamp = pd.Timestamp(
|
264 |
+
datetime.strptime(cutoff_date, "%Y-%m-%d")
|
265 |
+
).tz_localize("UTC")
|
266 |
print(f"Updating data since {latest_timestamp}")
|
267 |
except Exception:
|
268 |
print("Error while reading the profitability parquet file")
|
scripts/markets.py
CHANGED
@@ -357,7 +357,7 @@ def fpmmTrades_etl(
|
|
357 |
# lowercase and strip creator_address
|
358 |
fpmmTrades["trader_address"] = fpmmTrades["trader_address"].str.lower().str.strip()
|
359 |
fpmmTrades.to_parquet(DATA_DIR / trades_filename, index=False)
|
360 |
-
return
|
361 |
|
362 |
|
363 |
def check_current_week_data(trades_df: pd.DataFrame) -> pd.DataFrame:
|
@@ -390,5 +390,75 @@ def check_current_week_data(trades_df: pd.DataFrame) -> pd.DataFrame:
|
|
390 |
return trades_df
|
391 |
|
392 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
393 |
if __name__ == "__main__":
|
394 |
-
|
|
|
|
357 |
# lowercase and strip creator_address
|
358 |
fpmmTrades["trader_address"] = fpmmTrades["trader_address"].str.lower().str.strip()
|
359 |
fpmmTrades.to_parquet(DATA_DIR / trades_filename, index=False)
|
360 |
+
return fpmmTrades
|
361 |
|
362 |
|
363 |
def check_current_week_data(trades_df: pd.DataFrame) -> pd.DataFrame:
|
|
|
390 |
return trades_df
|
391 |
|
392 |
|
393 |
+
def update_fpmmTrades_parquet(trades_filename: str) -> pd.DataFrame:
|
394 |
+
# Read old trades parquet file
|
395 |
+
try:
|
396 |
+
old_trades_df = pd.read_parquet(TMP_DIR / "fpmmTrades.parquet")
|
397 |
+
except Exception as e:
|
398 |
+
print(f"Error reading old trades parquet file {e}")
|
399 |
+
return None
|
400 |
+
|
401 |
+
try:
|
402 |
+
new_trades_df = pd.read_parquet(DATA_DIR / trades_filename)
|
403 |
+
except Exception as e:
|
404 |
+
print(f"Error reading new trades parquet file {e}")
|
405 |
+
return None
|
406 |
+
|
407 |
+
# lowercase and strip creator_address
|
408 |
+
new_trades_df["trader_address"] = (
|
409 |
+
new_trades_df["trader_address"].str.lower().str.strip()
|
410 |
+
)
|
411 |
+
# ensure creationTimestamp compatibility
|
412 |
+
try:
|
413 |
+
new_trades_df["creationTimestamp"] = new_trades_df["creationTimestamp"].apply(
|
414 |
+
lambda x: transform_to_datetime(x)
|
415 |
+
)
|
416 |
+
|
417 |
+
except Exception as e:
|
418 |
+
print(f"Transformation not needed")
|
419 |
+
try:
|
420 |
+
old_trades_df["creationTimestamp"] = old_trades_df["creationTimestamp"].apply(
|
421 |
+
lambda x: transform_to_datetime(x)
|
422 |
+
)
|
423 |
+
except Exception as e:
|
424 |
+
print(f"Transformation not needed")
|
425 |
+
|
426 |
+
# merge two dataframes
|
427 |
+
merge_df = pd.concat([old_trades_df, new_trades_df], ignore_index=True)
|
428 |
+
# avoid numpy objects
|
429 |
+
merge_df["fpmm.arbitrationOccurred"] = merge_df["fpmm.arbitrationOccurred"].astype(
|
430 |
+
bool
|
431 |
+
)
|
432 |
+
merge_df["fpmm.isPendingArbitration"] = merge_df[
|
433 |
+
"fpmm.isPendingArbitration"
|
434 |
+
].astype(bool)
|
435 |
+
|
436 |
+
# Check for duplicates
|
437 |
+
print(f"Initial length before removing duplicates in fpmmTrades= {len(merge_df)}")
|
438 |
+
|
439 |
+
# Remove duplicates
|
440 |
+
# fpmm.outcomes is a numpy array
|
441 |
+
merge_df.drop_duplicates("id", keep="last", inplace=True)
|
442 |
+
print(f"Final length after removing duplicates in fpmmTrades= {len(merge_df)}")
|
443 |
+
|
444 |
+
# save the parquet file
|
445 |
+
merge_df.to_parquet(TMP_DIR / "fpmmTrades.parquet", index=False)
|
446 |
+
|
447 |
+
return
|
448 |
+
|
449 |
+
|
450 |
+
def update_fpmmTrades(from_date: str):
|
451 |
+
|
452 |
+
from_timestamp = pd.Timestamp(datetime.strptime(from_date, "%Y-%m-%d")).tz_localize(
|
453 |
+
"UTC"
|
454 |
+
)
|
455 |
+
fpmmTrades_etl(
|
456 |
+
trades_filename="new_fpmmTrades.parquet",
|
457 |
+
from_timestamp=int(from_timestamp.timestamp()),
|
458 |
+
)
|
459 |
+
update_fpmmTrades_parquet("new_fpmmTrades.parquet")
|
460 |
+
|
461 |
+
|
462 |
if __name__ == "__main__":
|
463 |
+
cutoff_date = "2025-01-13"
|
464 |
+
update_fpmmTrades(cutoff_date)
|
scripts/profitability.py
CHANGED
@@ -37,6 +37,7 @@ from utils import (
|
|
37 |
DATA_DIR,
|
38 |
DEFAULT_MECH_FEE,
|
39 |
TMP_DIR,
|
|
|
40 |
)
|
41 |
from staking import label_trades_by_staking
|
42 |
from nr_mech_calls import (
|
@@ -141,13 +142,16 @@ def _is_redeemed(user_json: dict[str, Any], fpmmTrade: dict[str, Any]) -> bool:
|
|
141 |
def prepare_profitalibity_data(
|
142 |
tools_filename: str,
|
143 |
trades_filename: str,
|
|
|
144 |
) -> pd.DataFrame:
|
145 |
"""Prepare data for profitalibity analysis."""
|
146 |
|
147 |
# Check if tools.parquet is in the same directory
|
148 |
try:
|
149 |
-
|
150 |
-
|
|
|
|
|
151 |
|
152 |
# make sure creator_address is in the columns
|
153 |
assert "trader_address" in tools.columns, "trader_address column not found"
|
@@ -167,9 +171,12 @@ def prepare_profitalibity_data(
|
|
167 |
# Check if fpmmTrades.parquet is in the same directory
|
168 |
print("Reading the new trades file")
|
169 |
try:
|
170 |
-
|
|
|
|
|
|
|
171 |
except FileNotFoundError:
|
172 |
-
print(f"Error reading {trades_filename} file
|
173 |
|
174 |
# make sure trader_address is in the columns
|
175 |
assert "trader_address" in fpmmTrades.columns, "trader_address column not found"
|
@@ -352,16 +359,18 @@ def analyse_all_traders(
|
|
352 |
return all_creators_df
|
353 |
|
354 |
|
|
|
355 |
def run_profitability_analysis(
|
356 |
tools_filename: str,
|
357 |
trades_filename: str,
|
358 |
merge: bool = False,
|
|
|
359 |
):
|
360 |
"""Create all trades analysis."""
|
361 |
-
|
362 |
-
# load dfs from data folder for analysis
|
363 |
print(f"Preparing data with {tools_filename} and {trades_filename}")
|
364 |
-
fpmmTrades = prepare_profitalibity_data(
|
|
|
|
|
365 |
|
366 |
if merge:
|
367 |
update_tools_parquet(tools_filename)
|
@@ -391,6 +400,7 @@ def run_profitability_analysis(
|
|
391 |
|
392 |
# debugging purposes
|
393 |
all_trades_df.to_parquet(JSON_DATA_DIR / "all_trades_df.parquet", index=False)
|
|
|
394 |
|
395 |
# filter invalid markets. Condition: "is_invalid" is True
|
396 |
invalid_trades = all_trades_df.loc[all_trades_df["is_invalid"] == True]
|
@@ -512,12 +522,9 @@ def add_trades_profitability(trades_filename: str):
|
|
512 |
|
513 |
|
514 |
if __name__ == "__main__":
|
515 |
-
|
516 |
-
|
517 |
-
|
518 |
-
|
519 |
-
|
520 |
-
|
521 |
-
# all_trades_df = analyse_all_traders(fpmmTrades, trade_mech_calls)
|
522 |
-
# all_trades_df.to_parquet(TMP_DIR / "all_trades_df.parquet", index=False)
|
523 |
-
run_profitability_analysis("file1", "file2")
|
|
|
37 |
DATA_DIR,
|
38 |
DEFAULT_MECH_FEE,
|
39 |
TMP_DIR,
|
40 |
+
measure_execution_time,
|
41 |
)
|
42 |
from staking import label_trades_by_staking
|
43 |
from nr_mech_calls import (
|
|
|
142 |
def prepare_profitalibity_data(
|
143 |
tools_filename: str,
|
144 |
trades_filename: str,
|
145 |
+
tmp_dir: bool = False,
|
146 |
) -> pd.DataFrame:
|
147 |
"""Prepare data for profitalibity analysis."""
|
148 |
|
149 |
# Check if tools.parquet is in the same directory
|
150 |
try:
|
151 |
+
if tmp_dir:
|
152 |
+
tools = pd.read_parquet(TMP_DIR / tools_filename)
|
153 |
+
else:
|
154 |
+
tools = pd.read_parquet(DATA_DIR / tools_filename)
|
155 |
|
156 |
# make sure creator_address is in the columns
|
157 |
assert "trader_address" in tools.columns, "trader_address column not found"
|
|
|
171 |
# Check if fpmmTrades.parquet is in the same directory
|
172 |
print("Reading the new trades file")
|
173 |
try:
|
174 |
+
if tmp_dir:
|
175 |
+
fpmmTrades = pd.read_parquet(TMP_DIR / trades_filename)
|
176 |
+
else:
|
177 |
+
fpmmTrades = pd.read_parquet(DATA_DIR / trades_filename)
|
178 |
except FileNotFoundError:
|
179 |
+
print(f"Error reading {trades_filename} file.")
|
180 |
|
181 |
# make sure trader_address is in the columns
|
182 |
assert "trader_address" in fpmmTrades.columns, "trader_address column not found"
|
|
|
359 |
return all_creators_df
|
360 |
|
361 |
|
362 |
+
@measure_execution_time
|
363 |
def run_profitability_analysis(
|
364 |
tools_filename: str,
|
365 |
trades_filename: str,
|
366 |
merge: bool = False,
|
367 |
+
tmp_dir: bool = False,
|
368 |
):
|
369 |
"""Create all trades analysis."""
|
|
|
|
|
370 |
print(f"Preparing data with {tools_filename} and {trades_filename}")
|
371 |
+
fpmmTrades = prepare_profitalibity_data(
|
372 |
+
tools_filename, trades_filename, tmp_dir=tmp_dir
|
373 |
+
)
|
374 |
|
375 |
if merge:
|
376 |
update_tools_parquet(tools_filename)
|
|
|
400 |
|
401 |
# debugging purposes
|
402 |
all_trades_df.to_parquet(JSON_DATA_DIR / "all_trades_df.parquet", index=False)
|
403 |
+
# all_trades_df = pd.read_parquet(JSON_DATA_DIR / "all_trades_df.parquet")
|
404 |
|
405 |
# filter invalid markets. Condition: "is_invalid" is True
|
406 |
invalid_trades = all_trades_df.loc[all_trades_df["is_invalid"] == True]
|
|
|
522 |
|
523 |
|
524 |
if __name__ == "__main__":
|
525 |
+
run_profitability_analysis(
|
526 |
+
tools_filename="tools.parquet",
|
527 |
+
trades_filename="fpmmTrades.parquet",
|
528 |
+
merge=False,
|
529 |
+
tmp_dir=True,
|
530 |
+
)
|
|
|
|
|
|
scripts/pull_data.py
CHANGED
@@ -1,8 +1,13 @@
|
|
1 |
import logging
|
2 |
from datetime import datetime
|
3 |
import pandas as pd
|
4 |
-
from markets import
|
5 |
-
|
|
|
|
|
|
|
|
|
|
|
6 |
from profitability import run_profitability_analysis, add_trades_profitability
|
7 |
from utils import (
|
8 |
get_question,
|
@@ -15,7 +20,6 @@ from utils import (
|
|
15 |
)
|
16 |
from get_mech_info import (
|
17 |
get_mech_events_since_last_run,
|
18 |
-
update_fpmmTrades_parquet,
|
19 |
update_json_files,
|
20 |
)
|
21 |
from update_tools_accuracy import compute_tools_accuracy
|
@@ -131,7 +135,7 @@ def only_new_weekly_analysis():
|
|
131 |
|
132 |
save_historical_data()
|
133 |
try:
|
134 |
-
clean_old_data_from_parquet_files("2024-11-
|
135 |
except Exception as e:
|
136 |
print("Error cleaning the oldest information from parquet files")
|
137 |
print(f"reason = {e}")
|
|
|
1 |
import logging
|
2 |
from datetime import datetime
|
3 |
import pandas as pd
|
4 |
+
from markets import (
|
5 |
+
etl as mkt_etl,
|
6 |
+
DEFAULT_FILENAME as MARKETS_FILENAME,
|
7 |
+
fpmmTrades_etl,
|
8 |
+
update_fpmmTrades_parquet,
|
9 |
+
)
|
10 |
+
from tools import generate_tools_file
|
11 |
from profitability import run_profitability_analysis, add_trades_profitability
|
12 |
from utils import (
|
13 |
get_question,
|
|
|
20 |
)
|
21 |
from get_mech_info import (
|
22 |
get_mech_events_since_last_run,
|
|
|
23 |
update_json_files,
|
24 |
)
|
25 |
from update_tools_accuracy import compute_tools_accuracy
|
|
|
135 |
|
136 |
save_historical_data()
|
137 |
try:
|
138 |
+
clean_old_data_from_parquet_files("2024-11-26")
|
139 |
except Exception as e:
|
140 |
print("Error cleaning the oldest information from parquet files")
|
141 |
print(f"reason = {e}")
|
scripts/staking.py
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
import json
|
2 |
import sys
|
3 |
from typing import Any, List
|
4 |
-
from utils import RPC, DATA_DIR, TMP_DIR
|
5 |
import requests
|
6 |
from tqdm import tqdm
|
7 |
from web3 import Web3
|
@@ -148,6 +148,7 @@ def update_service_map(start: int = 1, end: int = 2000):
|
|
148 |
if partial_dict:
|
149 |
service_map.update(partial_dict)
|
150 |
|
|
|
151 |
with open(DATA_DIR / "service_map.pkl", "wb") as f:
|
152 |
pickle.dump(service_map, f)
|
153 |
|
@@ -223,6 +224,7 @@ def generate_retention_activity_file():
|
|
223 |
]
|
224 |
print(f"length of reduced tools before labeling = {len(reduced_tools_df)}")
|
225 |
reduced_tools_df = label_trades_by_staking(trades_df=reduced_tools_df)
|
|
|
226 |
print(f"length of reduced tools after labeling = {len(reduced_tools_df)}")
|
227 |
reduced_tools_df = reduced_tools_df.sort_values(by="request_time", ascending=True)
|
228 |
reduced_tools_df["month_year_week"] = (
|
@@ -246,17 +248,20 @@ def check_list_addresses(address_list: list):
|
|
246 |
print(f"last service key = {last_key}")
|
247 |
update_service_map(start=last_key)
|
248 |
found_key = -1
|
|
|
249 |
for trader_address in address_list:
|
250 |
for key, value in service_map.items():
|
251 |
if value["safe_address"].lower() == trader_address.lower():
|
252 |
# found a service
|
253 |
found_key = key
|
254 |
mapping[trader_address] = "Olas"
|
|
|
|
|
255 |
|
256 |
if found_key == -1:
|
257 |
mapping[trader_address] = "non_Olas"
|
258 |
-
|
259 |
-
|
260 |
|
261 |
|
262 |
def check_service_map():
|
@@ -278,20 +283,20 @@ def check_service_map():
|
|
278 |
|
279 |
if __name__ == "__main__":
|
280 |
# create_service_map()
|
281 |
-
|
282 |
-
|
283 |
|
284 |
-
|
285 |
-
|
286 |
# trades_df.to_parquet(TMP_DIR / "result_staking.parquet", index=False)
|
287 |
# generate_retention_activity_file()
|
288 |
-
a_list = [
|
289 |
-
|
290 |
-
|
291 |
-
]
|
292 |
# check_list_addresses(address_list=a_list)
|
293 |
# update_service_map()
|
294 |
# check_service_map()
|
295 |
-
unknown_traders = pd.read_parquet(DATA_DIR / "unknown_traders.parquet")
|
296 |
-
unknown_traders = label_trades_by_staking(trades_df=unknown_traders)
|
297 |
-
unknown_traders.to_parquet(DATA_DIR / "unknown_traders.parquet", index=False)
|
|
|
1 |
import json
|
2 |
import sys
|
3 |
from typing import Any, List
|
4 |
+
from utils import RPC, DATA_DIR, TMP_DIR, JSON_DATA_DIR
|
5 |
import requests
|
6 |
from tqdm import tqdm
|
7 |
from web3 import Web3
|
|
|
148 |
if partial_dict:
|
149 |
service_map.update(partial_dict)
|
150 |
|
151 |
+
print(f"length of service map {len(service_map)}")
|
152 |
with open(DATA_DIR / "service_map.pkl", "wb") as f:
|
153 |
pickle.dump(service_map, f)
|
154 |
|
|
|
224 |
]
|
225 |
print(f"length of reduced tools before labeling = {len(reduced_tools_df)}")
|
226 |
reduced_tools_df = label_trades_by_staking(trades_df=reduced_tools_df)
|
227 |
+
print(f"labeling of tools activity. {reduced_tools_df.staking.value_counts()}")
|
228 |
print(f"length of reduced tools after labeling = {len(reduced_tools_df)}")
|
229 |
reduced_tools_df = reduced_tools_df.sort_values(by="request_time", ascending=True)
|
230 |
reduced_tools_df["month_year_week"] = (
|
|
|
248 |
print(f"last service key = {last_key}")
|
249 |
update_service_map(start=last_key)
|
250 |
found_key = -1
|
251 |
+
trader_types = []
|
252 |
for trader_address in address_list:
|
253 |
for key, value in service_map.items():
|
254 |
if value["safe_address"].lower() == trader_address.lower():
|
255 |
# found a service
|
256 |
found_key = key
|
257 |
mapping[trader_address] = "Olas"
|
258 |
+
trader_types.append("Olas")
|
259 |
+
break
|
260 |
|
261 |
if found_key == -1:
|
262 |
mapping[trader_address] = "non_Olas"
|
263 |
+
trader_types.append("non_Olas")
|
264 |
+
return mapping
|
265 |
|
266 |
|
267 |
def check_service_map():
|
|
|
283 |
|
284 |
if __name__ == "__main__":
|
285 |
# create_service_map()
|
286 |
+
trades_df = pd.read_parquet(JSON_DATA_DIR / "all_trades_df.parquet")
|
287 |
+
trades_df = trades_df.loc[trades_df["is_invalid"] == False]
|
288 |
|
289 |
+
trades_df = label_trades_by_staking(trades_df=trades_df)
|
290 |
+
print(trades_df.staking.value_counts())
|
291 |
# trades_df.to_parquet(TMP_DIR / "result_staking.parquet", index=False)
|
292 |
# generate_retention_activity_file()
|
293 |
+
# a_list = [
|
294 |
+
# "0x027592700fafc4db3221bb662d7bdc7f546a2bb5",
|
295 |
+
# "0x0845f4ad01a2f41da618848c7a9e56b64377965e",
|
296 |
+
# ]
|
297 |
# check_list_addresses(address_list=a_list)
|
298 |
# update_service_map()
|
299 |
# check_service_map()
|
300 |
+
# unknown_traders = pd.read_parquet(DATA_DIR / "unknown_traders.parquet")
|
301 |
+
# unknown_traders = label_trades_by_staking(trades_df=unknown_traders)
|
302 |
+
# unknown_traders.to_parquet(DATA_DIR / "unknown_traders.parquet", index=False)
|