mplfinance库的主要作用
mplfinance
是一个基于Matplotlib的金融数据可视化库,专注于生成金融时间序列图表,尤其适用于股票、加密货币等市场的分析。其核心功能包括:
绘制K线图(蜡烛图):展示开盘价、最高价、最低价、收盘价(OHLC)的波动形态
技术指标叠加:支持移动平均线(MA)、布林带(Bollinger Bands)、成交量柱状图等
多子图与自定义样式:通过外部轴模式(子图)同时展示价格与成交量,或自定义颜色、网格线等视觉元素
动态图表与动画
:支持实时数据更新和动态展示(需结合其他库如matplotlib.animation
常用函数及参数
1. 核心函数:mpf.plot()
用于绘制基础金融图表,核心参数如下:
参数 | 说明 | 示例 |
---|---|---|
data |
包含OHLC数据的Pandas DataFrame,索引需为DatetimeIndex ,列名需包含Open 、High 、Low 、Close (必选),Volume (可选) |
mpf.plot(data, type='candle') |
type |
图表类型:'candle' (K线图)、'line' (折线图)、'renko' (砖型图)、'pnf' (点数图) |
type='candle' |
volume |
是否显示成交量柱状图(需数据含Volume 列) |
volume=True |
mav |
移动平均线周期(整数或元组):mav=10 (单条均线)、mav=(5,20) (多条均线) |
mav=(5,10,30) |
style |
预设样式:'yahoo' 、'classic' 、'charles' 等,或自定义样式 |
style='yahoo' |
title |
图表标题(需避免中文,需额外设置字体) | title='AAPL Stock Price' |
ylabel |
主图Y轴标签(默认显示价格) | ylabel='Price ($)' |
ylabel_lower |
成交量子图Y轴标签 | ylabel_lower='Volume' |
show_nontrading |
是否显示非交易日(默认False ,数据间无间隔) |
show_nontrading=True |
savefig |
保存图表路径(如savefig='chart.png' ) |
savefig='output.png' |
示例代码:
import mplfinance as mpf
import pandas as pd
# 示例数据(需包含OHLC和Volume列)
data = pd.DataFrame({
'Open': [100, 102, 101],
'High': [105, 106, 107],
'Low': [99, 101, 100],
'Close': [102, 103, 104],
'Volume': [10000, 12000, 9000]
}).set_index(pd.date_range('2023-01-01', periods=3))
# 绘制K线图+成交量+均线
mpf.plot(
data,
type='candle',
volume=True,
mav=(5,10),
style='yahoo',
title='示例K线图',
ylabel='Price',
ylabel_lower='Volume'
)
2. 扩展函数
(1) mpf.make_addplot()
用于在主图上叠加附加图表(如均线、技术指标):
# 添加EMA20均线
apds = [mpf.make_addplot(data['EMA20'], color='red', panel=0)]
mpf.plot(data, addplot=apds)
(2) mpf.make_mpf_style()
自定义图表样式(颜色、网格线等):
custom_style = mpf.make_mpf_style(
base_mpf_style='yahoo',
rc={'axes.labelcolor': 'blue'}
)
mpf.plot(data, style=custom_style)
关键使用注意事项
数据格式要求:
- DataFrame必须包含
Open
、High
、Low
、Close
列,索引为DatetimeIndex
。 - 若需成交量,需包含Volume列
- DataFrame必须包含
中文显示问题:
需提前设置Matplotlib字体参数:
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 黑体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
性能优化:
大数据集建议使用downsample=’mean’
参数降采样,或限制显示时间范围
MarkupSafe库的核心作用
MarkupSafe
是一个专注于安全字符串处理的Python库,主要用于防止Web开发中的跨站脚本攻击(XSS)。其核心功能包括:
- 自动转义危险字符:将
<
、>
、&
等字符转换为HTML实体(如<
、>
、&
),避免恶意代码注入。 - 安全字符串标记:通过
Markup
类标记已转义的字符串为“安全”,防止模板引擎二次转义。 - 与模板引擎集成:无缝支持Jinja2、Flask等框架,确保动态内容渲染时的安全性
常用函数与类
1. 核心函数
escape(s)
将字符串中的危险字符转义为HTML实体,返回转义后的字符串。from markupsafe import escape escaped = escape('<script>alert("XSS")</script>') print(escaped) # 输出: <script>alert("XSS")</script>
Markup(s)
创建一个“安全字符串”对象,标记内容为已转义且无需二次处理。
示例:from markupsafe import Markup safe_html = Markup('<b>Bold Text</b>') print(safe_html) # 输出: <b>Bold Text</b>(直接输出原始字符)
2. 字符串操作方法
__add__
(拼接)
支持安全字符串的拼接,结果仍为安全字符串。
示例:part1 = Markup('<h1>标题</h1>') part2 = Markup('<p>内容</p>') combined = part1 + part2 # 结果为安全字符串
format(\*args, \**kwargs)
安全地格式化字符串,自动转义占位符中的危险字符。
示例:template = Markup('Hello, {name}!') rendered = template.format(name='<script>alert("XSS")</script>') print(rendered) # 输出: Hello, <script>alert("XSS")</script>!
unescape()
将安全字符串还原为原始字符串(需谨慎使用)。
示例:safe_str = Markup('<em>Hello</em>') raw_str = safe_str.unescape() # 输出: <em>Hello</em>
3. 高级功能
自定义转义规则
通过传递自定义函数给escape()
覆盖默认转义行为。
def custom_escape(s):
return s.replace('&', '&').replace('<', '<')
escaped = escape('<&>', custom_escape) # 输出: <&
实际应用场景
1. 防止用户输入注入
在Web表单中处理用户评论或搜索内容时,自动转义危险字符:
from flask import Flask, request
from markupsafe import escape
app = Flask(__name__)
@app.route('/comment', methods=['POST'])
def post_comment():
user_comment = request.form.get('comment')
safe_comment = escape(user_comment) # 转义用户输入
return f"<div>Comment: {safe_comment}</div>"
2. 模板引擎安全渲染
与Jinja2集成,自动转义模板变量:
from jinja2 import Template
from markupsafe import Markup
template = Template("Profile: {{ user_input }}")
rendered = template.render(user_input=Markup('<script>alert("XSS")</script>'))
# 输出: Profile: <script>alert("XSS")</script>(安全显示)
3. 动态生成HTML内容
构建安全的HTML列表或表格:
items = [1, 2, '<script>alert("XSS")</script>']
safe_items = [Markup(f"<li>{item}</li>") for item in items]
html = "<ul>" + "".join(safe_items) + "</ul>"
# 输出: <ul><li>1</li><li>2</li><li><script>alert("XSS")</script></li></ul>
注意事项
类型限制:escape()
仅接受字符串或Markup对象,传递其他类型会报错
性能优化:对大量数据频繁转义时,建议复用
Markup
对象以减少开销。与模板引擎配合:Jinja2默认自动转义变量,但显式使用
Markup
可明确标记安全内容
以下是关于Python的Flask
库的核心功能、常用装饰器及函数的详细解析,结合其轻量级Web框架的设计特点:
Flask库的主要作用
Flask是一个轻量级Web框架,核心作用包括:
- 快速构建Web应用:通过路由、模板引擎和请求处理机制简化开发流程。
- 模块化设计:支持蓝图(Blueprint)划分功能模块,适合中大型项目
- 扩展性强:通过扩展(如Flask-SQLAlchemy、Flask-Login)集成数据库、认证等功能。
- 灵活性高:开发者可自由选择组件(如模板引擎、数据库ORM)。
常用装饰器
1. 路由与请求处理
@app.route()
定义URL路由,绑定视图函数。支持动态路由参数和HTTP方法限制。
示例:@app.route('/user/<username>') # 动态路由 def show_user(username): return f"User: {username}" @app.route('/submit', methods=['POST']) # 限制请求方法 def submit_form(): return "处理表单提交"
@app.before_request
&@app.after_request
在请求处理前/后执行函数,用于权限校验、日志记录等。
示例:@app.before_request def check_auth(): if not request.headers.get('Authorization'): return "未授权", 401 @app.after_request def add_header(response): response.headers['X-Custom-Header'] = 'FlaskDemo' return response
@app.errorhandler()
处理特定HTTP错误(如404、500)。
示例:@app.errorhandler(404) def page_not_found(error): return render_template('404.html'), 404
2. 认证与权限
@login_required
(Flask-Login扩展)保护路由,仅允许已登录用户访问。
from flask_login import login_required @app.route('/dashboard') @login_required def dashboard(): return "控制面板"
3. 上下文管理
@app.context_processor
向所有模板注入全局变量。
@app.context_processor def inject_user(): return dict(current_user=get_current_user())
三、常用函数
1. 请求处理相关
request
获取客户端请求数据(如参数、表单、JSON)。
示例:from flask import request @app.route('/search') def search(): keyword = request.args.get('q') # 获取查询参数 return f"搜索关键词:{keyword}"
render_template()
渲染HTML模板并返回响应。
示例:from flask import render_template @app.route('/') def home(): return render_template('index.html', title='首页')
2. 响应生成相关
jsonify()
将Python对象转换为JSON响应。
示例:from flask import jsonify @app.route('/data') def get_data(): data = {'name': 'Alice', 'age': 30} return jsonify(data)
redirect()
重定向到指定URL。
示例:from flask import redirect, url_for @app.route('/old-page') def old_page(): return redirect(url_for('new_page')) # 重定向到新路由
3. 应用配置相关
app.config.from_pyfile()
从配置文件加载设置
示例
app.config.from_pyfile('config.cfg') # 加载config.cfg中的配置
四、自定义装饰器示例
1. 参数校验装饰器
from functools import wraps
from flask import request, jsonify
def validate_json(*expected_keys):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
data = request.get_json()
if not all(key in data for key in expected_keys):
return jsonify({"error": "缺少参数"}), 400
return func(data, *args, **kwargs)
return wrapper
return decorator
@app.route('/api/data', methods=['POST'])
@validate_json('username', 'password')
def create_user(data):
# 处理用户创建逻辑
return jsonify({"message": "用户创建成功"})
2. 认证装饰器
from functools import wraps
from flask import request, abort
def api_key_required(func):
@wraps(func)
def wrapper(*args, **kwargs):
api_key = request.headers.get('X-API-Key')
if api_key != 'SECRET_KEY':
abort(403) # 禁止访问
return func(*args, **kwargs)
return wrapper
@app.route('/secure-endpoint')
@api_key_required
def secure_endpoint():
return "授权访问成功"
akshare库的主要作用
akshare
是一个开源的金融数据接口库,专注于提供多市场、多周期的金融数据获取功能,其核心作用包括:
- 覆盖广泛的数据类型:包括股票、期货、基金、外汇、数字货币、宏观经济等
- 支持实时与历史数据:提供实时行情(如A股、期货)和历史数据(日线、分钟线)
- 数据格式标准化:返回Pandas DataFrame,便于后续分析与可视化
- 本地化数据源适配:整合国内主流财经平台(如东方财富、新浪财经)的数据接口