Commit 3dff5388 authored by pengxiong's avatar pengxiong

Merge remote-tracking branch 'origin/app_v3' into app_v3

parents 81242e12 47358623
...@@ -29,6 +29,8 @@ class UserCustomerDataAdaptor: ...@@ -29,6 +29,8 @@ class UserCustomerDataAdaptor:
end_date = "" end_date = ""
group_data = {} group_data = {}
trade_cal_date = None trade_cal_date = None
all_fund_id_list = None
all_fund_type_dict = None
all_fund_distribution = {} all_fund_distribution = {}
all_fund_performance = {} all_fund_performance = {}
...@@ -36,13 +38,14 @@ class UserCustomerDataAdaptor: ...@@ -36,13 +38,14 @@ class UserCustomerDataAdaptor:
self.user_id = user_id self.user_id = user_id
self.customer_id = customer_id self.customer_id = customer_id
self.compare_index_id = index_id self.compare_index_id = index_id
self.valueSex = ''
p_end_date = pd.to_datetime(end_date).date() p_end_date = pd.to_datetime(end_date).date()
p_end_date = datetime.date(year=p_end_date.year, month=p_end_date.month, day=1) - datetime.timedelta(days=1) # p_end_date = datetime.date(year=p_end_date.year, month=p_end_date.month, day=1) - datetime.timedelta(days=1)
self.end_date = pd.to_datetime(str(p_end_date)) self.end_date = pd.to_datetime(str(p_end_date))
self.end_date = pd.to_datetime("2020-12-18") # self.end_date = pd.to_datetime("2020-12-25")
p_start_date = datetime.date(year=p_end_date.year, month=p_end_date.month, day=1) p_start_date = datetime.date(year=p_end_date.year, month=p_end_date.month, day=1)
self.month_start_date = p_start_date self.month_start_date = p_start_date
self.month_start_date = pd.to_datetime("2020-12-01") # self.month_start_date = pd.to_datetime("2020-12-01")
self.user_customer_order_df = self.get_user_customer_order_data() self.user_customer_order_df = self.get_user_customer_order_data()
self.fund_nav_total, self.fund_cnav_total = self.get_customer_fund_nav_data() self.fund_nav_total, self.fund_cnav_total = self.get_customer_fund_nav_data()
self.index_df = self.get_customer_index_nav_data() self.index_df = self.get_customer_index_nav_data()
...@@ -80,10 +83,10 @@ class UserCustomerDataAdaptor: ...@@ -80,10 +83,10 @@ class UserCustomerDataAdaptor:
tamp_diagnose_app_session = tamp_diagnose_app.session tamp_diagnose_app_session = tamp_diagnose_app.session
tamp_product_session = tamp_product.session tamp_product_session = tamp_product.session
tamp_fund_session = tamp_fund.session tamp_fund_session = tamp_fund.session
sql_user = """select f1.fund_id, f2.realname,f3.customer_name,f1.type,f1.order_type,f1.pay_date,f1.subscription_fee,f1.confirm_share_date,f1.confirm_share,f1.confirm_amount,f1.nav,f1.folio_name from tamp_order.customer_order_view f1, tamp_user.user_info f2,tamp_user.customer_info f3 where f2.id=f1.user_id and f3.id=f1.customer_id and f1.delete_tag=0 and user_id='{}' and customer_id='{}'""".format(self.user_id, self.customer_id) sql_user = """select f1.fund_id, f2.realname,f3.customer_name,f3.valueSex,f1.type,f1.order_type,f1.pay_date,f1.subscription_fee,f1.confirm_share_date,f1.confirm_share,f1.confirm_amount,f1.nav,f1.folio_name from tamp_diagnose_app.customer_order_view f1, tamp_user.user_info f2,tamp_diagnose_app.customer_view f3 where f2.id=f1.user_id and f3.id=f1.customer_id and f1.delete_tag=0 and user_id='{}' and customer_id='{}'""".format(self.user_id, self.customer_id)
cur = tamp_diagnose_app_session.execute(sql_user) cur = tamp_diagnose_app_session.execute(sql_user)
data = cur.fetchall() data = cur.fetchall()
order_df = pd.DataFrame(list(data), columns=['fund_id', 'username', 'customer_name', 'type', 'order_type', 'pay_date', order_df = pd.DataFrame(list(data), columns=['fund_id', 'username', 'customer_name', 'valueSex', 'type', 'order_type', 'pay_date',
'subscription_fee', 'confirm_share_date', 'confirm_share', 'subscription_fee', 'confirm_share_date', 'confirm_share',
'confirm_amount', 'nav', 'folio_name']) 'confirm_amount', 'nav', 'folio_name'])
cur_fund_id = list(order_df["fund_id"].unique()) cur_fund_id = list(order_df["fund_id"].unique())
...@@ -103,11 +106,26 @@ class UserCustomerDataAdaptor: ...@@ -103,11 +106,26 @@ class UserCustomerDataAdaptor:
if len(fund_df) > 0: if len(fund_df) > 0:
product_df = product_df.append(fund_df) product_df = product_df.append(fund_df)
product_df = product_df.drop_duplicates("fund_id") product_df = product_df.drop_duplicates("fund_id")
fund_type3 = order_df[order_df["type"] == 3]
if len(fund_type3) > 0:
type3_fund_id = list(fund_type3["fund_id"].unique())
fund_list_str_3 = str(type3_fund_id).replace("[", "(").replace("]", ")")
sql_fund_3 = "select distinct `id`, `fund_name`, `substrategy` from `ifa_imported_fund_info` where `id` in {}".format(
fund_list_str_3)
cur = tamp_fund_session.execute(sql_fund_3)
data = cur.fetchall()
fund_df_3 = pd.DataFrame(list(data), columns=['fund_id', 'fund_name', 'substrategy'])
fund_df_3["freq"] = 1
if len(fund_df_3) > 0:
product_df = product_df.append(fund_df_3)
product_df = product_df.drop_duplicates("fund_id")
user_customer_order_df = order_df.set_index('fund_id').join(product_df.set_index('fund_id')).reset_index() user_customer_order_df = order_df.set_index('fund_id').join(product_df.set_index('fund_id')).reset_index()
user_customer_order_df["confirm_share_date"] = user_customer_order_df["confirm_share_date"].apply(lambda x: pd.to_datetime(x.date())) user_customer_order_df["confirm_share_date"] = user_customer_order_df["confirm_share_date"].apply(lambda x: pd.to_datetime(x.date()))
self.customer_real_name = user_customer_order_df["customer_name"].values[0] self.customer_real_name = user_customer_order_df["customer_name"].values[0]
self.ifa_real_name = user_customer_order_df["username"].values[0] self.ifa_real_name = user_customer_order_df["username"].values[0]
self.valueSex = user_customer_order_df["valueSex"].values[0]
user_customer_order_df = user_customer_order_df[user_customer_order_df["confirm_share_date"] <= self.end_date] user_customer_order_df = user_customer_order_df[user_customer_order_df["confirm_share_date"] <= self.end_date]
user_customer_order_df["confirm_amount"] = user_customer_order_df["confirm_amount"] - user_customer_order_df["subscription_fee"] user_customer_order_df["confirm_amount"] = user_customer_order_df["confirm_amount"] - user_customer_order_df["subscription_fee"]
user_customer_order_df.index = pd.Series(range(len(user_customer_order_df))) user_customer_order_df.index = pd.Series(range(len(user_customer_order_df)))
...@@ -166,6 +184,10 @@ class UserCustomerDataAdaptor: ...@@ -166,6 +184,10 @@ class UserCustomerDataAdaptor:
sql = """select distinct `price_date`, `nav`,`cumulative_nav` from `fund_nav` where `fund_id`='{}' order by `price_date` ASC""".format( sql = """select distinct `price_date`, `nav`,`cumulative_nav` from `fund_nav` where `fund_id`='{}' order by `price_date` ASC""".format(
cur_fund_id) cur_fund_id)
cur = tamp_product_session.execute(sql) cur = tamp_product_session.execute(sql)
elif fund_type == 3:
sql = """select distinct `price_date`, `nav`,`cumulative_nav` from `ifa_imported_fund_nav` where `fund_id`='{}' order by `price_date` ASC""".format(
cur_fund_id)
cur = tamp_fund_session.execute(sql)
data = cur.fetchall() data = cur.fetchall()
cur_fund_nav_df = pd.DataFrame(list(data), columns=['price_date', 'nav', 'cnav']) cur_fund_nav_df = pd.DataFrame(list(data), columns=['price_date', 'nav', 'cnav'])
...@@ -340,6 +362,8 @@ class UserCustomerDataAdaptor: ...@@ -340,6 +362,8 @@ class UserCustomerDataAdaptor:
cnav_df = p_cnav_df[p_cnav_df.index >= start_date].copy() cnav_df = p_cnav_df[p_cnav_df.index >= start_date].copy()
p_fund_id_list = list(p_order_df["fund_id"].unique()) p_fund_id_list = list(p_order_df["fund_id"].unique())
self.all_fund_id_list = p_fund_id_list
self.all_fund_type_dict = {values["fund_id"]: values["type"] for values in p_order_df[["fund_id", "type"]].drop_duplicates().to_dict(orient='records')}
for p_fund_id in p_fund_id_list: for p_fund_id in p_fund_id_list:
order_min_date = p_order_df[p_order_df["fund_id"] == p_fund_id]["confirm_share_date"].min() order_min_date = p_order_df[p_order_df["fund_id"] == p_fund_id]["confirm_share_date"].min()
if pd.to_datetime(order_min_date) > start_date: if pd.to_datetime(order_min_date) > start_date:
......
...@@ -10,7 +10,7 @@ import pandas as pd ...@@ -10,7 +10,7 @@ import pandas as pd
import numpy as np import numpy as np
import datetime import datetime
from decimal import Decimal from decimal import Decimal
from app.service.data_service_v2 import UserCustomerDataAdaptor from app.service.data_service_v2_1 import UserCustomerDataAdaptor
from app.service.portfolio_diagnose import cal_correlation, get_fund_name, get_frequency from app.service.portfolio_diagnose import cal_correlation, get_fund_name, get_frequency
from app.utils.week_evaluation import * from app.utils.week_evaluation import *
...@@ -188,7 +188,7 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor): ...@@ -188,7 +188,7 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
"return_ratio_year": "%.2f" % round(return_ratio_year*100, 2)} "return_ratio_year": "%.2f" % round(return_ratio_year*100, 2)}
# 对应指数数据 # 对应指数数据
index_df = self.get_customer_index_nav_data() index_df = self.get_customer_index_nav_data().dropna()
index_result = self.signal_fund_profit_result(index_df[index_df.index >= pd.to_datetime(first_trade_date)], index_result = self.signal_fund_profit_result(index_df[index_df.index >= pd.to_datetime(first_trade_date)],
"index") "index")
folio_report_data["index_result"] = index_result folio_report_data["index_result"] = index_result
...@@ -209,13 +209,13 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor): ...@@ -209,13 +209,13 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
report_data = {} report_data = {}
cur_folio_result_cnav_data = self.total_customer_order_cnav_df.copy() cur_folio_result_cnav_data = self.total_customer_order_cnav_df.copy()
cur_folio_order_data = self.user_customer_order_df cur_folio_order_data = self.user_customer_order_df.copy()
freq_max = cur_folio_order_data["freq"].max() # freq_max = cur_folio_order_data["freq"].max()
# freq_list = [get_frequency(cur_folio_result_cnav_data[[p_nav]]) for p_nav in freq_list = [get_frequency(cur_folio_result_cnav_data[[p_nav]]) for p_nav in
# cur_folio_result_cnav_data.columns] cur_folio_result_cnav_data.columns]
# freq_dict = {250: 1, 52: 2, 24: 4, 12: 3, 4: 5} freq_dict = {250: 1, 52: 2, 24: 4, 12: 3, 4: 5}
# freq_max = freq_dict[min(freq_list)] freq_max = freq_dict[min(freq_list)]
#
fund_id_list = list(cur_folio_order_data["fund_id"].unique()) fund_id_list = list(cur_folio_order_data["fund_id"].unique())
fund_id_list_earn = [i + "_earn" for i in fund_id_list] fund_id_list_earn = [i + "_earn" for i in fund_id_list]
fund_id_list_amount = [i + "_net_amount" for i in fund_id_list] fund_id_list_amount = [i + "_net_amount" for i in fund_id_list]
...@@ -371,7 +371,7 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor): ...@@ -371,7 +371,7 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
report_data["cumulative_return"] = float(cumulative_return) report_data["cumulative_return"] = float(cumulative_return)
# 对应指数数据 # 对应指数数据
index_df = self.get_customer_index_nav_data() index_df = self.get_customer_index_nav_data().dropna()
index_result = self.signal_fund_profit_result(index_df[index_df.index >= pd.to_datetime(first_trade_date)], "index") index_result = self.signal_fund_profit_result(index_df[index_df.index >= pd.to_datetime(first_trade_date)], "index")
report_data["index_result"] = index_result report_data["index_result"] = index_result
...@@ -406,8 +406,8 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor): ...@@ -406,8 +406,8 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
# 申购以来 # 申购以来
confirm_date = pd.to_datetime(row["confirm_share_date"]) confirm_date = pd.to_datetime(row["confirm_share_date"])
confirm_cnav = float(p_result_cnav_data.loc[confirm_date, cur_fund_id]) confirm_cnav = float(p_result_cnav_data.loc[confirm_date, cur_fund_id])
fund_basic_info["ret_after_confirm"] = str(round( fund_basic_info["ret_after_confirm"] = round(
(fund_basic_info["cur_cnav"] - confirm_cnav) / confirm_cnav * 100, 2)) + "%" (fund_basic_info["cur_cnav"] - confirm_cnav) / confirm_cnav * 100, 2)
# 分红 # 分红
distribution_df = self.all_fund_distribution[cur_fund_id] distribution_df = self.all_fund_distribution[cur_fund_id]
if distribution_df.empty: if distribution_df.empty:
...@@ -634,6 +634,6 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor): ...@@ -634,6 +634,6 @@ class UserCustomerResultAdaptor(UserCustomerDataAdaptor):
folio_cnav_data = folio_cnav_data.fillna(method="bfill") folio_cnav_data = folio_cnav_data.fillna(method="bfill")
old_correlation = cal_correlation(folio_cnav_data) old_correlation = cal_correlation(folio_cnav_data)
old_correlation = old_correlation.fillna(1).round(2) old_correlation = old_correlation.fillna(1).round(2)
old_correlation.columns = old_correlation.columns.map(lambda x: get_fund_name(x).values[0][0]) old_correlation.columns = old_correlation.columns.map(lambda x: get_fund_name(x, self.all_fund_type_dict[x]).values[0][0])
old_correlation.index = old_correlation.index.map(lambda x: get_fund_name(x).values[0][0]) old_correlation.index = old_correlation.index.map(lambda x: get_fund_name(x, self.all_fund_type_dict[x]).values[0][0])
return old_correlation return old_correlation
...@@ -57,7 +57,8 @@ class DataIntegrate: ...@@ -57,7 +57,8 @@ class DataIntegrate:
'suggestions_result_asset': {}, 'suggestions_result_asset': {},
'return_compare_pic': [], 'return_compare_pic': [],
'indicator_compare': [], 'indicator_compare': [],
'new_group_evaluation': [] 'new_group_evaluation': [],
"correlation": group_result["correlation"]
} }
# 旧持仓组合点评 # 旧持仓组合点评
...@@ -83,8 +84,15 @@ class DataIntegrate: ...@@ -83,8 +84,15 @@ class DataIntegrate:
self.all_folio_result[group_name] = cur_group_portfolio_result self.all_folio_result[group_name] = cur_group_portfolio_result
def get_portfolio_diagnose(self, portfolio, client_type=1, invest_amount=10000000): def get_portfolio_diagnose(self, portfolio, client_type=1, invest_amount=10000000):
portfolio_diagnose = PortfolioDiagnose(client_type=client_type, portfolio=portfolio, invest_amount=float(invest_amount), if invest_amount < 10000000:
invest_amount = 10000000
folio_fund_dict = {}
for fd in portfolio:
folio_fund_dict[fd] = self.user_customer.all_fund_type_dict[fd]
portfolio_diagnose = PortfolioDiagnose(client_type=client_type, portfolio=folio_fund_dict,
invest_amount=float(invest_amount),
start_date=self.user_customer.start_date) start_date=self.user_customer.start_date)
if self.type == 2:
portfolio_diagnose.optimize() portfolio_diagnose.optimize()
return portfolio_diagnose return portfolio_diagnose
...@@ -167,10 +175,11 @@ class DataIntegrate: ...@@ -167,10 +175,11 @@ class DataIntegrate:
def get_old_correlation(self, portfolio_diagnose, cur_group_portfolio_result): def get_old_correlation(self, portfolio_diagnose, cur_group_portfolio_result):
"""旧相关性分析.""" """旧相关性分析."""
old_correlation = portfolio_diagnose.old_correlation old_correlation = cur_group_portfolio_result["correlation"]
old_correlation_columns = old_correlation.columns.tolist() old_correlation_columns = old_correlation.columns.tolist()
old_correlation_values = old_correlation.values.tolist() old_correlation_values = old_correlation.values.tolist()
cur_group_portfolio_result["old_correlation"] = list(zip(range(1, len(old_correlation_columns)+1), old_correlation_columns, old_correlation_values)) cur_group_portfolio_result["old_correlation"] = list(zip(range(1, len(old_correlation_columns)+1), old_correlation_columns, old_correlation_values))
del cur_group_portfolio_result["correlation"]
def get_new_correlation(self, portfolio_diagnose, cur_group_portfolio_result): def get_new_correlation(self, portfolio_diagnose, cur_group_portfolio_result):
"""新相关性分析.""" """新相关性分析."""
...@@ -258,7 +267,7 @@ class DataIntegrate: ...@@ -258,7 +267,7 @@ class DataIntegrate:
data = { data = {
# 全局数据 # 全局数据
'customer_name': self.customer_name, 'customer_name': self.customer_name,
'year_month': self.user_customer.month_start_date.strftime("%Y-%m-%d"), 'year_month': self.user_customer.end_date.strftime("%Y-%m-%d"),
'valueSex': self.user_customer.valueSex, 'valueSex': self.user_customer.valueSex,
'month': self.user_customer.month_start_date.strftime("%m"), 'month': self.user_customer.month_start_date.strftime("%m"),
'start_date': self.user_customer.start_date.strftime("%Y-%m-%d"), 'start_date': self.user_customer.start_date.strftime("%Y-%m-%d"),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment