Shu's Garden - 可视化
type: channel
link: https://www.sitstars.com/tag/%E5%8F%AF%E8%A7%86%E5%8C%96/
items: python web可视化框架Dash介绍与使用
items: 量化交易可视化-plotly改写版
items: 利用python进行数据收集、整理、分析和绘图的全过程

python web可视化框架Dash介绍与使用
type: item
date: 2021-01-19T22:31:32+08:00
description: 前言之前工作的时候，需要写一个日内交易信号监控软件，预计的功能是实时更新数据，出现信号时有提示功能（比如颜色变化和声音提醒）。如果可能的话最好也有可视化功能。我第一时间就想到了plotly同家出品的Dash，它是一个python Web可视化框架库，之前就有兴趣学，但是因为懒所以一直没有入手。需求来了才开始看文档，边看边翻译、实践，花了几天就写出了一个简单的网站。我个人还是挺满意的，所以也打算出一期教程介绍一下Dash。先把之前翻译的文档放上来把，之后有时间就讲一些高级用法。下文均翻译自https://dash.plotly.com/，算是一些比较基础的用法，有些地方可能是机翻的，最好还是去官网看。如果你有html和plotly基础，那入门应该会相当快，没有也没关系，我就不懂html，仿照着官网例子也能写。安装pip install dash布局基本用法首先，使用以下代码创建一个名为 app.py 的文件。import dash import dash_core_components as dcc import dash_html_components as html import plotly.express as px import pandas as pd external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css'] app = dash.Dash(__name__, external_stylesheets=external_stylesheets) # assume you have a "long-form" data frame # see https://plotly.com/python/px-arguments/ for more options df = pd.DataFrame({ "Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"], "Amount": [4, 1, 2, 2, 4, 5], "City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"] }) fig = px.bar(df, x="Fruit", y="Amount", color="City", barmode="group") app.layout = html.Div(children=[ html.H1(children='Hello Dash'), html.Div(children=''' Dash: A web application framework for Python. '''), dcc.Graph( id='example-graph', figure=fig ) ]) if __name__ == '__main__': app.run_server(debug=True)然后运行程序$ python app.py访问 http://127.0.0.1:8050/效果如下： 注意：布局由一个“组件”树组成，比如 html.Div 和 dcc.Graph。对于每个 HTML 标记，dash_html_components 库都有一个组件。html.H1(children='Hello Dash')组件在应用程序中生成一个 Hello Dash HTML 元素。并非所有组件都是纯 HTML。dash_core_components 是可交互式高级组件，通过 React.js 库用 JavaScript、HTML 和 CSS 生成。每个组件都是通过关键字属性来描述的。dash 是声明式语法：主要通过这些属性描述应用程序。children 属性是特殊的。按照惯例，它总是第一个属性，这意味着您可以忽略它：html.H1(children='Hello Dash') 等价于 html.H1('Hello Dash')。它还可以包含字符串、数字、单个组件或组件列表。应用程序中的字体看起来与此处显示的字体略有不同。此应用程序使用自定义 CSS 样式表来修改元素的默认样式。您可以在 https://dash.plotly.com/external-resources 中了解更多信息，但现在您可以使用external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css'] app = dash.Dash(__name__, external_stylesheets=external_stylesheets)获得和示例相同的样式。…

量化交易可视化-plotly改写版
type: item
date: 2020-07-17T20:54:00+08:00
description: 前言之前也写过一些关于可视化的文章，比如：[post cid="43" /][post cid="84" /]不过都是比较基础的入门内容。最近在学量化，有位开发者整理了常见的量化图表，原文章，都是用matplotlib和seaborn做的。我个人还是更倾向于颜值高又可交互的plotly的，所以把他的代码改写为plotly。大多数能改成功，也有一些我不知道怎么实现的，只能搁置了，若有大神知道代码怎么写，欢迎评论区留言。前置首先导入相关库，并作相应的设置import numpy as np import pandas as pd import plotly.express as px import plotly.graph_objects as go from plotly.subplots import make_subplots import plotly.figure_factory as ff import matplotlib.pyplot as plt import plotly plotly.offline.init_notebook_mode(connected=True) # 这个是作图的初始设定，因为我嫌默认的字体太小了，所以改得大了些 layout = dict(title_x=0.5, # title居中 font=dict(family="Times New Roman",size=20,color="RebeccaPurple"), # 字体设置 coloraxis_colorbar=dict(xanchor="left",x=0.75,ticks="outside"), # 颜色条设置 margin=dict(b= 40,l=40, r=40, t= 40) # 大小设置 )数据仍然使用原作者提供的美股5家上市公司日线数据，我手动下载下来又传到github上了，大家使用的时候可以下载原数据，或者直接读取远程连接。github地址：https://github.com/caly5144/shu-s-project/tree/master/quan/visual下面就是获取数据的代码，主要有两种，默认是只使用特斯拉的日线数据，后面作相关性热力图的时候会用到第二种数据，这里提前把数据整理了一下，由长格式数据转为宽格式数据。def get_date(is_tesla=1): df = pd.read_excel('data.xlsx') # 也可以直接读取下面的远程连接，无需再手动下载数据了 #df = pd.read_csv('https://cdn.jsdelivr.net/gh/caly5144/shu-s-project/quan/visual/data.csv') if is_tesla: df = df[df['code']=='usTSLA'] df = df.reset_index() else: df = df'time', 'code', 'p_change' df = df.pivot_table(index=["time"],columns=["code"],values=["p_change"]) df.columns = df.columns.droplevel(0) df.index.name = None df = df.reset_index().dropna() df = df.rename(columns={'index':'time'}) print(df) return df作图价格与均线首先是最简单的折线图，一般用于展示股票价格变化代码def plot(): # 普通折线图 df = get_date() fig = px.line(df, x="time", y="close",title='tsla close').update_layout(layout) plotly.offline.plot(fig)效果 当然也可以同时展示多个指标或股票，加个color=参数即可。def price(): # 价格与均线 df = get_date() for window in [30,60,90]: df[str(window)+' mv'] = df['close'].rolling(window).mean() df = df.melt(id_vars='time',value_vars=['close', '30 mv','60 mv','90 mv']) fig = px.line(df, x="time", y="value", color="variable",labels={"variable": "指标"})\ .update_layout(l…

利用python进行数据收集、整理、分析和绘图的全过程
type: item
date: 2019-10-22T00:04:36+08:00
description: 这是github上的一个项目，作为数据分析基础入门是非常好的，于是我把它译为中文，希望对大家有所帮助。原文地址代码均已在本地测试通过。要求在此存储库中，我将记录收集数据，处理数据并进行可视化的完整过程。该项目中使用的数据集是国家数据-社会保障卡应用中心的婴儿名字，其中包括1880年至2018年的记录。需要安装python3与以下库：Requests - 下载数据集.pandas - 进行数据分析.NumPy - 矩阵运算.Matplotlib - 绘图.seaborn - 美化图.获取数据import requests url = "https://www.ssa.gov/oact/babynames/names.zip" with requests.get(url) as response: with open("names.zip", "wb") as temp_file: temp_file.write(response.content)提示：如果因为网速等问题下载失败，可手动复制链接到浏览器中下载。这就将数据的zip包下载到我们电脑中了，它包括了各年份数据的txt文件与一个说明pdf文档，我们需要做的是读取txt文件，进行处理并保存到csv中。这个新的csv文件将成为我们的数据集，并将包含4个字段（年份，名称，性别和数量）import csv from zipfile import ZipFile # 这两个都是内置模块，无需安装 data_list = "year", "name", "gender", "count" # 此列表将保存我们的所有数据。我们使用标题行对其进行初始化。 with ZipFile("names.zip") as temp_zip: # 读取zip对象 for file_name in temp_zip.namelist(): # 读取文件列表 if ".txt" in file_name: # 只读取txt文档 with temp_zip.open(file_name) as temp_file: # 从压缩包中读取这个txt for line in temp_file.read().decode("utf-8").splitlines(): # 文件以二进制形式打开，我们使用utf-8对其进行解码，以便可以将其作为字符串进行操作。 # 准备好我们所需的数据字段并将其添加到列表中. line_chunks = line.split(",") year = file_name[3:7] name = line_chunks[0] gender = line_chunks[1] count = line_chunks[2] data_list.append([year, name, gender, count]) # 保存成csv csv.writer(open("data.csv", "w", newline="", encoding="utf-8")).writerows(data_list)首先我们声明一个data_list，它是一个二维数组。目的是为了稍后我们可以用csv.writer.writerows()方法保存到csv中。（我更喜欢用writerows()而不是writerow()，因为它更快）接下来的步骤都有注释，就不再赘述了。数据探索（Data Exploration）基础信息首先导入相关库import matplotlib.pyplot as plt import numpy as np import pandas as pd import seaborn as sns接着我们使用pandas.read_csv()方法读取csvdf = pd.read_csv("data.csv") # 由于我们的数据集非常简单，因此我们不需要设置任何特殊标志或额外参数，默认值就足够了。让我们从经典的df.head()和df.tail()方法开始，他们分别能查看数据集前几行和后几行。df.head() # 前五行 >>> year name gender count 0 1880 Mary F 7065 1 1880 Anna F 2604 2 1880 Emma F 2003 3 1880 Elizabeth F 1939 4 1880 Minnie F 1746 df.tail() # 后五行 >>> year name gender count 1957041 2018 Zylas M 5 1957042 2018 Zyran M 5 1957043 2018 Zyrie M 5 1957044 2018 Zyron M 5 1957045 2018 Zzyzx M 5这些样…