亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python如何繪制持倉榜單的棒棒糖圖

發布時間:2021-11-25 14:21:14 來源:億速云 閱讀:128 作者:小新 欄目:大數據

這篇文章給大家分享的是有關Python如何繪制持倉榜單的棒棒糖圖的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

1. 需求

做股票分析的朋友經常會見到類似這種的期貨公司持倉榜單圖:

Python如何繪制持倉榜單的棒棒糖圖

這種圖就是棒棒糖圖。也就是我們今天文章的目標:

繪制出期貨持倉榜單的棒棒糖圖

圖中線的兩端是圓點或者菱形,旁邊都有標注持倉證券商和相對應的持多倉數或持空倉數,且左右線顏色不同。畫圖思路大體就是:先畫水平線圖,再用 scatter 散點圖畫線左右兩端的點,然后標注兩端名稱,以及標題和注解。

Python 中比較常用的兩種圖表庫是 matplotlib 和 plotly。上圖就是以 matplotlib 繪制。而 Plotly 交互性更好。

更進一步,如果想讓用戶可以點擊選擇交易日期,查看該日期對應的榜單圖,這就可以通過一個響應式 web 應用程序來實現。Dash 是一個基于 python 的交互式可視化 web 應用框架,matplotlib 和 Plotly 都可與 Dash 框架結合使用。

Matplotlib 大家比較熟悉。在開始之前,我們先簡單介紹下 plotly 和 Dash。

2. Plotly

plotly 庫(plotly.py)是一個交互式的開源繪圖庫,支持40多種獨特的圖表類型,涵蓋各種統計,財務,地理,科學和三維用例,是適用于Python,R 和 JavaScript 的交互式圖表庫。

plotly.py 建立在 Plotly JavaScript 庫(plotly.js)之上,使Python用戶可以創建基于 Web 的漂亮交互式可視化效果。這些可視化效果可以顯示在 Jupyter 筆記本中,可以保存到獨立的 HTML 文件中,也可以作為純 Python 使用。其官方文檔上提供了各種圖標的接口說明。

3. Dash

Dash 是用于構建 Web 應用程序的 Python 框架。Dash 建立在 Flask、Plotly.js 和 React.js 基礎之上,即 Dash 中的控件和其觸發事件都是用 React.js 包裝的,Plotly.js 為 Dash 提供強大的交互式數據可視化圖庫,Flask 為其提供后端框架。這個框架對 python 程序員特別友好,只需要寫 python 代碼,不需要寫 JS 代碼,直接拖拽控件來用即可。感興趣的童鞋可以去 Dash 的官方文檔多多了解一下。Dash 是使用純 Python 構建高度自定義用戶界面的數據可視化應用程序的理想選擇。它特別適合做數據分析、數據可視化以及儀表盤或者報告展示。可以將 Dash 應用程序部署到服務器,然后通過 URL 共享它們,不受平臺和環境的限制。

4. 安裝

在畫圖之前,我們需要裝一下 Dash、plotly 相關包。可以用 pip 裝:

pip install plotly dash
或者也可以用 conda 進行安裝。

5. 數據格式和數據處理

測試數據來自東方財富網,用 csv 文件格式保存。

數據的格式如下,header 是日期為第一列,第3列往后為期貨公司名字。表格中的負數是上面圖中藍色的空倉,正數是紅色的多倉。繪圖時,從表格中取出某一日期的一行記錄,將持倉數目排序,把對應的數據存入列表中,之后進行畫圖。

首先對數據進行清洗和處理, pandas讀取數據,這里需要去除 000905_SH 列,以及刪除全0行。代碼如下:

excel_pd = pd.read_excel('data/IC期貨商歷史數據(1).xlsx', index_col='日期')
# 去空
excel_pd.dropna()
# 去除000905_SH列
excel_pd = excel_pd.drop(labels='000905_SH', axis=1)
# 去0行
excel_pd = excel_pd[~(excel_pd == 0).all(axis=1)]
# 取出時間列表,獲取最大日期和最小日期,為日歷選項做判斷
date_list = excel_pd.index.values.tolist()
min_date = min(date_list)
max_date = max(date_list)

接下來我們需要根據輸入的日期來篩選某一行記錄,分別將持空倉期貨公司和持多倉期貨公司取出,剔除持倉數為0的期貨公司。代碼如下:

def get_data_via_date_from_excel(date):
    # 篩選日期
    sheet1_data = excel_pd.loc[date]
    # 去除列值為0
    sheet1_data = sheet1_data[sheet1_data != 0]
    # 排序 從小到大
    sheet1_data = sheet1_data.sort_values()
    # 空倉
    short_hold = sheet1_data[sheet1_data < 0]
    # 多倉
    long_hold = sheet1_data[sheet1_data >= 0].sort_values(ascending=False)
    return short_hold, long_hold

6. 畫圖

Matplotlib畫圖

創建一張畫布figure和ax畫圖層,用ax.hlines分別畫空倉水平線和多倉水平線。用ax.scatter畫左右兩邊線的散點,使用菱形marker。使用plt.text分別畫線兩端的標注期貨公司和持倉數。plt.annotate畫排名標注,分別設置顏色和字體大小。

Python如何繪制持倉榜單的棒棒糖圖

但這個效果是反的,我們是希望排名最前面的在上,排名最后面的下。這時我們可以設置y軸反置一下ax.invert_yaxis()。添加圖例和標題以及設置坐標軸不可見,得到最終效果:

核心代碼如下:

def draw_lollipop_graph(short_hold, long_hold, date):
    # sheet_major.index.values.tolist()
    fig, ax = plt.subplots(figsize=(10, 8))
    # 空倉水平線
    ax.hlines(y=[i for i in range(len(short_hold))], xmin=list(short_hold), xmax=[0] * len(short_hold.index), color='#1a68cc', label='空')
    # 多倉水平線
    ax.hlines(y=[i for i in range(len(long_hold))], xmax=list(long_hold), xmin=[0] * len(long_hold.index), color='red', label='多')
    # 畫散點
    ax.scatter(x=list(short_hold), y=[i for i in range(len(short_hold))], s=10, marker='d', edgecolors="#1a68cc", zorder=2, color='white')  # zorder設置該點覆蓋線
    ax.scatter(x=list(long_hold), y=[i for i in range(len(long_hold))], s=10, marker='d', edgecolors="red", zorder=2, color='white')  # zorder設置該點覆蓋線
    # 畫線兩端標注圖
    for x, y, label in zip(list(short_hold), range(len(short_hold)), short_hold.index):
        plt.text(x=x, y=y, s=label+'({}) '.format(abs(x)), horizontalalignment='right', verticalalignment='center', fontsize=10)
    for x, y, label in zip(list(long_hold), range(len(long_hold)), long_hold.index):
        plt.text(x=x, y=y, s=' '+label+'({})'.format(abs(x)), horizontalalignment='left', verticalalignment='center', fontsize=10)
    # 設置排名
    size = [17, 16, 15] + [8 for i in range(max(len(short_hold), len(long_hold))-3)]
    color = ['#b91818', '#e26012', '#dd9f10'] + ['#404040' for i in range(max(len(short_hold), len(long_hold))-3)]
    for i, s, c in zip(range(max(len(short_hold), len(long_hold))+1), size, color):
        plt.annotate(s=i+1, xy=(0, i), fontsize=s, ma='center', ha='center', color=c)
    # 坐標軸y反置
    ax.invert_yaxis()
    # 坐標軸不可見
    ax.set_xticks([])
    ax.set_yticks([])
    ax.spines['top'].set_visible(False)  # 去上邊框
    ax.spines['bottom'].set_visible(False)  # 去下邊框
    ax.spines['left'].set_visible(False)  # 去左邊框
    ax.spines['right'].set_visible(False)  # 去右邊框
    # 設置title
    ax.set_title('黃金持倉龍虎榜單({})'.format(date), position=(0.7, 1.07), fontdict=dict(fontsize=20, color='black'))
    # 自動獲取ax圖例句柄及其標簽
    handles, labels = ax.get_legend_handles_labels()
    plt.legend(handles=handles, ncol=2, bbox_to_anchor=(0.75, 1.05), labels=labels, edgecolor='white', fontsize=10)
    # 保存fig
    image_filename = "lollipop_rank.png"
    plt.savefig(image_filename)
    encoded_image = base64.b64encode(open(image_filename, 'rb').read())
    # plt.show()
    return encoded_image

感謝各位的閱讀!關于“Python如何繪制持倉榜單的棒棒糖圖”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

静宁县| 安义县| 依安县| 禄丰县| 无棣县| 吴旗县| 织金县| 乌鲁木齐县| 安溪县| 敦化市| 鄱阳县| 无棣县| 常山县| 额济纳旗| 定安县| 页游| 波密县| 墨脱县| 内乡县| 晋州市| 博爱县| 扶风县| 阳原县| 邵武市| 宁夏| 潞西市| 新干县| 吉安县| 顺昌县| 瓦房店市| 绥中县| 嘉义市| 长武县| 隆昌县| 托克托县| 台东市| 富宁县| 阳新县| 平泉县| 广州市| 昭苏县|