windowdog 1 month ago
parent
commit
27537bf146

+ 20 - 6
src/code/handle_dune_py/001_merge_top20_holders_add.py → src/code/handle_dune_py/001_merge_top20_holders_add_dune.py

@@ -3,10 +3,13 @@
 import pandas as pd
 import sys
 import os
- 
+import time
 
 arr_file = []
 merged_df = None
+ 
+def makeurl( url,url_show):
+    return '=HYPERLINK("{}","{}")'.format(url,  url_show)
 
 def map_exclude_df(df1,ex_df):
   
@@ -31,6 +34,8 @@ def merge_df_fun():
     
     global arr_file , merged_df , domains_df,token_add
     for index, file in enumerate(arr_file):
+        date_range = file.replace(".csv","").split("_")
+        date_range = date_range[-1]
                
         cur_df =   pd.read_csv(file ,dtype=object)
         cur_df=cur_df.dropna(subset=['holder_owner'])
@@ -38,11 +43,13 @@ def merge_df_fun():
         cur_df =cur_df.astype({
             "amount_M":float,
         })
+        cur_df =cur_df.round(1)
+        cur_df["belong_date"] =date_range
 
 
         cur_df=cur_df.sort_values(by=['amount_M'],ascending = False)
         cur_df =cur_df.head(22)
-        cur_df=cur_df[['holder_owner','domains_owned']]
+        cur_df=cur_df[['holder_owner','domains_owned','amount_M','belong_date']]
 
 
         if index==0 :
@@ -51,17 +58,24 @@ def merge_df_fun():
         merged_df = pd.concat([merged_df, cur_df])
   
     
-    merged_df =merged_df.drop_duplicates(subset=['holder_owner'])
+    # merged_df =merged_df.drop_duplicates(subset=['holder_owner'])
 
     ex_df = pd.read_csv('exclude_add.csv',dtype=object)
     merged_df=map_exclude_df(merged_df ,ex_df)
+    merged_df['is_dup'] = merged_df.duplicated(subset='holder_owner', keep=False).astype(int)
 
-    
-    merged_df.to_excel('001_top20_holders.xlsx', index=False)
+
+    merged_df["gmgn"] = merged_df.apply(lambda ser: makeurl(
+    f"https://gmgn.ai/sol/token/{token_add}?tab=activity&maker={ser['holder_owner']}" , "gmgn" ), axis=1)
+    merged_df["defined"] = merged_df.apply(lambda ser: makeurl(
+     f"https://www.defined.fi/sol/{token_add}?maker={ser['holder_owner']}" , "defined" ), axis=1)
+    merged_df["beizhu"] = None
+
+    merged_df.to_excel(f'001_top20_holders_{int(time.time())}.xlsx', index=False)
 
  
     
-
+token_add = '2ZoJVM15fbbDgo6s5cTTX2Sj8V4sJ47rimb7gQhGpump'
 if __name__ == "__main__":
  
  

+ 14 - 8
src/code/handle_gmgn_py/001_handle_json_top_trader_gmgn.py

@@ -1,6 +1,7 @@
 import pandas as pd
 import json
 import os
+import time
 arr_json_data = []
  
  
@@ -73,7 +74,8 @@ arr_store_keys = [
         "avg_cost",
         "avg_sold",
         "start_holding_at",
-        "end_holding_at"
+        "end_holding_at",
+        "tags",
 ]
 
 def makeurl( url,url_show):
@@ -92,13 +94,15 @@ def get_handle_json_top_trader():
         filtered_obj = {}
         # 遍历obj的每一个value 元素,如果元素是数组或者obj,就删除这个key,否则就保留这个key
         for key, value in obj.items():
-            if isinstance(value, list) or isinstance(value, dict):
-                continue
-            else:
-                if key in arr_store_keys:
+            if key in arr_store_keys:
+                if key=='tags':
+                    value = set(value) - set(['bullx' , 'photon','trojan','pepeboost','gmgn'])
+                    filtered_obj[key] = "_".join(value)
+                
+                else:    
                     filtered_obj[key] = value
-                else:
-                    continue
+            else:
+                continue
                 
                 
         arr_json_data.append(filtered_obj)
@@ -162,7 +166,9 @@ def arr_json_2_df():
         "avg_sold_mc",
         "start_datetime",
         "end_datetime" ,
+    
         "duration",
+            "tags",
         "gmgn",
         "beizhu"
         ]]
@@ -173,7 +179,7 @@ def arr_json_2_df():
     df =df.sort_values(by=['realized_profit'], ascending=False)
     
  
-    df.to_excel(f'top_trader_gmgn_{token_add}.xlsx',index=False)
+    df.to_excel(f'top_trader_gmgn_{token_add}_{int(time.time())}.xlsx',index=False)
  
 
 

+ 187 - 0
src/library/analysis_token/2ZoJVM15fbbDgo6s5cTTX2Sj8V4sJ47rimb7gQhGpump/001_handle_json_top_trader_gmgn.py

@@ -0,0 +1,187 @@
+import pandas as pd
+import json
+import os
+import time
+arr_json_data = []
+ 
+ 
+obj_example =    {
+        "address": "EZZk361QgZDMx52AmMyc4NjFkuaNrdegwAxrLEbeaR94",
+        "account_address": "8FzF2vcsNDBinao1wDTKDKLN7SeV6HLH1uduRfRtL3XT",
+        "addr_type": 0,
+        "amount_cur": 0,
+        "usd_value": 0,
+        "cost_cur": 0,
+        "sell_amount_cur": 34148763.167781,
+        "sell_amount_percentage": 1,
+        "sell_volume_cur": 6449.83054886525,
+        "buy_volume_cur": 1501.4988493578628,
+        "buy_amount_cur": 34148763.167781,
+        "netflow_usd": -4948.331699507387,
+        "netflow_amount": 0,
+        "buy_tx_count_cur": 9,
+        "sell_tx_count_cur": 77,
+        "wallet_tag_v2": "TOP1",
+        "native_balance": "805755934855",
+        "balance": 0,
+        "profit": 4928.853565607387,
+        "realized_profit": 4928.853565607387,
+        "profit_change": 3.240583927213684,
+        "amount_percentage": 0,
+        "unrealized_profit": 0,
+        "unrealized_pnl": None,
+        "avg_cost": 0.000043969347937453594,
+        "avg_sold": 0.00018887449941234176,
+        "accu_amount": 0,
+        "accu_cost": 0,
+        "cost": 0,
+        "total_cost": 1520.976983257863,
+        "transfer_in": False,
+        "is_new": False,
+        "is_suspicious": False,
+        "start_holding_at": 1742168061,
+        "end_holding_at": 1742172930,
+        "last_active_timestamp": 1742172930,
+        "native_transfer": {
+            "name": None,
+            "from_address": "AxiomRYAid8ZDhS1bJUAzEaNSr69aTWB9ATfdDLfUbnc",
+            "timestamp": 1741555940
+        },
+        "tags": [
+            "sandwich_bot"
+        ],
+        "maker_token_tags": [],
+        "name": None,
+        "avatar": None,
+        "twitter_username": None,
+        "twitter_name": None,
+        "created_at": 1738980654
+    }
+    
+token_add= '2ZoJVM15fbbDgo6s5cTTX2Sj8V4sJ47rimb7gQhGpump'
+arr_store_keys = [
+         "address",
+        "sell_amount_cur",
+        "buy_amount_cur",
+
+        
+        "buy_tx_count_cur",
+        "sell_tx_count_cur",
+ 
+        "profit",
+        "realized_profit",
+        "profit_change",
+        "avg_cost",
+        "avg_sold",
+        "start_holding_at",
+        "end_holding_at",
+        "tags",
+]
+
+def makeurl( url,url_show):
+    return '=HYPERLINK("{}","{}")'.format(url,  url_show)
+    
+def get_handle_json_top_trader():
+
+    global arr_file,token_add  , arr_json_data
+    arr_file = []
+ 
+    with open(f'top_trader_gmgn_{token_add}.json', 'r',encoding='utf8') as f:
+        old_arr_json_data = json.load(f)
+ 
+    
+    for obj in old_arr_json_data:
+        filtered_obj = {}
+        # 遍历obj的每一个value 元素,如果元素是数组或者obj,就删除这个key,否则就保留这个key
+        for key, value in obj.items():
+            if key in arr_store_keys:
+                if key=='tags':
+                    value = set(value) - set(['bullx' , 'photon','trojan','pepeboost','gmgn'])
+                    filtered_obj[key] = "_".join(value)
+                
+                else:    
+                    filtered_obj[key] = value
+            else:
+                continue
+                
+                
+        arr_json_data.append(filtered_obj)
+    
+    return
+                
+import pytz
+def utc_2_shanghaidate(df , utc_time_col ):
+# 将字符串转换为UTC时间的datetime对象
+    # df[utc_time_col] = pd.to_datetime(df[utc_time_col], utc=True)
+    # 定义UTC+8时区
+    utc_plus_8 = pytz.timezone('Asia/Shanghai')
+    # 转换为UTC+8时间
+    df[utc_time_col] = df[utc_time_col].dt.tz_localize('UTC')
+    # # 提取时间字符串
+    # df['shanghai_date'] = df['shanghai_date'].dt.strftime('%Y-%m-%d %H:%M')
+    df[utc_time_col] = df[utc_time_col].dt.tz_convert(utc_plus_8)
+    # 提取时间字符串
+    df[utc_time_col] = df[utc_time_col].dt.strftime('%Y-%m-%d %H:%M')
+    return df
+
+ 
+
+def arr_json_2_df():
+    global arr_json_data
+    df  = pd.DataFrame(arr_json_data)
+    # print(df)
+    df['sell_token_amount'] = df['sell_amount_cur']  / 1e6
+    df['buy_token_amount'] = df['buy_amount_cur']  / 1e6
+    
+    df['buy_tx_count'] = df['buy_tx_count_cur']  
+    df['sell_tx_count'] = df['sell_tx_count_cur']  
+    # 将价格转化为是市值 xxxK的市值
+    df['avg_cost_mc'] = df['avg_cost'] *( 1e3 * 1e6/1e3) 
+    df['avg_sold_mc'] = df['avg_sold'] *( 1e3 * 1e6 / 1e3)
+    
+    df['duration'] = (df['end_holding_at'] - df['start_holding_at'] )/60/60
+    
+    df["start_datetime"] = pd.to_datetime(df["start_holding_at"], unit='s'  )
+    df = utc_2_shanghaidate(df, "start_datetime")
+
+    df["end_datetime"] = pd.to_datetime(df["end_holding_at"], unit='s' )
+    
+    df = utc_2_shanghaidate(df, "end_datetime")
+    
+    
+    df["gmgn"] = df.apply(lambda ser: makeurl(
+    f"https://gmgn.ai/sol/token/{token_add}?tab=activity&maker={ser['address']}" , "gmgn" ), axis=1)
+    df["beizhu"] = None
+    df =df [[       "address",
+        "buy_token_amount",
+        "sell_token_amount",
+
+        "buy_tx_count_cur",
+        "sell_tx_count_cur",
+        
+        # "profit",
+        "realized_profit",
+        "profit_change" ,
+        "avg_cost_mc",
+        "avg_sold_mc",
+        "start_datetime",
+        "end_datetime" ,
+    
+        "duration",
+            "tags",
+        "gmgn",
+        "beizhu"
+        ]]
+    df =df.round(1)
+ 
+
+    
+    df =df.sort_values(by=['realized_profit'], ascending=False)
+    
+ 
+    df.to_excel(f'top_trader_gmgn_{token_add}_{int(time.time())}.xlsx',index=False)
+ 
+
+
+get_handle_json_top_trader()
+arr_json_2_df()

+ 20 - 6
src/library/analysis_token/2ZoJVM15fbbDgo6s5cTTX2Sj8V4sJ47rimb7gQhGpump/001_merge_top20_holders_add.py → src/library/analysis_token/2ZoJVM15fbbDgo6s5cTTX2Sj8V4sJ47rimb7gQhGpump/001_merge_top20_holders_add_dune.py

@@ -3,10 +3,13 @@
 import pandas as pd
 import sys
 import os
- 
+import time
 
 arr_file = []
 merged_df = None
+ 
+def makeurl( url,url_show):
+    return '=HYPERLINK("{}","{}")'.format(url,  url_show)
 
 def map_exclude_df(df1,ex_df):
   
@@ -31,6 +34,8 @@ def merge_df_fun():
     
     global arr_file , merged_df , domains_df,token_add
     for index, file in enumerate(arr_file):
+        date_range = file.replace(".csv","").split("_")
+        date_range = date_range[-1]
                
         cur_df =   pd.read_csv(file ,dtype=object)
         cur_df=cur_df.dropna(subset=['holder_owner'])
@@ -38,11 +43,13 @@ def merge_df_fun():
         cur_df =cur_df.astype({
             "amount_M":float,
         })
+        cur_df =cur_df.round(1)
+        cur_df["belong_date"] =date_range
 
 
         cur_df=cur_df.sort_values(by=['amount_M'],ascending = False)
         cur_df =cur_df.head(22)
-        cur_df=cur_df[['holder_owner','domains_owned']]
+        cur_df=cur_df[['holder_owner','domains_owned','amount_M','belong_date']]
 
 
         if index==0 :
@@ -51,17 +58,24 @@ def merge_df_fun():
         merged_df = pd.concat([merged_df, cur_df])
   
     
-    merged_df =merged_df.drop_duplicates(subset=['holder_owner'])
+    # merged_df =merged_df.drop_duplicates(subset=['holder_owner'])
 
     ex_df = pd.read_csv('exclude_add.csv',dtype=object)
     merged_df=map_exclude_df(merged_df ,ex_df)
+    merged_df['is_dup'] = merged_df.duplicated(subset='holder_owner', keep=False).astype(int)
 
-    
-    merged_df.to_excel('001_top20_holders.xlsx', index=False)
+
+    merged_df["gmgn"] = merged_df.apply(lambda ser: makeurl(
+    f"https://gmgn.ai/sol/token/{token_add}?tab=activity&maker={ser['holder_owner']}" , "gmgn" ), axis=1)
+    merged_df["defined"] = merged_df.apply(lambda ser: makeurl(
+     f"https://www.defined.fi/sol/{token_add}?maker={ser['holder_owner']}" , "defined" ), axis=1)
+    merged_df["beizhu"] = None
+
+    merged_df.to_excel(f'001_top20_holders_dune_{int(time.time())}.xlsx', index=False)
 
  
     
-
+token_add = '2ZoJVM15fbbDgo6s5cTTX2Sj8V4sJ47rimb7gQhGpump'
 if __name__ == "__main__":
  
  

BIN
src/library/analysis_token/2ZoJVM15fbbDgo6s5cTTX2Sj8V4sJ47rimb7gQhGpump/001_top20_holders.xlsx


+ 0 - 2
src/library/analysis_token/2ZoJVM15fbbDgo6s5cTTX2Sj8V4sJ47rimb7gQhGpump/002_merge_swap_total_info_dune_from_manydunecsv_to_一个多列xlsx文档.py

@@ -13,8 +13,6 @@ merged_df = None
 def makeurl( url,url_show):
     return '=HYPERLINK("{}","{}")'.format(url,  url_show)
 
-
-
 def get_nowdate():
 
     timestamp = datetime.datetime.now().timestamp()

+ 10 - 3
src/library/analysis_token/2ZoJVM15fbbDgo6s5cTTX2Sj8V4sJ47rimb7gQhGpump/aaa.py

@@ -1,3 +1,10 @@
-string = 'Mar 17 07:49:46\n0.0\n51455\n$\n252.03\n1.998\n1.373\nM\n\n…kJT9eH\n\nMar 17 07:49:39\n0.0\n51480\n$\n300.53\n2.38245\n1.61\nM\n\n…gtUPpk\n\nMar 17 07:49:32\n0.0\n51467\n$\n250.00\n1.98179\n1.351\nM\n\n…VwexPh\n\nMar 17 07:49:03\n0.0\n51452\n$\n624.38\n4.950\n3.409\nM\n\n…ThEskH\n\nMar 17 07:48:50\n0.0\n51557\n$\n2,287.89\n18.138\n11.65\nM\n\n…WKY39E\n\nMar 17 07:48:45\n0.0\n51348\n$\n1,387.30\n11.00\n8.159\nM\n\n…oQk3kB\n\nMar 17 07:48:36\n0.0\n51222\n$\n499.45\n3.96013\n3.241\nM\n\n…mcrsog\n\nMar 17 07:48:26\n0.0\n51245\n$\n1,513.41\n12.00\n9.636\nM\n\n…oQk3kB\n\nMar 17 07:48:20\n0.0\n51205\n$\n378.25\n3.000\n2.49\nM\n\n…tNtVii\n\nMar 17 07:48:14\n0.0\n51164\n$\n378.28\n3.000\n2.578\nM\n\n…qPikqL\n\nMar 17 07:48:08\n0.0\n51169\n$\n1,513.07\n12.00\n10.26\nM\n\n…oQk3kB\n\nMar 17 07:47:53\n0.0\n51083\n$\n311.66\n2.47132\n2.281\nM\n\n…skCQ1Y\n\nMar 17 07:47:48\n0.0\n51123\n$\n242.43\n1.92232\n1.712\nM\n\n…r6B4zg\n\nMar 17 07:47:46\n0.0\n51088\n$\n214.49\n1.70077\n1.563\nM\n\n…giR5ck\n\nMar 17 07:47:06\n0.0\n51080\n$\n378.42\n3.000\n2.778\nM\n\n…NUHUv9\n\nMar 17 07:47:02\n0.0\n51004\n$\n575.65\n4.56517\n4.546\nM\n\n…H7B2v3\n\nMar 17 07:46:39\n0.0\n68684\n$\n359.17\n2.850\n3.282\nM\n\n…ZUYk4c\n\nMar 17 07:45:38\n0.0\n69595\n$\n250.18\n1.983\n2.067\nM\n\n…LCeJQk\n\nMar 17 07:45:38\n0.0\n68979\n$\n848.59\n6.72623\n7.491\nM\n\n…oZfznG'
-string=string.replace('$\n','$')
-print(string)
+import pandas as pd
+
+# 假设你的数据框是 df
+data = {'name': ['Alice', 'Bob', 'Alice', 'Charlie', 'Bob', 'David']}
+df = pd.DataFrame(data)
+
+# 使用 duplicated() 方法检测重复值,并创建 is_dup 列
+df['is_dup'] = df.duplicated(subset='name', keep=False).astype(int)
+
+print(df)

BIN
src/library/analysis_token/2ZoJVM15fbbDgo6s5cTTX2Sj8V4sJ47rimb7gQhGpump/merge_swap_total_info.xlsx


BIN
src/library/analysis_token/2ZoJVM15fbbDgo6s5cTTX2Sj8V4sJ47rimb7gQhGpump/merge_swap_total_info_04062224.xlsx


BIN
src/library/analysis_token/2ZoJVM15fbbDgo6s5cTTX2Sj8V4sJ47rimb7gQhGpump/top_trader_gmgn_2ZoJVM15fbbDgo6s5cTTX2Sj8V4sJ47rimb7gQhGpump.xlsx


BIN
src/library/analysis_token/2ZoJVM15fbbDgo6s5cTTX2Sj8V4sJ47rimb7gQhGpump/汇总token.xlsx