#coding:utf-8 import os,json import time import datetime import sys import django from django.core.cache import cache from django.db import connection from django.db.models import Q,Sum,Count,F sys.path.append('/mnt/wzbapi/src') os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' django.setup() import common.models as cm import common.common_functions as ccf def sync_stock(): """同步用户持股和股票仓库数据 """ prset = cm.PlayerRecord.objects.order_by("stock_date") for index,pr in enumerate(prset): player_id = pr.player_id match_id = pr.match_id match_group = pr.match_group stock_date = pr.stock_date today_stock = pr.today_stock yesterday_stock = pr.yesterday_stock print pr.username,stock_date today_stock = json.loads(today_stock) if today_stock else [] yesterday_stock = json.loads(yesterday_stock) if yesterday_stock else [] new_today_stock = [] for ts in today_stock: if ts["name"] and ts["fund"]: stock,flag = cm.Stock.objects.get_or_create(name=ts["name"]) ts["stock_id"] = stock.id new_today_stock.append(ts) #更新用户持股情况 cm.UserStock.objects.get_or_create( player_id = player_id, stock_id = stock.id, stock_date = stock_date ) yes_today_stock = [] for ts in yesterday_stock: if ts["name"] and ts["fund"]: stock,flag = cm.Stock.objects.get_or_create(name=ts["name"]) ts["stock_id"] = stock.id yes_today_stock.append(ts) pr.today_stock = json.dumps(new_today_stock) pr.yesterday_stock = json.dumps(yes_today_stock) pr.save() def sync_win_defend(): """更新胜率和最大回撤 """ match_id = 7 players = cm.Player.objects.filter(match_id=match_id) for pl in players: record = cm.PlayerRecord.objects.filter(match_id=match_id,player_id=pl.id).order_by("-stock_date").first() if record: print record.username,record.stock_date from threading import Thread t = Thread(target=update_win_defend_rank,args=(record,)) t.start() def update_win_defend_rank(record): """更新胜率防守榜 """ player_id = record.player_id user_id = record.user_id match_id = record.match_id match_group = record.match_group user_name = record.username today_fund = record.today_fund total_income = record.total_income zq = record.zq cw = record.cw df = record.df pz = record.pz #胜率 qset = cm.PlayerRecord.objects.filter(match_id=match_id,player_id=player_id) win_rate = qset.filter(today_income__gt=0).count()/float(qset.count()) if qset else 0.0 win_rate = round(win_rate,3) #win_rate = "{}%".format(win_rate*100) #最大回撤 badest_income = qset.order_by("today_income").first().today_income badest_income = round(badest_income,3) obj,flag = cm.WinDefendRank.objects.get_or_create( user_id = user_id, player_id = player_id, match_id = match_id, match_group = match_group ) obj.username = user_name obj.today_fund = today_fund obj.total_income = total_income obj.win_rate = win_rate obj.badest_income = badest_income obj.save() def sync_hot_seller(): """同步热门清仓数据 """ all_dates = list(cm.UserStock.objects.order_by("stock_date").values_list("stock_date",flat=True)) all_dates = list(set(all_dates)) all_dates.sort() for stock_date in all_dates: stock_date_time = ccf.str_to_datetime(stock_date,"%Y-%m-%d") yesterday = (stock_date_time - datetime.timedelta(days=1)).strftime("%Y-%m-%d") #昨天所有持股id all_stock_ids = list(cm.UserStock.objects.filter(stock_date=yesterday).values_list("stock_id",flat=True)) all_stock_ids = list(set(all_stock_ids)) for stock_id in all_stock_ids: print stock_date,stock_id stock = cm.Stock.objects.filter(id=stock_id).first() #昨天持股选手 yes_players = list(cm.UserStock.objects.filter(stock_date=yesterday,stock_id=stock_id).values_list("player_id",flat=True)) #今天持股选手 td_players = list(cm.UserStock.objects.filter(stock_date=stock_date,stock_id=stock_id).values_list("player_id",flat=True)) if yes_players and td_players: #清仓选手 sell_players = list(set(yes_players)-set(td_players)) if sell_players: seller_ids = json.dumps(sell_players) count = len(sell_players) obj,flag = cm.HotStockSellCount.objects.get_or_create( stock_id = stock_id, stock_name = stock.name, stock_date = stock_date ) obj.seller_ids = seller_ids obj.count = count obj.save() if __name__ == "__main__": print "start sync stock..." st = time.time() sync_stock() sync_win_defend() sync_hot_seller() print "time cost:",time.time()-st