import dash
import pandas as pd
from dash import html
import feffery_antd_charts as fact
import feffery_antd_components as fac
from dash.dependencies import Input, Output, State
# 读入原始数据
raw_stock_data = pd.read_csv('./A股_股票日线行情数据_20220223_20220311.csv',
dtype={'股票代码': 'str'},
parse_dates=['交易日期'])
stock_data = raw_stock_data.copy()
stock_data['交易日期'] = stock_data['交易日期'].dt.strftime('%Y-%m-%d')
stock_data = (
stock_data
.groupby(['TS代码', '股票代码', '股票名称', '地域', '所属行业', '上市时间'])
.apply(
lambda df: (
df
.sort_values('交易日期')
.agg({
'收盘价': lambda s: s.tolist(),
'涨跌额': lambda s: s.tolist(),
'涨跌幅': lambda s: s.tolist(),
'成交量(手)': lambda s: s.tolist(),
'成交额(千元)': lambda s: s.tolist()
})
)
)
.reset_index(drop=False)
)
stock_data['周期涨幅'] = stock_data['收盘价'].apply(lambda l: (l[-1] - l[0]) / l[0])
app = dash.Dash(__name__, update_title=None)
app.title = '股票分析应用 - 公众号【玩转dash】出品'
app.layout = html.Div(
[
fac.AntdRow(
[
fac.AntdCol(
html.Div(
[
fac.AntdAlert(
message=[
'通过点击下表每行左侧单选框,选择你需要进一步分析的股票',
'更多dash应用开发专业知识欢迎关注公众号【玩转dash】'
],
showIcon=True,
messageRenderMode='loop-text'
),
fac.AntdTable(
id='all-stocks-info-table',
columns=[
{
'title': '股票名称',
'dataIndex': '股票名称',
'fixed': 'left',
'width': 100
},
{
'title': 'TS代码',
'dataIndex': 'TS代码',
'width': 100
},
{
'title': '股票代码',
'dataIndex': '股票代码',
'width': 100
},
{
'title': '地域',
'dataIndex': '地域',
'width': 100
},
{
'title': '所属行业',
'dataIndex': '所属行业',
'width': 100
},
{
'title': '上市时间',
'dataIndex': '上市时间',
'width': 100
},
{
'title': '收盘价',
'dataIndex': '收盘价',
'width': 100,
'renderOptions': {
'renderType': 'mini-area'
}
},
{
'title': '涨跌额',
'dataIndex': '涨跌额',
'width': 100,
'renderOptions': {
'renderType': 'mini-area'
}
},
{
'title': '涨跌幅',
'dataIndex': '涨跌幅',
'width': 100,
'renderOptions': {
'renderType': 'mini-area'
}
},
{
'title': '成交量(手)',
'dataIndex': '成交量(手)',
'width': 100,
'renderOptions': {
'renderType': 'mini-bar'
}
},
{
'title': '成交额(千元)',
'dataIndex': '成交额(千元)',
'width': 100,
'renderOptions': {
'renderType': 'mini-bar'
}
}
],
sortOptions={
'sortDataIndexes': ['上市时间']
},
filterOptions={
'股票代码': {
'filterMode': 'keyword'
},
'TS代码': {
'filterMode': 'keyword'
},
'地域': {},
'所属行业': {},
'股票名称': {
'filterMode': 'keyword'
}
},
rowSelectionType='radio',
maxWidth=1100,
data=stock_data.to_dict('records'),
bordered=True,
miniChartHeight=25,
pagination={
'pageSize': 15,
'showSizeChanger': False,
'showQuickJumper': True,
'showTotalPrefix': '共有股票 ',
'showTotalSuffix': ' 只'
}
)
],
style={
'boxShadow': '0 6px 16px rgb(107 147 224 / 14%)',
'borderRadius': '10px',
'padding': '20px',
'height': '100%'
}
),
span=12
),