008_get_profit_st_solanafm.py 45 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088
  1. from base_class import BaseVariableFunction
  2. from base_class import *
  3. baseclass = BaseVariableFunction(__file__)
  4. baseclass.makedirpath(baseclass.dalao_profit_st_fm_path)
  5. baseclass.makedirpath(baseclass.dalao_ana_fm_path)
  6. baseclass.makedirpath(baseclass.dalao_total_ana_fm_path)
  7. baseclass.open_base_library()
  8. decimal.getcontext().prec = 100
  9. old_print = print
  10. def timestamped_print(*args, **kwargs):
  11. old_print(datetime.datetime.utcnow().replace(
  12. microsecond=0), *args, **kwargs)
  13. print = timestamped_print
  14. print('\n'*5)
  15. print(f"{'{:<6}'.format('ENTER')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")
  16. onedalao_ana_columns = ['TokenFirstTime', 'swap_tokenaddress', "issellfir", 'buy_counts', 'sell_counts',
  17. 'outtoken_per', 'cost_main', 'earn_main', 'earn_percent' ,
  18. 'diffdays','fir_cost_main','fir_earn_percent' , 'fir_noadd_earn_percent']
  19. onetxhash_onerow_ana_cols= [
  20. "sign","swap_tokenaddress","dexurl","platform","datetime",
  21. "dalaofirsttimestamp","diffdays",
  22. "fir_cost_main","fir_earn_percent","issellfir",
  23. "fir_noadd_earn_percent","token_price", "buy_sell_diftime",
  24. "swap_type",
  25. "outtoken_per",
  26. "buy_counts","sell_counts",
  27. "timestamp","TokenFirstTime",
  28. "swap_eth_amount","swap_token_amount",
  29. "cost_main","earn_main","earn_percent",
  30. "intoken_amount","outtoken_amount",
  31. ]
  32. TotalAnalysis_columns = [
  33. "add",
  34. # "whichcontract",
  35. "url",
  36. "beizhu",
  37. "03d_cost",
  38. "03d_earn",
  39. "03d_earnper",
  40. "03d_difcost",
  41. "03d_difearn",
  42. "03d_difper",
  43. "03d_costmedian",
  44. "03d_costmean",
  45. "03d_cost_noaddouttoken",
  46. "03d_earn_noaddouttoken",
  47. "03d_earnper_noaddouttoken",
  48. # "03d_difcost_noaddouttoken",
  49. # "03d_difearn_noaddouttoken",
  50. # "03d_difper_noaddouttoken",
  51. # "03d_costmedian_noaddouttoken",
  52. # "03d_costmean_noaddouttoken",
  53. "03d_mine_fir_earnper",
  54. "03d_mine_fir_earnper_dropmax",
  55. "03d_mine_fir_earnper_droptwomax",
  56. "03d_mine_noadd_fir_earnper" ,
  57. "03d_mine_noadd_fir_earnper_dropmax" ,
  58. "03d_mine_noadd_fir_earnper_droptwomax" ,
  59. "03d_trans",
  60. "07d_cost",
  61. "07d_earn",
  62. "07d_earnper",
  63. "07d_difcost",
  64. "07d_difearn",
  65. "07d_difper",
  66. "07d_costmedian",
  67. "07d_costmean",
  68. "07d_cost_noaddouttoken",
  69. "07d_earn_noaddouttoken",
  70. "07d_earnper_noaddouttoken",
  71. # "07d_difcost_noaddouttoken",
  72. # "07d_difearn_noaddouttoken",
  73. # "07d_difper_noaddouttoken",
  74. # "07d_costmedian_noaddouttoken",
  75. # "07d_costmean_noaddouttoken",
  76. "07d_mine_fir_earnper",
  77. "07d_mine_fir_earnper_dropmax",
  78. "07d_mine_fir_earnper_droptwomax",
  79. "07d_mine_noadd_fir_earnper" ,
  80. "07d_mine_noadd_fir_earnper_dropmax" ,
  81. "07d_mine_noadd_fir_earnper_droptwomax" ,
  82. "07d_trans",
  83. # "11d_cost",
  84. # "11d_earn",
  85. # "11d_earnper",
  86. # "11d_difcost",
  87. # "11d_difearn",
  88. # "11d_difper",
  89. # "11d_costmedian",
  90. # "11d_costmean",
  91. # "11d_cost_noaddouttoken",
  92. # "11d_earn_noaddouttoken",
  93. # "11d_earnper_noaddouttoken",
  94. # # "11d_difcost_noaddouttoken",
  95. # # "11d_difearn_noaddouttoken",
  96. # # "11d_difper_noaddouttoken",
  97. # # "11d_costmedian_noaddouttoken",
  98. # # "11d_costmean_noaddouttoken",
  99. # "11d_mine_fir_earnper",
  100. # "11d_mine_fir_earnper_dropmax",
  101. # "11d_mine_fir_earnper_droptwomax",
  102. # "11d_mine_noadd_fir_earnper" ,
  103. # "11d_mine_noadd_fir_earnper_dropmax" ,
  104. # "11d_mine_noadd_fir_earnper_droptwomax" ,
  105. # "11d_trans",
  106. "15d_cost",
  107. "15d_earn",
  108. "15d_earnper",
  109. "15d_difcost",
  110. "15d_difearn",
  111. "15d_difper",
  112. "15d_costmedian",
  113. "15d_costmean",
  114. "15d_cost_noaddouttoken",
  115. "15d_earn_noaddouttoken",
  116. "15d_earnper_noaddouttoken",
  117. # "15d_difcost_noaddouttoken",
  118. # "15d_difearn_noaddouttoken",
  119. # "15d_difper_noaddouttoken",
  120. # "15d_costmedian_noaddouttoken",
  121. # "15d_costmean_noaddouttoken",
  122. "15d_mine_fir_earnper",
  123. "15d_mine_fir_earnper_dropmax",
  124. "15d_mine_fir_earnper_droptwomax",
  125. "15d_mine_noadd_fir_earnper" ,
  126. "15d_mine_noadd_fir_earnper_dropmax" ,
  127. "15d_mine_noadd_fir_earnper_droptwomax" ,
  128. "15d_trans",
  129. "30d_cost",
  130. "30d_earn",
  131. "30d_earnper",
  132. "30d_difcost",
  133. "30d_difearn",
  134. "30d_difper",
  135. "30d_costmedian",
  136. "30d_costmean",
  137. "30d_cost_noaddouttoken",
  138. "30d_earn_noaddouttoken",
  139. "30d_earnper_noaddouttoken",
  140. # "30d_difcost_noaddouttoken",
  141. # "30d_difearn_noaddouttoken",
  142. # "30d_difper_noaddouttoken",
  143. # "30d_costmedian_noaddouttoken",
  144. # "30d_costmean_noaddouttoken",
  145. "30d_mine_fir_earnper",
  146. "30d_mine_fir_earnper_dropmax",
  147. "30d_mine_fir_earnper_droptwomax",
  148. "30d_mine_noadd_fir_earnper" ,
  149. "30d_mine_noadd_fir_earnper_dropmax" ,
  150. "30d_mine_noadd_fir_earnper_droptwomax" ,
  151. "30d_trans",
  152. "30dearn_dif",
  153. "30d_mine_fir_earnper_dif",
  154. ]
  155. earn_kuisun_columns=[
  156. "add",
  157. "url",
  158. "beizhu",
  159. "03d_bigbig_earn_counts" , "03d_big_earn_counts" , "03d_nor_earn_counts" ,
  160. "03d_nor_kuisun_counts" , "03d_big_kuisun_counts" , "03d_bigbig_kuisun_counts" ,
  161. "03d_bigbig_earn_per" , "03d_big_earn_per" , "03d_nor_earn_per" ,
  162. "03d_nor_kuisun_per" , "03d_big_kuisun_per" , "03d_bigbig_kuisun_per" ,
  163. "03d_total_counts",
  164. "07d_bigbig_earn_counts" , "07d_big_earn_counts" , "07d_nor_earn_counts" ,
  165. "07d_nor_kuisun_counts" , "07d_big_kuisun_counts" , "07d_bigbig_kuisun_counts" ,
  166. "07d_bigbig_earn_per" , "07d_big_earn_per" , "07d_nor_earn_per" ,
  167. "07d_nor_kuisun_per" , "07d_big_kuisun_per" , "07d_bigbig_kuisun_per" ,
  168. "07d_total_counts",
  169. # "11d_bigbig_earn_counts" , "11d_big_earn_counts" , "11d_nor_earn_counts" ,
  170. # "11d_nor_kuisun_counts" , "11d_big_kuisun_counts" , "11d_bigbig_kuisun_counts" ,
  171. # "11d_bigbig_earn_per" , "11d_big_earn_per" , "11d_nor_earn_per" ,
  172. # "11d_nor_kuisun_per" , "11d_big_kuisun_per" , "11d_bigbig_kuisun_per" ,
  173. # "11d_total_counts",
  174. "15d_bigbig_earn_counts" , "15d_big_earn_counts" , "15d_nor_earn_counts" ,
  175. "15d_nor_kuisun_counts" , "15d_big_kuisun_counts" , "15d_bigbig_kuisun_counts" ,
  176. "15d_bigbig_earn_per" , "15d_big_earn_per" , "15d_nor_earn_per" ,
  177. "15d_nor_kuisun_per" , "15d_big_kuisun_per" , "15d_bigbig_kuisun_per" ,
  178. "15d_total_counts",
  179. "30d_bigbig_earn_counts" , "30d_big_earn_counts" , "30d_nor_earn_counts" ,
  180. "30d_nor_kuisun_counts" , "30d_big_kuisun_counts" , "30d_bigbig_kuisun_counts" ,
  181. "30d_bigbig_earn_per" , "30d_big_earn_per" , "30d_nor_earn_per" ,
  182. "30d_nor_kuisun_per" , "30d_big_kuisun_per" , "30d_bigbig_kuisun_per" ,
  183. "30d_total_counts",
  184. ]
  185. def get_txhash_tokenswap_amount(df):
  186. def get_txhash_cost(gdf):
  187. token_amount_list = gdf['swap_token_amount'].to_list()
  188. arr_token_amount = [(decimal.Decimal(
  189. token_amount)) for token_amount in token_amount_list]
  190. token_amount = sum(arr_token_amount)
  191. token_amount_str = '{0:.4f}'.format(token_amount)
  192. gdf[['swap_token_amount']] = [token_amount_str]
  193. # gdf['swap_token_amount'] = token_amount_str
  194. return gdf
  195. df = df.groupby(["sign"], group_keys=False).apply(
  196. lambda gdf: get_txhash_cost(gdf))
  197. df = df.reset_index(drop=True)
  198. return df
  199. def get_tokenswap_amount(df):
  200. def get_cost(gdf):
  201. arr_token_amount = gdf['swap_token_amount'].to_list()
  202. isfirstsell = False
  203. while len(arr_token_amount) > 0:
  204. if (decimal.Decimal(arr_token_amount[0]) < 0):
  205. arr_token_amount.pop(0)
  206. isfirstsell = True
  207. else:
  208. break
  209. if len(arr_token_amount) == 0:
  210. return gdf
  211. arr_out_token_amount = [abs(decimal.Decimal(
  212. token_amount)) for token_amount in arr_token_amount if decimal.Decimal(token_amount) < 0]
  213. arr_in_token_amount = [decimal.Decimal(
  214. token_amount) for token_amount in arr_token_amount if decimal.Decimal(token_amount) > 0]
  215. buy_counts = len(arr_in_token_amount)
  216. sell_counts = len(arr_out_token_amount)
  217. out_token_amount = sum(arr_out_token_amount)
  218. in_token_amount = sum(arr_in_token_amount)
  219. out_token_amount_str = '{0:.2f}'.format(out_token_amount)
  220. in_token_amount_str = '{0:.2f}'.format(in_token_amount)
  221. if isfirstsell:
  222. outtoken_per = "1.01"
  223. else:
  224. outtoken_per = '{0:.2f}'.format(
  225. out_token_amount/in_token_amount) if in_token_amount != 0 else '-10'
  226. gdf[['buy_counts', 'sell_counts', 'intoken_amount', 'outtoken_amount', 'outtoken_per']] = [buy_counts, sell_counts,
  227. in_token_amount_str, out_token_amount_str, outtoken_per]
  228. return gdf
  229. df[['buy_counts', 'sell_counts', 'intoken_amount',
  230. 'outtoken_amount', 'outtoken_per']] = [0, 0, '0', '0', '0']
  231. # 如果全是sell token 那么 在get_cost()将会在中途返回gdf 不会赋值 如上变量全为0
  232. df = df.groupby(["swap_tokenaddress"], group_keys=False).apply(
  233. lambda gdf: get_cost(gdf))
  234. df = df.reset_index(drop=True)
  235. return df
  236. def get_sol_profit(df):
  237. # 計算利潤
  238. df['cost_main'] = 0
  239. df['earn_main'] = 0
  240. df['earn_percent'] = -10
  241. df['fir_cost_main'] = 0
  242. df['fir_earn_percent']=-10
  243. df["issellfir"] = 0
  244. df["fir_noadd_earn_percent"] = -10
  245. df["token_price"]=-10
  246. df["buy_sell_diftime"]=-1
  247. df = df.astype({'swap_eth_amount': float})
  248. df = df.astype({'swap_token_amount': float})
  249. df = df.astype({'outtoken_per': float})
  250. df = df.astype({'timestamp': int})
  251. df["token_price"] = np.where(
  252. df['swap_token_amount'] != 0,
  253. -df['swap_eth_amount'] / df['swap_token_amount'],
  254. -10,
  255. )
  256. def get_one_sol_profit(gdf):
  257. issellfir = False
  258. arr_eth_amount = gdf['swap_eth_amount'].to_list()
  259. arr_token_amount = gdf['swap_token_amount'].to_list()
  260. arr_timestamp = gdf["timestamp"].to_list()
  261. while len(arr_eth_amount) > 0:
  262. # 如果 arr_eth_amount[0]>0 则此交易为卖出 pass
  263. if (arr_eth_amount[0] >= 0):
  264. gdf["issellfir"] = 1
  265. arr_eth_amount.pop(0)
  266. arr_token_amount.pop(0)
  267. arr_timestamp.pop(0)
  268. continue
  269. else:
  270. break
  271. if len(arr_eth_amount) == 0:
  272. return gdf
  273. number_cost_main = sum(
  274. [abs(eth_amount) for eth_amount in arr_eth_amount if eth_amount < 0])
  275. number_earn_main = sum(arr_eth_amount)
  276. number_earn_percent = number_earn_main / \
  277. number_cost_main if number_cost_main != 0 else -10
  278. gdf["cost_main"] = number_cost_main
  279. gdf["earn_main"] = number_earn_main
  280. gdf["earn_percent"] = number_earn_percent
  281. arr_firswap_token_amount = arr_token_amount.copy()
  282. arr_firswap_eth_amount = arr_eth_amount.copy()
  283. # swap_tokenaddress
  284. small_sol_counts = 0
  285. # 获取第一笔cost_eth
  286. # 如果 arr_eth_amount[0]>0 则此交易为卖出 pass
  287. # 如果 0>arr_eth_amount[0]>-0.04 此交易金额较小 pass
  288. while len(arr_firswap_eth_amount) > 0:
  289. if arr_firswap_eth_amount[0]>=0:
  290. arr_firswap_eth_amount.pop(0)
  291. arr_firswap_token_amount.pop(0)
  292. arr_timestamp.pop(0)
  293. continue
  294. elif arr_firswap_eth_amount[0]<0 and arr_firswap_eth_amount[0]>-0.04:
  295. arr_firswap_eth_amount.pop(0)
  296. arr_firswap_token_amount.pop(0)
  297. arr_timestamp.pop(0)
  298. small_sol_counts+=1
  299. if small_sol_counts==2:
  300. break
  301. continue
  302. else :
  303. break
  304. if small_sol_counts==2:
  305. return gdf
  306. if len(arr_firswap_eth_amount) == 0:
  307. return gdf
  308. fir_swap_tokenamount = arr_firswap_token_amount[0]
  309. fir_swap_costmain = abs(arr_firswap_eth_amount[0])
  310. fir_swap_earntmain = -fir_swap_costmain
  311. fir_buy_timestamp =int(arr_timestamp[0])
  312. fir_sell_timestamp = 0
  313. while len(arr_firswap_eth_amount) > 0:
  314. if arr_firswap_eth_amount[0]<=0:
  315. arr_firswap_eth_amount.pop(0)
  316. arr_firswap_token_amount.pop(0)
  317. arr_timestamp.pop(0)
  318. continue
  319. # 现在 swap_token 为负 , eth为正 代表 sell token
  320. cur_swap_tokenamount = abs(arr_firswap_token_amount[0])
  321. cur_swap_eth = arr_firswap_eth_amount[0]
  322. fir_sell_timestamp = int(arr_timestamp[0])
  323. arr_firswap_eth_amount.pop(0)
  324. arr_firswap_token_amount.pop(0)
  325. arr_timestamp.pop(0)
  326. if fir_swap_tokenamount>=cur_swap_tokenamount:
  327. fir_swap_earntmain+=cur_swap_eth
  328. fir_swap_tokenamount-=cur_swap_tokenamount
  329. else:
  330. fir_swap_earntmain = fir_swap_earntmain+ fir_swap_tokenamount/cur_swap_tokenamount * cur_swap_eth
  331. fir_swap_tokenamount=0
  332. if fir_swap_tokenamount==0:
  333. break
  334. gdf['fir_cost_main'] = fir_swap_costmain
  335. gdf["fir_earn_percent"] = fir_swap_earntmain / fir_swap_costmain if fir_swap_costmain != 0 else -10
  336. gdf["fir_noadd_earn_percent"] = fir_swap_earntmain / fir_swap_costmain if fir_swap_costmain != 0 else -10
  337. if issellfir==1 or gdf["outtoken_per"].tolist()[0]>1:
  338. gdf["fir_noadd_earn_percent"] = -10
  339. gdf["buy_sell_diftime"] = fir_sell_timestamp - fir_buy_timestamp
  340. return gdf
  341. df = df.groupby(["swap_tokenaddress"], group_keys=False).apply(
  342. lambda gdf: get_one_sol_profit(gdf))
  343. return df
  344. def analysis_lastdays( df, now_unix_time, intervaldays=30):
  345. if len(df) == 0:
  346. return 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0,0
  347. # need consider df may null if use iloc
  348. lastdf = df[df["TokenFirstTime"] >=
  349. now_unix_time - 3600*24*intervaldays]
  350. # 去除那些earnper为-10的
  351. lastdf = lastdf[lastdf['cost_main'] != 0]
  352. # 去除 cost_main 过小的 <0.04 sol 理论上 同时fir_cost_main!=0
  353. lastdf = lastdf[lastdf['cost_main'] >= 0.04]
  354. lastdf = lastdf[lastdf['fir_cost_main'] != 0]
  355. lastdf = lastdf[lastdf['issellfir'] ==0]
  356. lastdf = lastdf.reset_index(drop=True)
  357. if len(lastdf) == 0:
  358. return 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0
  359. last_mine_fir_earnper = lastdf['fir_earn_percent'].sum()
  360. last_mine_fir_earnper_dropmax = last_mine_fir_earnper- lastdf['fir_earn_percent'].max()
  361. last_mine_fir_earnper_droptwomax = last_mine_fir_earnper - sum( lastdf['fir_earn_percent'].nlargest(2).tolist())
  362. last_cost_sum = lastdf['cost_main'].sum()
  363. last_earn_sum = lastdf['earn_main'].sum()
  364. last_cost_median = lastdf['cost_main'].median()
  365. last_cost_mean = lastdf['cost_main'].mean()
  366. last_earnper = last_earn_sum / last_cost_sum if last_cost_sum != 0 else -10
  367. last_trans_amount = len(lastdf)
  368. lastdf['earn_percent'] = np.where(
  369. lastdf['cost_main'] != 0,
  370. lastdf['earn_main'] / lastdf['cost_main'],
  371. -10,
  372. )
  373. earnmain_max = lastdf['earn_main'].max()
  374. last_earn_difmax_sum = last_earn_sum - earnmain_max
  375. last_cost_difmax_sum = last_cost_sum - \
  376. lastdf[lastdf['earn_main'] == earnmain_max]['cost_main'].to_list()[0]
  377. last_dif_earnper = (
  378. last_earn_difmax_sum / last_cost_difmax_sum if last_cost_difmax_sum != 0 else -10
  379. )
  380. return (
  381. last_cost_sum,
  382. last_earn_sum,
  383. last_earnper,
  384. last_cost_difmax_sum,
  385. last_earn_difmax_sum,
  386. last_dif_earnper,
  387. last_cost_median,
  388. last_cost_mean,
  389. # last_earncount_per,
  390. last_trans_amount,
  391. last_mine_fir_earnper,
  392. last_mine_fir_earnper_dropmax,
  393. last_mine_fir_earnper_droptwomax,
  394. )
  395. def analysis_lastdays_noaddouttoken( df, now_unix_time, intervaldays=30):
  396. if len(df) == 0:
  397. return 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0
  398. # need consider df may null if use iloc
  399. lastdf = df[df["TokenFirstTime"] >=
  400. now_unix_time - 3600*24*intervaldays]
  401. # 去除那些earnper为-10的
  402. lastdf = lastdf[lastdf['cost_main'] != 0]
  403. # 去除 cost_main 过小的 <0.04 sol 理论上 同时fir_cost_main!=0
  404. lastdf = lastdf[lastdf['cost_main'] >= 0.04]
  405. lastdf = lastdf[lastdf['fir_cost_main'] != 0]
  406. # fir_noadd_earn_percent
  407. # 去除 第一笔交易是sell
  408. lastdf = lastdf[lastdf['fir_noadd_earn_percent'] !=-10]
  409. lastdf = lastdf[lastdf['issellfir'] ==0]
  410. lastdf = lastdf.reset_index(drop=True)
  411. if len(lastdf) == 0:
  412. return 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0
  413. last_mine_noadd_fir_earnper = lastdf['fir_noadd_earn_percent'].sum()
  414. last_mine_noadd_fir_earnper_dropmax = last_mine_noadd_fir_earnper- lastdf['fir_noadd_earn_percent'].max()
  415. last_mine_noadd_fir_earnper_droptwomax = last_mine_noadd_fir_earnper - sum( lastdf['fir_noadd_earn_percent'].nlargest(2).tolist())
  416. last_cost_sum = lastdf['cost_main'].sum()
  417. last_earn_sum = lastdf['earn_main'].sum()
  418. # last_earn_sum = lastdf["earn_main_noaddouttoken"].sum()
  419. last_cost_median = lastdf['cost_main'].median()
  420. last_cost_mean = lastdf['cost_main'].mean()
  421. last_earnper = last_earn_sum / last_cost_sum if last_cost_sum != 0 else -10
  422. last_trans_amount = len(lastdf)
  423. lastdf['earn_percent'] = np.where(
  424. lastdf['cost_main'] != 0,
  425. lastdf["earn_main"] / lastdf['cost_main'],
  426. -10,
  427. )
  428. earnmain_max = lastdf["earn_main"].max()
  429. last_earn_difmax_sum = last_earn_sum - earnmain_max
  430. last_cost_difmax_sum = last_cost_sum - \
  431. lastdf[lastdf['earn_main'] == earnmain_max]['cost_main'].to_list()[
  432. 0]
  433. last_dif_earnper = (
  434. last_earn_difmax_sum / last_cost_difmax_sum if last_cost_difmax_sum != 0 else -10
  435. )
  436. return (
  437. last_cost_sum,
  438. last_earn_sum,
  439. last_earnper,
  440. last_cost_difmax_sum,
  441. last_earn_difmax_sum,
  442. last_dif_earnper,
  443. last_cost_median,
  444. last_cost_mean,
  445. # last_earncount_per,
  446. last_trans_amount,
  447. last_mine_noadd_fir_earnper ,
  448. last_mine_noadd_fir_earnper_dropmax ,
  449. last_mine_noadd_fir_earnper_droptwomax
  450. )
  451. def analysis_lastdays_earn_kuisun_counts(df ,now_unix_time,intervaldays ):
  452. if len(df) == 0:
  453. return 0, 0, 0, 0, 0, 0, 0 ,0,0,0,0,0,0
  454. # need consider df may null if use iloc
  455. lastdf = df[df["TokenFirstTime"] >=
  456. now_unix_time - 3600*24*intervaldays]
  457. # 去除那些earnper为-10的
  458. lastdf = lastdf[lastdf['cost_main'] != 0]
  459. # 去除 cost_main 过小的 <0.04 sol 理论上 同时fir_cost_main!=0
  460. lastdf = lastdf[lastdf['cost_main'] >= 0.04]
  461. lastdf = lastdf[lastdf['fir_cost_main'] != 0]
  462. # fir_noadd_earn_percent
  463. # 去除 第一笔交易是sell
  464. lastdf = lastdf[lastdf['fir_noadd_earn_percent'] !=-10]
  465. lastdf = lastdf[lastdf['issellfir'] ==0]
  466. lastdf = lastdf.reset_index(drop=True)
  467. if len(lastdf) == 0:
  468. return 0, 0, 0, 0, 0, 0, 0 ,0,0,0,0,0,0
  469. last_bigbig_earn_counts = len( lastdf[lastdf['fir_noadd_earn_percent']>=1])
  470. last_big_earn_counts = len( lastdf[(lastdf['fir_noadd_earn_percent']>=0.5 )& (lastdf['fir_noadd_earn_percent']<1 ) ])
  471. last_nor_earn_counts = len( lastdf[(lastdf['fir_noadd_earn_percent']>=0.05 )& (lastdf['fir_noadd_earn_percent']<0.5 ) ])
  472. last_nor_kuisun_counts = len( lastdf[(lastdf['fir_noadd_earn_percent']>=-0.2 )& (lastdf['fir_noadd_earn_percent']<0.05 ) ])
  473. last_big_kuisun_counts = len( lastdf[(lastdf['fir_noadd_earn_percent']>=-0.5 )& (lastdf['fir_noadd_earn_percent']<-0.2 ) ])
  474. last_bigbig_kuisun_counts = len( lastdf[ (lastdf['fir_noadd_earn_percent']<-0.5 ) ])
  475. last_total_counts = len( lastdf)
  476. last_bigbig_earn_per = last_bigbig_earn_counts /last_total_counts if last_total_counts!=0 else -10
  477. last_big_earn_per = last_big_earn_counts / last_total_counts if last_total_counts!=0 else -10
  478. last_nor_earn_per = last_nor_earn_counts / last_total_counts if last_total_counts!=0 else -10
  479. last_nor_kuisun_per = last_nor_kuisun_counts /last_total_counts if last_total_counts!=0 else -10
  480. last_big_kuisun_per= last_big_kuisun_counts / last_total_counts if last_total_counts!=0 else -10
  481. last_bigbig_kuisun_per = last_bigbig_kuisun_counts / last_total_counts if last_total_counts!=0 else -10
  482. return (
  483. last_bigbig_earn_counts,
  484. last_big_earn_counts,
  485. last_nor_earn_counts,
  486. last_nor_kuisun_counts,
  487. last_big_kuisun_counts,
  488. last_bigbig_kuisun_counts,
  489. last_total_counts,
  490. last_bigbig_earn_per ,
  491. last_big_earn_per ,
  492. last_nor_earn_per ,
  493. last_nor_kuisun_per ,
  494. last_big_kuisun_per,
  495. last_bigbig_kuisun_per ,
  496. )
  497. return
  498. def get_analyres(df, dalao_address, now_unix_time):
  499. (last_03d_cost, last_03d_earn, last_03d_earnper, last_03d_difcost, last_03d_difearn, last_03d_difper, last_03d_costmedian, last_03d_costmean, last_03d_trans , last_03d_mine_fir_earnper ,last_03d_mine_fir_earnper_dropmax, last_03d_mine_fir_earnper_droptwomax ) = analysis_lastdays(
  500. df, now_unix_time=now_unix_time, intervaldays=3
  501. )
  502. (last_07d_cost, last_07d_earn, last_07d_earnper, last_07d_difcost, last_07d_difearn, last_07d_difper, last_07d_costmedian, last_07d_costmean, last_07d_trans , last_07d_mine_fir_earnper ,last_07d_mine_fir_earnper_dropmax, last_07d_mine_fir_earnper_droptwomax ) = analysis_lastdays(
  503. df, now_unix_time=now_unix_time, intervaldays=7
  504. )
  505. # (last_11d_cost, last_11d_earn, last_11d_earnper, last_11d_difcost, last_11d_difearn, last_11d_difper, last_11d_costmedian, last_11d_costmean, last_11d_trans , last_11d_mine_fir_earnper ,last_11d_mine_fir_earnper_dropmax , last_11d_mine_fir_earnper_droptwomax ) = analysis_lastdays(
  506. # df, now_unix_time=now_unix_time, intervaldays=11
  507. # )
  508. (last_15d_cost, last_15d_earn, last_15d_earnper, last_15d_difcost, last_15d_difearn, last_15d_difper, last_15d_costmedian, last_15d_costmean, last_15d_trans , last_15d_mine_fir_earnper ,last_15d_mine_fir_earnper_dropmax , last_15d_mine_fir_earnper_droptwomax ) = analysis_lastdays(
  509. df, now_unix_time=now_unix_time, intervaldays=15
  510. )
  511. (last_30d_cost, last_30d_earn, last_30d_earnper, last_30d_difcost, last_30d_difearn, last_30d_difper, last_30d_costmedian, last_30d_costmean, last_30d_trans , last_30d_mine_fir_earnper ,last_30d_mine_fir_earnper_dropmax , last_30d_mine_fir_earnper_droptwomax ) = analysis_lastdays(
  512. df, now_unix_time=now_unix_time, intervaldays=30
  513. )
  514. # # 去除所有daxin
  515. # df = df[df["isdaxin"] == "0"].reset_index(drop=True)
  516. (last_03d_cost_noaddouttoken, last_03d_earn_noaddouttoken, last_03d_earnper_noaddouttoken, last_03d_difcost_noaddouttoken, last_03d_difearn_noaddouttoken, last_03d_difper_noaddouttoken, last_03d_costmedian_noaddouttoken, last_03d_costmean_noaddouttoken, last_03d_trans ,
  517. last_03d_mine_noadd_fir_earnper , last_03d_mine_noadd_fir_earnper_dropmax , last_03d_mine_noadd_fir_earnper_droptwomax ) = analysis_lastdays_noaddouttoken(
  518. df, now_unix_time=now_unix_time, intervaldays=3
  519. )
  520. (last_07d_cost_noaddouttoken, last_07d_earn_noaddouttoken, last_07d_earnper_noaddouttoken, last_07d_difcost_noaddouttoken, last_07d_difearn_noaddouttoken, last_07d_difper_noaddouttoken, last_07d_costmedian_noaddouttoken, last_07d_costmean_noaddouttoken, last_07d_trans,
  521. last_07d_mine_noadd_fir_earnper , last_07d_mine_noadd_fir_earnper_dropmax , last_07d_mine_noadd_fir_earnper_droptwomax) = analysis_lastdays_noaddouttoken(
  522. df, now_unix_time=now_unix_time, intervaldays=7
  523. )
  524. # (last_11d_cost_noaddouttoken, last_11d_earn_noaddouttoken, last_11d_earnper_noaddouttoken, last_11d_difcost_noaddouttoken, last_11d_difearn_noaddouttoken, last_11d_difper_noaddouttoken, last_11d_costmedian_noaddouttoken, last_11d_costmean_noaddouttoken, last_11d_trans,
  525. # last_11d_mine_noadd_fir_earnper , last_11d_mine_noadd_fir_earnper_dropmax , last_11d_mine_noadd_fir_earnper_droptwomax) = analysis_lastdays_noaddouttoken(
  526. # df, now_unix_time=now_unix_time, intervaldays=11
  527. # )
  528. (last_15d_cost_noaddouttoken, last_15d_earn_noaddouttoken, last_15d_earnper_noaddouttoken, last_15d_difcost_noaddouttoken, last_15d_difearn_noaddouttoken, last_15d_difper_noaddouttoken, last_15d_costmedian_noaddouttoken, last_15d_costmean_noaddouttoken, last_15d_trans,
  529. last_15d_mine_noadd_fir_earnper , last_15d_mine_noadd_fir_earnper_dropmax , last_15d_mine_noadd_fir_earnper_droptwomax) = analysis_lastdays_noaddouttoken(
  530. df, now_unix_time=now_unix_time, intervaldays=15
  531. )
  532. (last_30d_cost_noaddouttoken, last_30d_earn_noaddouttoken, last_30d_earnper_noaddouttoken, last_30d_difcost_noaddouttoken, last_30d_difearn_noaddouttoken, last_30d_difper_noaddouttoken, last_30d_costmedian_noaddouttoken, last_30d_costmean_noaddouttoken, last_30d_trans,
  533. last_30d_mine_noadd_fir_earnper , last_30d_mine_noadd_fir_earnper_dropmax , last_30d_mine_noadd_fir_earnper_droptwomax) = analysis_lastdays_noaddouttoken(
  534. df, now_unix_time=now_unix_time, intervaldays=30
  535. )
  536. (last_03d_bigbig_earn_counts, last_03d_big_earn_counts, last_03d_nor_earn_counts, last_03d_nor_kuisun_counts,last_03d_big_kuisun_counts,last_03d_bigbig_kuisun_counts ,last_03d_total_counts,
  537. last_03d_bigbig_earn_per , last_03d_big_earn_per , last_03d_nor_earn_per , last_03d_nor_kuisun_per , last_03d_big_kuisun_per, last_03d_bigbig_kuisun_per
  538. ) = analysis_lastdays_earn_kuisun_counts(
  539. df, now_unix_time=now_unix_time, intervaldays=3
  540. )
  541. (last_07d_bigbig_earn_counts, last_07d_big_earn_counts, last_07d_nor_earn_counts, last_07d_nor_kuisun_counts,last_07d_big_kuisun_counts,last_07d_bigbig_kuisun_counts ,last_07d_total_counts,
  542. last_07d_bigbig_earn_per , last_07d_big_earn_per , last_07d_nor_earn_per , last_07d_nor_kuisun_per , last_07d_big_kuisun_per, last_07d_bigbig_kuisun_per
  543. ) = analysis_lastdays_earn_kuisun_counts(
  544. df, now_unix_time=now_unix_time, intervaldays=7
  545. )
  546. # (last_11d_bigbig_earn_counts, last_11d_big_earn_counts, last_11d_nor_earn_counts, last_11d_nor_kuisun_counts,last_11d_big_kuisun_counts,last_11d_bigbig_kuisun_counts ,last_11d_total_counts,
  547. # last_11d_bigbig_earn_per , last_11d_big_earn_per , last_11d_nor_earn_per , last_11d_nor_kuisun_per , last_11d_big_kuisun_per, last_11d_bigbig_kuisun_per
  548. # ) = analysis_lastdays_earn_kuisun_counts(
  549. # df, now_unix_time=now_unix_time, intervaldays=11
  550. # )
  551. (last_15d_bigbig_earn_counts, last_15d_big_earn_counts, last_15d_nor_earn_counts, last_15d_nor_kuisun_counts,last_15d_big_kuisun_counts,last_15d_bigbig_kuisun_counts ,last_15d_total_counts,
  552. last_15d_bigbig_earn_per , last_15d_big_earn_per , last_15d_nor_earn_per , last_15d_nor_kuisun_per , last_15d_big_kuisun_per, last_15d_bigbig_kuisun_per
  553. ) = analysis_lastdays_earn_kuisun_counts(
  554. df, now_unix_time=now_unix_time, intervaldays=15
  555. )
  556. (last_30d_bigbig_earn_counts, last_30d_big_earn_counts, last_30d_nor_earn_counts, last_30d_nor_kuisun_counts,last_30d_big_kuisun_counts,last_30d_bigbig_kuisun_counts ,last_30d_total_counts,
  557. last_30d_bigbig_earn_per , last_30d_big_earn_per , last_30d_nor_earn_per , last_30d_nor_kuisun_per , last_30d_big_kuisun_per, last_30d_bigbig_kuisun_per
  558. ) = analysis_lastdays_earn_kuisun_counts(
  559. df, now_unix_time=now_unix_time, intervaldays=30
  560. )
  561. dalao_rul = f"https://solscan.io/account/{dalao_address}"
  562. analist = [
  563. dalao_address,
  564. dalao_rul,
  565. "",
  566. last_03d_cost,
  567. last_03d_earn,
  568. last_03d_earnper,
  569. last_03d_difcost,
  570. last_03d_difearn,
  571. last_03d_difper,
  572. last_03d_costmedian,
  573. last_03d_costmean,
  574. last_03d_cost_noaddouttoken,
  575. last_03d_earn_noaddouttoken,
  576. last_03d_earnper_noaddouttoken,
  577. # last_03d_difcost_noaddouttoken,
  578. # last_03d_difearn_noaddouttoken,
  579. # last_03d_difper_noaddouttoken,
  580. # last_03d_costmedian_noaddouttoken,
  581. # last_03d_costmean_noaddouttoken,
  582. last_03d_mine_fir_earnper,
  583. last_03d_mine_fir_earnper_dropmax,
  584. last_03d_mine_fir_earnper_droptwomax,
  585. last_03d_mine_noadd_fir_earnper ,
  586. last_03d_mine_noadd_fir_earnper_dropmax ,
  587. last_03d_mine_noadd_fir_earnper_droptwomax,
  588. last_03d_trans,
  589. last_07d_cost,
  590. last_07d_earn,
  591. last_07d_earnper,
  592. last_07d_difcost,
  593. last_07d_difearn,
  594. last_07d_difper,
  595. last_07d_costmedian,
  596. last_07d_costmean,
  597. last_07d_cost_noaddouttoken,
  598. last_07d_earn_noaddouttoken,
  599. last_07d_earnper_noaddouttoken,
  600. # last_07d_difcost_noaddouttoken,
  601. # last_07d_difearn_noaddouttoken,
  602. # last_07d_difper_noaddouttoken,
  603. # last_07d_costmedian_noaddouttoken,
  604. # last_07d_costmean_noaddouttoken,
  605. last_07d_mine_fir_earnper,
  606. last_07d_mine_fir_earnper_dropmax,
  607. last_07d_mine_fir_earnper_droptwomax,
  608. last_07d_mine_noadd_fir_earnper ,
  609. last_07d_mine_noadd_fir_earnper_dropmax ,
  610. last_07d_mine_noadd_fir_earnper_droptwomax,
  611. last_07d_trans,
  612. # last_11d_cost,
  613. # last_11d_earn,
  614. # last_11d_earnper,
  615. # last_11d_difcost,
  616. # last_11d_difearn,
  617. # last_11d_difper,
  618. # last_11d_costmedian,
  619. # last_11d_costmean,
  620. # last_11d_cost_noaddouttoken,
  621. # last_11d_earn_noaddouttoken,
  622. # last_11d_earnper_noaddouttoken,
  623. # # last_11d_difcost_noaddouttoken,
  624. # # last_11d_difearn_noaddouttoken,
  625. # # last_11d_difper_noaddouttoken,
  626. # # last_11d_costmedian_noaddouttoken,
  627. # # last_11d_costmean_noaddouttoken,
  628. # last_11d_mine_fir_earnper,
  629. # last_11d_mine_fir_earnper_dropmax,
  630. # last_11d_mine_fir_earnper_droptwomax,
  631. # last_11d_mine_noadd_fir_earnper ,
  632. # last_11d_mine_noadd_fir_earnper_dropmax ,
  633. # last_11d_mine_noadd_fir_earnper_droptwomax ,
  634. # last_11d_trans,
  635. last_15d_cost,
  636. last_15d_earn,
  637. last_15d_earnper,
  638. last_15d_difcost,
  639. last_15d_difearn,
  640. last_15d_difper,
  641. last_15d_costmedian,
  642. last_15d_costmean,
  643. last_15d_cost_noaddouttoken,
  644. last_15d_earn_noaddouttoken,
  645. last_15d_earnper_noaddouttoken,
  646. # last_15d_difcost_noaddouttoken,
  647. # last_15d_difearn_noaddouttoken,
  648. # last_15d_difper_noaddouttoken,
  649. # last_15d_costmedian_noaddouttoken,
  650. # last_15d_costmean_noaddouttoken,
  651. last_15d_mine_fir_earnper,
  652. last_15d_mine_fir_earnper_dropmax,
  653. last_15d_mine_fir_earnper_droptwomax,
  654. last_15d_mine_noadd_fir_earnper ,
  655. last_15d_mine_noadd_fir_earnper_dropmax ,
  656. last_15d_mine_noadd_fir_earnper_droptwomax,
  657. last_15d_trans,
  658. last_30d_cost,
  659. last_30d_earn,
  660. last_30d_earnper,
  661. last_30d_difcost,
  662. last_30d_difearn,
  663. last_30d_difper,
  664. last_30d_costmedian,
  665. last_30d_costmean,
  666. last_30d_cost_noaddouttoken,
  667. last_30d_earn_noaddouttoken,
  668. last_30d_earnper_noaddouttoken,
  669. # last_30d_difcost_noaddouttoken,
  670. # last_30d_difearn_noaddouttoken,
  671. # last_30d_difper_noaddouttoken,
  672. # last_30d_costmedian_noaddouttoken,
  673. # last_30d_costmean_noaddouttoken,
  674. last_30d_mine_fir_earnper,
  675. last_30d_mine_fir_earnper_dropmax,
  676. last_30d_mine_fir_earnper_droptwomax,
  677. last_30d_mine_noadd_fir_earnper ,
  678. last_30d_mine_noadd_fir_earnper_dropmax ,
  679. last_30d_mine_noadd_fir_earnper_droptwomax ,
  680. last_30d_trans,
  681. last_30d_earn-last_30d_earn_noaddouttoken,
  682. last_30d_mine_fir_earnper - last_30d_mine_noadd_fir_earnper,
  683. ]
  684. arr_earn_kuisun_counts=[
  685. dalao_address,
  686. dalao_rul,
  687. "",
  688. last_03d_bigbig_earn_counts, last_03d_big_earn_counts, last_03d_nor_earn_counts,
  689. last_03d_nor_kuisun_counts,last_03d_big_kuisun_counts,last_03d_bigbig_kuisun_counts ,
  690. last_03d_bigbig_earn_per, last_03d_big_earn_per , last_03d_nor_earn_per ,
  691. last_03d_nor_kuisun_per , last_03d_big_kuisun_per, last_03d_bigbig_kuisun_per,
  692. last_03d_total_counts ,
  693. last_07d_bigbig_earn_counts, last_07d_big_earn_counts, last_07d_nor_earn_counts,
  694. last_07d_nor_kuisun_counts,last_07d_big_kuisun_counts,last_07d_bigbig_kuisun_counts ,
  695. last_07d_bigbig_earn_per , last_07d_big_earn_per , last_07d_nor_earn_per ,
  696. last_07d_nor_kuisun_per , last_07d_big_kuisun_per, last_07d_bigbig_kuisun_per,
  697. last_07d_total_counts ,
  698. # last_11d_bigbig_earn_counts, last_11d_big_earn_counts, last_11d_nor_earn_counts,
  699. # last_11d_nor_kuisun_counts,last_11d_big_kuisun_counts,last_11d_bigbig_kuisun_counts ,
  700. # last_11d_bigbig_earn_per , last_11d_big_earn_per , last_11d_nor_earn_per ,
  701. # last_11d_nor_kuisun_per , last_11d_big_kuisun_per, last_11d_bigbig_kuisun_per,
  702. # last_11d_total_counts ,
  703. last_15d_bigbig_earn_counts, last_15d_big_earn_counts, last_15d_nor_earn_counts,
  704. last_15d_nor_kuisun_counts,last_15d_big_kuisun_counts,last_15d_bigbig_kuisun_counts ,
  705. last_15d_bigbig_earn_per , last_15d_big_earn_per , last_15d_nor_earn_per ,
  706. last_15d_nor_kuisun_per , last_15d_big_kuisun_per, last_15d_bigbig_kuisun_per,
  707. last_15d_total_counts ,
  708. last_30d_bigbig_earn_counts, last_30d_big_earn_counts, last_30d_nor_earn_counts,
  709. last_30d_nor_kuisun_counts,last_30d_big_kuisun_counts,last_30d_bigbig_kuisun_counts ,
  710. last_30d_bigbig_earn_per , last_30d_big_earn_per , last_30d_nor_earn_per ,
  711. last_30d_nor_kuisun_per , last_30d_big_kuisun_per, last_30d_bigbig_kuisun_per,
  712. last_30d_total_counts ,
  713. ]
  714. global TotalAnalysis_list
  715. global total_arr_earn_kuisun
  716. TotalAnalysis_list.append(analist)
  717. total_arr_earn_kuisun.append(arr_earn_kuisun_counts)
  718. def calute_days(df, now_unix_time):
  719. df["diffdays"] = 0
  720. # intervaldays_list = [15, 11, 7, 3]
  721. intervaldays_list = [30, 15, 7, 3]
  722. for intervaldays in intervaldays_list:
  723. df.loc[df["TokenFirstTime"] >=
  724. now_unix_time - 3600*24*intervaldays, "diffdays"] = intervaldays
  725. return df
  726. def calucate_earnmain_dropoutoken(row):
  727. earnmain_amount_dropoutoken = decimal.Decimal(row['earn_main'])
  728. outtoken_per = decimal.Decimal(row["outtoken_per"])
  729. issellfir = row["issellfir"]
  730. # if outtoken_per >= 1.1 or outtoken_per == -10
  731. if outtoken_per > 1 or issellfir==0:
  732. earnmain_amount_dropoutoken = decimal.Decimal(0)
  733. earnmain_amount_dropoutoken_str = '{0:.4f}'.format(
  734. earnmain_amount_dropoutoken)
  735. return float(earnmain_amount_dropoutoken_str)
  736. def makeDexurl(row, dalao_address):
  737. tokenAddress = row['swap_tokenaddress']
  738. urlname = f"https://dexscreener.com/solana/{tokenAddress}?maker={dalao_address}"
  739. return '=HYPERLINK("{}","{}")'.format(urlname, "DEX/"+tokenAddress)
  740. def get_ana_df(dalao_address, df, success_address_list, onetxhash_onerow_ana_df):
  741. onedalao_ana_df = df[onedalao_ana_columns].drop_duplicates(
  742. ).reset_index(drop=True)
  743. onedalao_ana_df.insert(
  744. loc=2, column="swap_tokenadd_dexurl", value="")
  745. onedalao_ana_df['swap_tokenadd_dexurl'] = onedalao_ana_df.apply(
  746. lambda row: makeDexurl(row, dalao_address), axis=1)
  747. onedalao_ana_df["FirstDateTime"] = pd.to_datetime(
  748. onedalao_ana_df['TokenFirstTime'], unit='s')
  749. # 如果outoken超了,earn_main_noaddouttoken 的值有两种处理方式
  750. # 一种设置为0 即为不亏不赚
  751. # 一种为全负 即为全亏了
  752. # onedalao_ana_df["earn_main_noaddouttoken"] = onedalao_ana_df.apply(
  753. # lambda row: calucate_earnmain_dropoutoken(row), axis=1)
  754. get_analyres(df=onedalao_ana_df, dalao_address=dalao_address,
  755. now_unix_time=now_unix_time)
  756. onedalao_ana_df = calute_days(
  757. df=onedalao_ana_df, now_unix_time=now_unix_time)
  758. handle_onedalao_ana_df = onedalao_ana_df[onedalao_ana_df['cost_main'] != 0].reset_index(
  759. drop=True)
  760. baseclass.makedirpath(baseclass.dalao_ana_fm_path / dalao_address)
  761. onedalao_ana_df.to_csv(baseclass.dalao_ana_fm_path /
  762. dalao_address/f"analysisprofit_{dalao_address}.csv", index=False)
  763. handle_onedalao_ana_df.to_csv(baseclass.dalao_ana_fm_path /
  764. dalao_address/f"analysisprofit_handle_{dalao_address}.csv", index=False)
  765. onetxhash_onerow_ana_df.to_csv(baseclass.dalao_ana_fm_path /
  766. dalao_address/f"onetxhash_onerow_profit_{dalao_address}.csv", index=False)
  767. success_address_list.remove(dalao_address)
  768. def get_profit_st(str_dalao_address):
  769. if not (baseclass.dalao_configtoken_st_solanafm_path /
  770. f"configtoken_{str_dalao_address}.csv").exists():
  771. return None
  772. # print(f"enter get_profit_st dalao_address= {str_dalao_address} \n", end='')
  773. df = pd.read_csv(baseclass.dalao_configtoken_st_solanafm_path /
  774. f"configtoken_{str_dalao_address}.csv", dtype=object)
  775. # timestamp sign source destination token amount swap_tokenadd swap_eth_amount swap_token_amount token_idx dalaofirsttimestamp
  776. df["timestamp"] = df["timestamp"].astype(int)
  777. df['dalaofirsttimestamp'] = pd.to_datetime(
  778. df['dalaofirsttimestamp'] )
  779. df["dexurl"] = df.apply(lambda ser: (f'https://dexscreener.com/solana/{ser["swap_tokenaddress"]}?maker={str_dalao_address}' ), axis=1)
  780. df["TokenFirstTime"] = df.groupby("token_idx")[
  781. "timestamp"].transform("min")
  782. df = calute_days(
  783. df=df, now_unix_time=now_unix_time)
  784. df = df.sort_values(by=["dalaofirsttimestamp", 'swap_tokenaddress', 'timestamp'], ascending=[
  785. False, True, True]).reset_index(drop=True)
  786. onetxhash_onerow_ana_df = df.copy()
  787. onetxhash_onerow_ana_df = onetxhash_onerow_ana_df[["timestamp", "TokenFirstTime",
  788. "sign", "swap_tokenaddress","dexurl","platform","swap_type",
  789. "swap_eth_amount", "swap_token_amount",
  790. "dalaofirsttimestamp","diffdays"]]
  791. onetxhash_onerow_ana_df = onetxhash_onerow_ana_df.astype(
  792. {'swap_eth_amount': float})
  793. # 计算一个txhash的 tokenamount swap 数目
  794. onetxhash_onerow_ana_df = get_txhash_tokenswap_amount(
  795. df=onetxhash_onerow_ana_df)
  796. # 计算一个txhash的sol swap 数目
  797. earnMain_df = (
  798. onetxhash_onerow_ana_df
  799. .groupby('sign')["swap_eth_amount"]
  800. .sum()
  801. )
  802. onetxhash_onerow_ana_df['swap_eth_amount'] = onetxhash_onerow_ana_df["sign"].map(
  803. earnMain_df)
  804. onetxhash_onerow_ana_df = onetxhash_onerow_ana_df.drop_duplicates().reset_index(drop=True)
  805. onetxhash_onerow_ana_df = get_tokenswap_amount(df=onetxhash_onerow_ana_df)
  806. onetxhash_onerow_ana_df = onetxhash_onerow_ana_df.sort_values(by=["dalaofirsttimestamp", 'swap_tokenaddress', 'timestamp'], ascending=[
  807. False, True, True]).reset_index(drop=True)
  808. onetxhash_onerow_ana_df = get_sol_profit(df=onetxhash_onerow_ana_df)
  809. onetxhash_onerow_ana_df["datetime"] = pd.to_datetime(
  810. onetxhash_onerow_ana_df["timestamp"], unit='s')
  811. onetxhash_onerow_ana_df=onetxhash_onerow_ana_df[onetxhash_onerow_ana_cols]
  812. onetxhash_onerow_ana_df.to_csv(
  813. baseclass.dalao_profit_st_fm_path / f"onetxhash_onerow_profit_{str_dalao_address}.csv", index=False)
  814. # onetxhash_onerow_ana_df=pd.DataFrame()
  815. def set_platform(gdf):
  816. if "unknown" in gdf["platform"]:
  817. gdf["platform"] = "unknown"
  818. print("unknow in plat")
  819. return gdf
  820. onetxhash_onerow_ana_df.groupby(by=["swap_tokenaddress"]).apply(lambda gdf : set_platform(gdf))
  821. onetxhash_onerow_ana_dropdup_df = onetxhash_onerow_ana_df.drop_duplicates(subset=["swap_tokenaddress"]).reset_index(drop=True)
  822. onetxhash_onerow_ana_dropdup_df.to_csv(
  823. baseclass.dalao_profit_st_fm_path / f"onetxhash_onerow_profit_dropdup_{str_dalao_address}.csv", index=False)
  824. return onetxhash_onerow_ana_df
  825. def get_dalaoaddress_list():
  826. df = pd.read_csv(baseclass.dalao_merge_path /
  827. "filter_dalao.csv", dtype=object)
  828. arr_dalao_address = df["dalaoAddress"].tolist()
  829. return arr_dalao_address
  830. def save_earn_kuisun_df():
  831. global total_arr_earn_kuisun
  832. totalana_earn_kuisun_df = pd.DataFrame(
  833. data=total_arr_earn_kuisun, columns=earn_kuisun_columns
  834. )
  835. totalana_earn_kuisun_df = totalana_earn_kuisun_df.round(4)
  836. totalana_earn_kuisun_df = totalana_earn_kuisun_df.sort_values(by=["add"], ascending=[
  837. True]).reset_index(drop=True)
  838. totalana_earn_kuisun_df.to_excel(
  839. baseclass.dalao_total_ana_fm_path/f"totalana_earn_kuisun_df.xlsx", index=False)
  840. return
  841. def save_total_ana_df():
  842. global TotalAnalysis_list
  843. TotalAnalysis_df = pd.DataFrame(
  844. data=TotalAnalysis_list, columns=TotalAnalysis_columns
  845. )
  846. TotalAnalysis_df = TotalAnalysis_df.round(4)
  847. TotalAnalysis_df = TotalAnalysis_df.sort_values(by=["add"], ascending=[
  848. True]).reset_index(drop=True)
  849. TotalAnalysis_df.to_csv(
  850. baseclass.dalao_total_ana_fm_path/f"totalana.csv", index=False)
  851. TotalAnalysis_df.to_excel(
  852. baseclass.dalao_total_ana_fm_path/f"totalana.xlsx", index=False)
  853. # mine_fir_earnper_filter_mask = (
  854. # (TotalAnalysis_df["15d_mine_fir_earnper"] >=
  855. # 0.8*TotalAnalysis_df["11d_mine_fir_earnper"])
  856. # & (TotalAnalysis_df["11d_mine_fir_earnper"] >= 0.8*TotalAnalysis_df["07d_mine_fir_earnper"])
  857. # )
  858. # mine_fir_earnper_dropmax_filter_mask = (
  859. # (TotalAnalysis_df["15d_mine_fir_earnper_dropmax"] >=
  860. # 0.8*TotalAnalysis_df["11d_mine_fir_earnper_dropmax"])
  861. # & (TotalAnalysis_df["11d_mine_fir_earnper_dropmax"] >= 0.8*TotalAnalysis_df["07d_mine_fir_earnper_dropmax"])
  862. # )
  863. mine_noadd_fir_earnper_filter_mask = (
  864. (TotalAnalysis_df["30d_mine_noadd_fir_earnper"] >=
  865. 0.8*TotalAnalysis_df["15d_mine_noadd_fir_earnper"])
  866. & (TotalAnalysis_df["15d_mine_noadd_fir_earnper"] >= 0.8*TotalAnalysis_df["07d_mine_noadd_fir_earnper"])
  867. )
  868. mine_noadd_fir_earnper_dropmax_filter_mask = (
  869. (TotalAnalysis_df["30d_mine_noadd_fir_earnper_dropmax"] >=
  870. 0.8*TotalAnalysis_df["15d_mine_noadd_fir_earnper_dropmax"])
  871. & (TotalAnalysis_df["15d_mine_noadd_fir_earnper_dropmax"] >= 0.8*TotalAnalysis_df["07d_mine_noadd_fir_earnper_dropmax"])
  872. )
  873. filter_mask = (
  874. # mine_fir_earnper_filter_mask
  875. # | mine_fir_earnper_dropmax_filter_mask
  876. mine_noadd_fir_earnper_filter_mask
  877. | mine_noadd_fir_earnper_dropmax_filter_mask
  878. )
  879. increase_TotalAnalysis_df = TotalAnalysis_df[filter_mask].reset_index(
  880. drop=True)
  881. increase_TotalAnalysis_df.to_excel(
  882. baseclass.dalao_total_ana_fm_path/f"increase_totalana.xlsx", index=False)
  883. # last_07d_has_mask = (increase_TotalAnalysis_df["07d_trans"]== increase_TotalAnalysis_df["11d_trans"])
  884. # last_07d_increase_TotalAnalysis_df = increase_TotalAnalysis_df[last_07d_has_mask]
  885. increase_TotalAnalysis_df.to_excel(
  886. baseclass.dalao_total_ana_fm_path/f"increase_totalana_07d.xlsx", index=False)
  887. def get_mul_profit_st():
  888. global arr_str_dalaoaddress
  889. success_address_list = arr_str_dalaoaddress.copy()
  890. for idx in range(0, len(arr_str_dalaoaddress), batchSize):
  891. thread_list = []
  892. for cur_idx in range(idx, min(idx+batchSize, len(arr_str_dalaoaddress))):
  893. thread = threading.Thread(
  894. target=get_one_profit_st,
  895. args=(arr_str_dalaoaddress[cur_idx],
  896. success_address_list, cur_idx)
  897. )
  898. thread_list.append(thread)
  899. for thread in thread_list:
  900. thread.start()
  901. for thread in thread_list:
  902. thread.join()
  903. def get_one_profit_st(dalao_address, success_address_list, cur_idx):
  904. try:
  905. df = None
  906. onetxhash_onerow_ana_df = None
  907. print(f"get_one_profit_st cur_idx={cur_idx} dalao_address={dalao_address}\n", end='')
  908. onetxhash_onerow_ana_df = get_profit_st(
  909. str_dalao_address=dalao_address)
  910. if onetxhash_onerow_ana_df is None:
  911. print(f"get_one_profit_st cur_idx={cur_idx} is None \n", end='')
  912. return
  913. get_ana_df(dalao_address=dalao_address, df=onetxhash_onerow_ana_df,
  914. success_address_list=success_address_list, onetxhash_onerow_ana_df=onetxhash_onerow_ana_df)
  915. print(f"cur_idx={cur_idx} end \n", end='')
  916. return
  917. except Exception as e:
  918. print(f"error_dalao_address={dalao_address}")
  919. raise
  920. batchSize = 5
  921. TotalAnalysis_list = []
  922. total_arr_earn_kuisun =[]
  923. now_unix_time = int(time.time())
  924. arr_str_dalaoaddress = get_dalaoaddress_list()
  925. arr_str_dalaoaddress = arr_str_dalaoaddress[0:450]
  926. arr_str_dalaoaddress.append(baseclass.mywalletaddress)
  927. # arr_str_dalaoaddress = ['H5P5xig8WjcDQrzyR4HaKcrg4hd2vh5DLPnFs4ypNE1X']
  928. print(f"arr_str_dalaoaddress len= {len(arr_str_dalaoaddress)}")
  929. get_mul_profit_st()
  930. save_total_ana_df()
  931. save_earn_kuisun_df()
  932. print(f"arr_str_dalaoaddress len= {len(arr_str_dalaoaddress)} \n", end='')
  933. print(f"{'{:<6}'.format('END')} {baseclass.scriptfilename} ----------------NOTE-----------NOTE---------------")