Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in
Toggle navigation
F
fund_report
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
彭熊
fund_report
Commits
3de4dd83
Commit
3de4dd83
authored
Dec 07, 2020
by
pengxiong@wealthgrow.cn
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
生成pdf
parent
3bf46d55
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
73 additions
and
134 deletions
+73
-134
monthReportV2.html
app/templates/v2/monthReportV2.html
+11
-19
fund_rank.py
app/utils/fund_rank.py
+47
-106
html_to_pdf.py
app/utils/html_to_pdf.py
+1
-1
jinjia2html.py
app/utils/jinjia2html.py
+14
-8
No files found.
app/templates/v2/monthReportV2.html
View file @
3de4dd83
...
...
@@ -903,7 +903,7 @@
<div
class=
"box0"
>
<div
class=
"cover_head dtable"
>
<div
class=
"dcell"
>
<img
src=
"./img/logo.png"
alt=
""
class=
"cover_logo"
>
<img
src=
{{logo}}
alt=
""
class=
"cover_logo"
>
</div>
<div
class=
"dcell"
>
<div
class=
"cover_line"
></div>
...
...
@@ -920,13 +920,13 @@
敬呈
</span>
<span
class=
"cover_name"
>
王晶
{{customer_name}}
</span>
<span
class=
"cover_sir"
>
先生
</span>
</div>
<img
src=
"./img/cover-back.png"
alt=
""
class=
"cover_back"
>
<img
src=
{{cover_back}}
alt=
""
class=
"cover_back"
>
<div
class=
"cover_date"
>
<div
class=
"cover_time"
>
2020.10
...
...
@@ -985,7 +985,7 @@
</div>
<div
class=
"page_head dcell"
>
<div
class=
"dcell"
>
<img
src=
"./img/logo.png"
alt=
""
class=
"page_logo"
>
<img
src=
{{logo}}
alt=
""
class=
"page_logo"
>
</div>
<div
class=
"dcell"
>
<div
class=
"page_line"
></div>
...
...
@@ -1167,9 +1167,6 @@
<td>
{{value[12]["profit"]}}
</td>
<!-- <td>-->
<!-- {{value[13]["profit"]}}-->
<!-- </td>-->
</tr>
<tr>
<td>
...
...
@@ -1211,11 +1208,6 @@
<td>
{{value[12]["net_amount"]}}
</td>
<!-- <td>-->
<!-- {{value[13]["net_amount"]}}-->
<!-- </td> <td>-->
<!-- {{value[13]["net_amount"]}}-->
<!-- </td>-->
</tr>
{%endfor%}
</table>
...
...
@@ -1234,7 +1226,7 @@
</div>
<div
class=
"page_head dcell"
>
<div
class=
"dcell"
>
<img
src=
"./img/logo.png"
alt=
""
class=
"page_logo"
>
<img
src=
{{logo}}
alt=
""
class=
"page_logo"
>
</div>
<div
class=
"dcell"
>
<div
class=
"page_line"
></div>
...
...
@@ -1460,7 +1452,7 @@
</div>
<div
class=
"page_head dcell"
>
<div
class=
"dcell"
>
<img
src=
"./img/logo.png"
alt=
""
class=
"page_logo"
>
<img
src=
{{logo}}
alt=
""
class=
"page_logo"
>
</div>
<div
class=
"dcell"
>
<div
class=
"page_line"
></div>
...
...
@@ -1612,7 +1604,7 @@
</div>
<div
class=
"page_head dcell"
>
<div
class=
"dcell"
>
<img
src=
"./img/logo.png"
alt=
""
class=
"page_logo"
>
<img
src=
{{logo}}
alt=
""
class=
"page_logo"
>
</div>
<div
class=
"dcell"
>
<div
class=
"page_line"
></div>
...
...
@@ -1697,7 +1689,7 @@
</div>
<div
class=
"page_head dcell"
>
<div
class=
"dcell"
>
<img
src=
"./img/logo.png"
alt=
""
class=
"page_logo"
>
<img
src=
{{logo}}
alt=
""
class=
"page_logo"
>
</div>
<div
class=
"dcell"
>
<div
class=
"page_line"
></div>
...
...
@@ -1921,7 +1913,7 @@
</div>
<div
class=
"page_head dcell"
>
<div
class=
"dcell"
>
<img
src=
"./img/logo.png"
alt=
""
class=
"page_logo"
>
<img
src=
{{logo}}
alt=
""
class=
"page_logo"
>
</div>
<div
class=
"dcell"
>
<div
class=
"page_line"
></div>
...
...
@@ -2004,7 +1996,7 @@
<div
class=
"financial_show dtable"
>
<div
class=
"financial_left dcell"
>
<div
class=
"financial_scene"
>
<img
src=
"./img/scene.png
"
alt=
""
class=
"financial_scene_img"
>
<img
src=
{{scene}}
"
alt=
""
class=
"financial_scene_img"
>
<div
class=
"financial_scene_text"
>
我们挣的是⻆度和变化的钱⽽不是纠正市场错 误的钱,市场永远是正确的,关键是在其正确 被反复证明后的逆向⽽⾏,⼀定是避开它的正 确被展开的过程 。
</div>
...
...
@@ -2015,7 +2007,7 @@
</div>
<div
class=
"financial_show_right dcell"
>
<div
class=
"financial_team"
>
<img
src=
"./img/team.png"
alt=
""
class=
"financial_team_img"
>
<img
src=
{{team}}
alt=
""
class=
"financial_team_img"
>
</div>
</div>
</div>
...
...
app/utils/fund_rank.py
View file @
3de4dd83
...
...
@@ -8,7 +8,7 @@
import
logging
logging
.
basicConfig
(
level
=
logging
.
INFO
)
from
app.api.engine
import
tamp_fund_engine
,
TAMP_SQL
,
tamp_product_engine
from
app.api.engine
import
tamp_fund_engine
,
TAMP_SQL
from
app.utils.week_evaluation
import
*
...
...
@@ -32,70 +32,39 @@ def get_nav(fund, start_date, rollback=False, invest_type='public'):
Returns:df[DataFrame]: 索引为净值公布日, 列为复权净值的净值表; 查询失败则返回None
"""
with
TAMP_SQL
(
tamp_fund_engine
)
as
tamp_
fund
:
tamp_
fund_session
=
tamp_fund
.
session
with
TAMP_SQL
(
tamp_fund_engine
)
as
tamp_
product
:
tamp_
product_session
=
tamp_product
.
session
if
invest_type
==
'public'
:
sql
=
"SELECT ts_code, end_date, adj_nav FROM public_fund_nav "
\
"WHERE ts_code='{}'"
.
format
(
fund
)
cur
=
tamp_
fund
_session
.
execute
(
sql
)
cur
=
tamp_
product
_session
.
execute
(
sql
)
data
=
cur
.
fetchall
()
df
1
=
pd
.
DataFrame
(
list
(
data
),
columns
=
[
'fund_id'
,
'end_date'
,
'adj_nav'
])
.
dropna
(
how
=
'any'
)
df
1
.
rename
({
'ts_code'
:
'fund_id'
},
axis
=
1
,
inplace
=
True
)
df
=
pd
.
DataFrame
(
list
(
data
),
columns
=
[
'fund_id'
,
'end_date'
,
'adj_nav'
])
.
dropna
(
how
=
'any'
)
df
.
rename
({
'ts_code'
:
'fund_id'
},
axis
=
1
,
inplace
=
True
)
else
:
sql
=
"SELECT fund_id, price_date, cumulative_nav FROM fund_nav "
\
"WHERE fund_id='{}'"
.
format
(
fund
)
# df = pd.read_sql(sql, con).dropna(how='any')
cur
=
tamp_fund_session
.
execute
(
sql
)
data
=
cur
.
fetchall
()
df1
=
pd
.
DataFrame
(
data
,
columns
=
[
'fund_id'
,
'price_date'
,
'cumulative_nav'
])
.
dropna
(
how
=
'any'
)
df1
.
rename
({
'price_date'
:
'end_date'
,
'cumulative_nav'
:
'adj_nav'
},
axis
=
1
,
inplace
=
True
)
# if df1['adj_nav'].count() == 0:
# logging.log(logging.ERROR, "CAN NOT FIND {}".format(fund))
# return None
df1
[
'end_date'
]
=
pd
.
to_datetime
(
df1
[
'end_date'
])
if
rollback
and
df1
[
'end_date'
]
.
min
()
<
start_date
<
df1
[
'end_date'
]
.
max
():
while
start_date
not
in
list
(
df1
[
'end_date'
]):
start_date
-=
datetime
.
timedelta
(
days
=
1
)
df1
=
df1
[
df1
[
'end_date'
]
>=
start_date
]
df1
.
drop_duplicates
(
subset
=
'end_date'
,
inplace
=
True
,
keep
=
'first'
)
# df1.set_index('end_date', inplace=True)
# df1.sort_index(inplace=True, ascending=True)
with
TAMP_SQL
(
tamp_product_engine
)
as
tamp_product
:
tamp_product_session
=
tamp_product
.
session
if
invest_type
==
"private"
:
sql
=
"SELECT fund_id, price_date, cumulative_nav FROM fund_nav "
\
"WHERE fund_id='{}'"
.
format
(
fund
)
# df = pd.read_sql(sql, con).dropna(how='any')
cur
=
tamp_product_session
.
execute
(
sql
)
data
=
cur
.
fetchall
()
df
2
=
pd
.
DataFrame
(
data
,
columns
=
[
'fund_id'
,
'price_date'
,
'cumulative_nav'
])
.
dropna
(
how
=
'any'
)
df
2
.
rename
({
'price_date'
:
'end_date'
,
'cumulative_nav'
:
'adj_nav'
},
axis
=
1
,
inplace
=
True
)
df
=
pd
.
DataFrame
(
data
,
columns
=
[
'fund_id'
,
'price_date'
,
'cumulative_nav'
])
.
dropna
(
how
=
'any'
)
df
.
rename
({
'price_date'
:
'end_date'
,
'cumulative_nav'
:
'adj_nav'
},
axis
=
1
,
inplace
=
True
)
# if df2
['adj_nav'].count() == 0:
#
logging.log(logging.ERROR, "CAN NOT FIND {}".format(fund))
#
return None
if
df
[
'adj_nav'
]
.
count
()
==
0
:
logging
.
log
(
logging
.
ERROR
,
"CAN NOT FIND {}"
.
format
(
fund
))
return
None
df
2
[
'end_date'
]
=
pd
.
to_datetime
(
df2
[
'end_date'
])
df
[
'end_date'
]
=
pd
.
to_datetime
(
df
[
'end_date'
])
if
rollback
and
df
2
[
'end_date'
]
.
min
()
<
start_date
<
df2
[
'end_date'
]
.
max
():
while
start_date
not
in
list
(
df
2
[
'end_date'
]):
if
rollback
and
df
[
'end_date'
]
.
min
()
<
start_date
<
df
[
'end_date'
]
.
max
():
while
start_date
not
in
list
(
df
[
'end_date'
]):
start_date
-=
datetime
.
timedelta
(
days
=
1
)
df2
=
df2
[
df2
[
'end_date'
]
>=
start_date
]
df2
.
drop_duplicates
(
subset
=
'end_date'
,
inplace
=
True
,
keep
=
'first'
)
# df2.set_index('end_date', inplace=True)
# df2.sort_index(inplace=True, ascending=True)
df
=
pd
.
concat
([
df1
,
df2
])
df
.
drop_duplicates
(
subset
=
'end_date'
,
inplace
=
True
,
keep
=
'first'
)
df
.
set_index
(
'end_date'
,
inplace
=
True
)
df
.
sort_index
(
inplace
=
True
,
ascending
=
True
)
return
df
df
=
df
[
df
[
'end_date'
]
>=
start_date
]
df
.
drop_duplicates
(
subset
=
'end_date'
,
inplace
=
True
,
keep
=
'first'
)
df
.
set_index
(
'end_date'
,
inplace
=
True
)
df
.
sort_index
(
inplace
=
True
,
ascending
=
True
)
return
df
def
get_frequency
(
df
):
...
...
@@ -132,10 +101,10 @@ def get_trade_cal():
Returns:df[DataFrame]: 索引为交易日, 列为交易日的上交所交易日历表
"""
with
TAMP_SQL
(
tamp_fund_engine
)
as
tamp_
fund
:
tamp_
fund_session
=
tamp_fund
.
session
with
TAMP_SQL
(
tamp_fund_engine
)
as
tamp_
product
:
tamp_
product_session
=
tamp_product
.
session
sql
=
'SELECT cal_date FROM stock_trade_cal WHERE is_open=1'
cur
=
tamp_
fund
_session
.
execute
(
sql
)
cur
=
tamp_
product
_session
.
execute
(
sql
)
data
=
cur
.
fetchall
()
df
=
pd
.
DataFrame
(
list
(
data
),
columns
=
[
'cal_date'
])
.
dropna
(
how
=
'all'
)
# df = pd.read_sql(sql, con)
...
...
@@ -153,31 +122,21 @@ def get_manager(invest_type):
Returns:
"""
with
TAMP_SQL
(
tamp_fund_engine
)
as
tamp_
fund
:
tamp_
fund_session
=
tamp_fund
.
session
with
TAMP_SQL
(
tamp_fund_engine
)
as
tamp_
product
:
tamp_
product_session
=
tamp_product
.
session
if
invest_type
==
'public'
:
sql
=
'SELECT ts_code, name FROM public_fund_manager WHERE end_date IS NULL'
# df = pd.read_sql(sql, con)
cur
=
tamp_
fund
_session
.
execute
(
sql
)
cur
=
tamp_
product
_session
.
execute
(
sql
)
data
=
cur
.
fetchall
()
df
1
=
pd
.
DataFrame
(
list
(
data
),
columns
=
[
'ts_code'
,
'name'
])
df
=
pd
.
DataFrame
(
list
(
data
),
columns
=
[
'ts_code'
,
'name'
])
else
:
sql
=
'SELECT fund_id, fund_manager_id
, management_start_date
FROM fund_manager_mapping'
sql
=
'SELECT fund_id, fund_manager_id FROM fund_manager_mapping'
# df = pd.read_sql(sql, con)
cur
=
tamp_fund_session
.
execute
(
sql
)
data
=
cur
.
fetchall
()
df1
=
pd
.
DataFrame
(
list
(
data
),
columns
=
[
'fund_id'
,
'fund_manager_id'
,
'management_start_date'
])
with
TAMP_SQL
(
tamp_product_engine
)
as
tamp_product
:
tamp_product_session
=
tamp_product
.
session
if
invest_type
==
'private'
:
sql
=
'SELECT fund_id, fund_manager_id, management_start_date FROM fund_manager_mapping'
cur
=
tamp_product_session
.
execute
(
sql
)
data
=
cur
.
fetchall
()
df2
=
pd
.
DataFrame
(
list
(
data
),
columns
=
[
'fund_id'
,
'fund_manager_id'
,
'management_start_date'
])
df
=
pd
.
concat
([
df1
,
df2
])
.
drop_duplicates
()
return
df
df
=
pd
.
DataFrame
(
list
(
data
),
columns
=
[
'fund_id'
,
'fund_manager_id'
])
return
df
def
get_fund_info
(
end_date
,
invest_type
):
...
...
@@ -190,49 +149,33 @@ def get_fund_info(end_date, invest_type):
Returns:
[type]: [description]
"""
with
TAMP_SQL
(
tamp_fund_engine
)
as
tamp_
fund
:
tamp_
fund_session
=
tamp_fund
.
session
with
TAMP_SQL
(
tamp_fund_engine
)
as
tamp_
product
:
tamp_
product_session
=
tamp_product
.
session
if
invest_type
==
'public'
:
sql
=
"SELECT ts_code, fund_type, management FROM public_fund_basic "
\
"WHERE delist_date IS NULL AND (due_date IS NULL OR due_date>'{}')"
.
format
(
end_date
.
strftime
(
'
%
Y
%
m
%
d'
))
# df = pd.read_sql(sql, con).dropna(how='all')
cur
=
tamp_
fund
_session
.
execute
(
sql
)
cur
=
tamp_
product
_session
.
execute
(
sql
)
data
=
cur
.
fetchall
()
df
1
=
pd
.
DataFrame
(
list
(
data
),
columns
=
[
'fund_id
'
,
'fund_type'
,
'management'
])
#
manager_info = get_manager(invest_type)
df
=
pd
.
DataFrame
(
list
(
data
),
columns
=
[
'ts_code
'
,
'fund_type'
,
'management'
])
manager_info
=
get_manager
(
invest_type
)
# df1
.rename({'ts_code': 'fund_id'}, axis=1, inplace=True)
#
df = pd.merge(df, manager_info, how="left", on='fund_id')
df
.
rename
({
'ts_code'
:
'fund_id'
},
axis
=
1
,
inplace
=
True
)
df
=
pd
.
merge
(
df
,
manager_info
,
how
=
"left"
,
on
=
'fund_id'
)
else
:
sql
=
"SELECT id, substrategy FROM fund_info WHERE delete_tag=0 "
\
"AND substrategy!=-1"
cur
=
tamp_fund_session
.
execute
(
sql
)
data
=
cur
.
fetchall
()
df1
=
pd
.
DataFrame
(
list
(
data
),
columns
=
[
'fund_id'
,
'substrategy'
])
# df = pd.read_sql(sql, con).dropna(how='all')
# df1.rename({'id': 'fund_id'}, axis=1, inplace=True)
# manager_info = get_manager(invest_type)
# df = pd.merge(df, manager_info, how="inner", on='fund_id')
with
TAMP_SQL
(
tamp_product_engine
)
as
tamp_product
:
tamp_product_session
=
tamp_product
.
session
if
invest_type
==
"private"
:
sql
=
"SELECT id, substrategy FROM fund_info WHERE delete_tag=0 "
\
"AND substrategy!=-1"
cur
=
tamp_product_session
.
execute
(
sql
)
data
=
cur
.
fetchall
()
df
2
=
pd
.
DataFrame
(
list
(
data
),
columns
=
[
'fund_
id'
,
'substrategy'
])
df
=
pd
.
DataFrame
(
list
(
data
),
columns
=
[
'
id'
,
'substrategy'
])
# df = pd.read_sql(sql, con).dropna(how='all')
# df2.rename({'id': 'fund_id'}, axis=1, inplace=True)
# manager_info = get_manager(invest_type)
manager_info
=
get_manager
(
invest_type
)
df
=
pd
.
concat
([
df1
,
df2
])
.
drop_duplicates
()
df
=
pd
.
merge
(
df
,
manager_info
,
how
=
"inner"
,
on
=
'fund_id'
)
return
df
df
.
rename
({
'id'
:
'fund_id'
},
axis
=
1
,
inplace
=
True
)
manager_info
=
get_manager
(
invest_type
)
df
=
pd
.
merge
(
df
,
manager_info
,
how
=
"inner"
,
on
=
'fund_id'
)
return
df
def
resample
(
df
,
trading_cal
,
freq
,
simple_flag
=
True
):
...
...
@@ -333,12 +276,11 @@ def fund_rank(start_date, end_date, invest_type='private'):
continue
n
=
get_frequency
(
df
)
except
Exception
as
e
:
logging
.
log
(
logging
.
ERROR
,
repr
(
e
))
#
logging.log(logging.ERROR, repr(e))
logging
.
log
(
logging
.
INFO
,
'Skipped {}'
.
format
(
fund
))
skipped_funds
.
append
(
fund
)
continue
df
=
resample
(
df
,
trading_cal
,
n
,
simple_flag
=
False
)
df
=
resample
(
df
,
trading_cal
,
n
)
try
:
_
=
get_frequency
(
df
)
...
...
@@ -360,8 +302,7 @@ def fund_rank(start_date, end_date, invest_type='private'):
down_risk
=
downside_risk
(
sim_return
,
bank_rate
=
0.015
,
n
=
n
)
sor_ratio
=
sortino_ratio
(
ex_return
,
down_risk
,
n
)
manager
=
fund_info
[
fund_info
[
'fund_id'
]
==
fund
]
.
groupby
(
"management_start_date"
)
.
last
()
manager
=
manager
[
'fund_manager_id'
]
.
values
manager
=
fund_info
[
fund_info
[
'fund_id'
]
==
fund
][
'fund_manager_id'
]
.
values
# management = fund_info[fund_info['fund_id'] == fund]['management'].values
row
=
pd
.
Series
([
fund
,
rng_return
,
ann_return
,
drawdown
,
shp_ratio
,
...
...
@@ -383,8 +324,8 @@ def fund_rank(start_date, end_date, invest_type='private'):
if
__name__
==
'__main__'
:
end_date
=
datetime
.
datetime
.
now
()
-
datetime
.
timedelta
(
days
=
1
)
start_date
=
cal_date
(
end_date
,
'Y'
,
1
)
fund_rank
=
fund_rank
(
start_date
,
end_date
,
invest_type
=
"private"
)
fund_rank
.
to_csv
(
"fund_rank.csv"
,
encoding
=
'gbk'
)
df
=
pd
.
read_csv
(
'fund_rank.csv'
)
fund_rank
=
fund_rank
(
start_date
,
end_date
,
False
)
#
fund_rank.to_csv("fund_rank.csv", encoding='gbk')
#
df = pd.read_csv('fund_rank.csv')
# df.to_sql("fund_rank", con, if_exists='replace')
# con.close()
app/utils/html_to_pdf.py
View file @
3de4dd83
...
...
@@ -17,7 +17,7 @@ def html_to_pdf(source_path, target_path):
'encoding'
:
"utf-8"
,
# 'page-size': 'A5',
# 'page-width': '300mm',
# 'page-height': 'auto
',
'page-height'
:
'2.3mm
'
,
'margin-top'
:
'0mm'
,
'margin-right'
:
'0mm'
,
'margin-bottom'
:
'0mm'
,
...
...
app/utils/jinjia2html.py
View file @
3de4dd83
...
...
@@ -3,6 +3,7 @@ import uuid
from
jinja2
import
PackageLoader
,
Environment
from
app.api.engine
import
work_dir
,
pdf_folder
,
template_folder
from
app.service.portfolio_diagnose
import
portfolio_diagnose
from
app.service.result_service_v2
import
UserCustomerResultAdaptor
import
numpy
as
np
...
...
@@ -80,8 +81,6 @@ class DataIntegrate:
self
.
single_fund_data_list
=
[]
portfolio_evaluation
=
portfolio_diagnose
.
old_portfolio_evaluation
()
radar_chart_data
=
portfolio_diagnose
.
single_fund_radar
()
print
(
'***************************'
)
print
(
portfolio_evaluation
)
for
i
in
range
(
len
(
portfolio_evaluation
)):
if
portfolio_evaluation
[
i
][
'status'
]
==
'保留'
:
portfolio_evaluation
[
i
][
'status'
]
=
'<div class="self_type fl">保留</div>'
...
...
@@ -167,8 +166,15 @@ class DataIntegrate:
def
render_data
(
self
):
# 全部数据
data
=
{
'customer_name'
:
self
.
customer_name
,
'customer_gender'
:
'女'
,
'year_month'
:
'2020年10月'
,
'ifa_company'
:
'飞度工作室'
,
data
=
{
'cover_back'
:
template_folder
+
'/v2/img/cover-back.png'
,
'logo'
:
template_folder
+
'/v2/img/logo.png'
,
'scene'
:
template_folder
+
'/v2/img/scene/png'
,
'team'
:
template_folder
+
'/v2/img/team.png'
,
'customer_name'
:
self
.
customer_name
,
'customer_gender'
:
'女'
,
'year_month'
:
'2020年10月'
,
'ifa_company'
:
'飞度工作室'
,
'title'
:
'10月综述'
,
'brand_name'
:
'飞度工作室'
,
'customer_old'
:
42
,
'customer_level'
:
'平衡型'
,
# 'new_evaluation': self.new_evaluation,
...
...
@@ -219,10 +225,10 @@ class DataIntegrate:
# with open(save_file, 'w', encoding="utf-8") as f:
# f.write(monthReport_html)
save_file
=
"app/html/v2/monthReportV2.html"
with
open
(
save_file
,
'w'
,
encoding
=
"utf-8"
)
as
f
:
f
.
write
(
monthReport_html
)
# html_to_pdf(monthReport_html, '/Users/pengxiong/Desktop/fund_report/app/pdf/%s.pdf' %
str(uuid.uuid4()))
#
save_file = "app/html/v2/monthReportV2.html"
#
with open(save_file, 'w', encoding="utf-8") as f:
#
f.write(monthReport_html)
html_to_pdf
(
monthReport_html
,
pdf_folder
+
str
(
uuid
.
uuid4
()))
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment