sync_data.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #coding:utf-8
  2. import os,json
  3. import time
  4. import datetime
  5. import sys
  6. import django
  7. from django.core.cache import cache
  8. from django.db import connection
  9. from django.db.models import Q,Sum,Count,F
  10. sys.path.append('/mnt/wzbapi/src')
  11. os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
  12. django.setup()
  13. import common.models as cm
  14. import common.common_functions as ccf
  15. def sync_stock():
  16. """同步用户持股和股票仓库数据
  17. """
  18. prset = cm.PlayerRecord.objects.order_by("stock_date")
  19. for index,pr in enumerate(prset):
  20. player_id = pr.player_id
  21. match_id = pr.match_id
  22. match_group = pr.match_group
  23. stock_date = pr.stock_date
  24. today_stock = pr.today_stock
  25. yesterday_stock = pr.yesterday_stock
  26. print pr.username,stock_date
  27. today_stock = json.loads(today_stock) if today_stock else []
  28. yesterday_stock = json.loads(yesterday_stock) if yesterday_stock else []
  29. new_today_stock = []
  30. for ts in today_stock:
  31. if ts["name"] and ts["fund"]:
  32. stock,flag = cm.Stock.objects.get_or_create(name=ts["name"])
  33. ts["stock_id"] = stock.id
  34. new_today_stock.append(ts)
  35. #更新用户持股情况
  36. cm.UserStock.objects.get_or_create(
  37. player_id = player_id,
  38. stock_id = stock.id,
  39. stock_date = stock_date
  40. )
  41. yes_today_stock = []
  42. for ts in yesterday_stock:
  43. if ts["name"] and ts["fund"]:
  44. stock,flag = cm.Stock.objects.get_or_create(name=ts["name"])
  45. ts["stock_id"] = stock.id
  46. yes_today_stock.append(ts)
  47. pr.today_stock = json.dumps(new_today_stock)
  48. pr.yesterday_stock = json.dumps(yes_today_stock)
  49. pr.save()
  50. def sync_win_defend():
  51. """更新胜率和最大回撤
  52. """
  53. match_id = 7
  54. players = cm.Player.objects.filter(match_id=match_id)
  55. for pl in players:
  56. record = cm.PlayerRecord.objects.filter(match_id=match_id,player_id=pl.id).order_by("-stock_date").first()
  57. if record:
  58. print record.username,record.stock_date
  59. from threading import Thread
  60. t = Thread(target=update_win_defend_rank,args=(record,))
  61. t.start()
  62. def update_win_defend_rank(record):
  63. """更新胜率防守榜
  64. """
  65. player_id = record.player_id
  66. user_id = record.user_id
  67. match_id = record.match_id
  68. match_group = record.match_group
  69. user_name = record.username
  70. today_fund = record.today_fund
  71. total_income = record.total_income
  72. zq = record.zq
  73. cw = record.cw
  74. df = record.df
  75. pz = record.pz
  76. #胜率
  77. qset = cm.PlayerRecord.objects.filter(match_id=match_id,player_id=player_id)
  78. win_rate = qset.filter(today_income__gt=0).count()/float(qset.count()) if qset else 0.0
  79. win_rate = round(win_rate,3)
  80. #win_rate = "{}%".format(win_rate*100)
  81. #最大回撤
  82. badest_income = qset.order_by("today_income").first().today_income
  83. badest_income = round(badest_income,3)
  84. obj,flag = cm.WinDefendRank.objects.get_or_create(
  85. user_id = user_id,
  86. player_id = player_id,
  87. match_id = match_id,
  88. match_group = match_group
  89. )
  90. obj.username = user_name
  91. obj.today_fund = today_fund
  92. obj.total_income = total_income
  93. obj.win_rate = win_rate
  94. obj.badest_income = badest_income
  95. obj.save()
  96. def sync_hot_seller():
  97. """同步热门清仓数据
  98. """
  99. all_dates = list(cm.UserStock.objects.order_by("stock_date").values_list("stock_date",flat=True))
  100. all_dates = list(set(all_dates))
  101. all_dates.sort()
  102. for stock_date in all_dates:
  103. stock_date_time = ccf.str_to_datetime(stock_date,"%Y-%m-%d")
  104. yesterday = (stock_date_time - datetime.timedelta(days=1)).strftime("%Y-%m-%d")
  105. #昨天所有持股id
  106. all_stock_ids = list(cm.UserStock.objects.filter(stock_date=yesterday).values_list("stock_id",flat=True))
  107. all_stock_ids = list(set(all_stock_ids))
  108. for stock_id in all_stock_ids:
  109. print stock_date,stock_id
  110. stock = cm.Stock.objects.filter(id=stock_id).first()
  111. #昨天持股选手
  112. yes_players = list(cm.UserStock.objects.filter(stock_date=yesterday,stock_id=stock_id).values_list("player_id",flat=True))
  113. #今天持股选手
  114. td_players = list(cm.UserStock.objects.filter(stock_date=stock_date,stock_id=stock_id).values_list("player_id",flat=True))
  115. if yes_players and td_players:
  116. #清仓选手
  117. sell_players = list(set(yes_players)-set(td_players))
  118. if sell_players:
  119. seller_ids = json.dumps(sell_players)
  120. count = len(sell_players)
  121. obj,flag = cm.HotStockSellCount.objects.get_or_create(
  122. stock_id = stock_id,
  123. stock_name = stock.name,
  124. stock_date = stock_date
  125. )
  126. obj.seller_ids = seller_ids
  127. obj.count = count
  128. obj.save()
  129. if __name__ == "__main__":
  130. print "start sync stock..."
  131. st = time.time()
  132. sync_stock()
  133. sync_win_defend()
  134. sync_hot_seller()
  135. print "time cost:",time.time()-st