運(yùn)營(yíng)學(xué)Python|Python&Excel聯(lián)動(dòng)(上)

來(lái)源:簡(jiǎn)說(shuō)Python
作者:老表
一、寫(xiě)在前面
目前這個(gè)系列具體安排還沒(méi)想好((fang)擱(ge)置(zi)了好久),主要是圍繞Python自動(dòng)化辦公展開(kāi),至少包括Python對(duì)Excel、World、Txt等文件/數(shù)據(jù)處理、Python對(duì)系統(tǒng)文件處理、Python自動(dòng)發(fā)送郵件、Python數(shù)據(jù)爬取、Python模擬點(diǎn)擊登錄、Python數(shù)據(jù)可視化等方面。
希望讀者朋友也能從自己平時(shí)工作中提取一些實(shí)際需求,我也會(huì)幫助大家利用Python解決問(wèn)題、優(yōu)化工作流程、提升工作效率,加到本系列中。
本系列第一篇為:運(yùn)營(yíng)學(xué)Python|一文搞定編碼環(huán)境
本系列第二篇應(yīng)該是Python基礎(chǔ)知識(shí)的,正好之前有相關(guān)文章,大家可以前往學(xué)習(xí):
Python小知識(shí)匯總篇,全網(wǎng)2w+閱讀
搞定Python的幾個(gè)常用數(shù)據(jù)結(jié)構(gòu)!
今天這篇文章我們來(lái)講講如何通過(guò)Python玩轉(zhuǎn)Excel,本次分為上、中、下,上主要是打基礎(chǔ),全文1.2w+字,文中有一些為了演示講解相關(guān)功能的案例,還有三個(gè)相對(duì)完整的小實(shí)戰(zhàn)練習(xí),希望對(duì)大家了解xlwings有所幫助。
中和下主要是給大家分享其他庫(kù)操作excel,將以實(shí)戰(zhàn)為主,所以這里也希望大家多多提一些實(shí)際需求給我(涉及數(shù)據(jù)記得脫敏),提問(wèn)通道:瀏覽器訪問(wèn)下方鏈接或者點(diǎn)擊閱讀原文:
https://shimowendang.com/forms/tHrYqQGtRvV9vR3P/fill?channel=wc
由于本人水平有限,文中錯(cuò)誤,敬請(qǐng)指出,互相學(xué)習(xí),一起進(jìn)步。
二、基礎(chǔ)準(zhǔn)備
-
環(huán)境:python 3.7+ -
需要安裝第三方模塊:xlwings -
運(yùn)行編輯器:jupyter notebook
三、動(dòng)手動(dòng)腦
3.0 我們?yōu)槭裁匆獙W(xué)編程
首先和大家簡(jiǎn)單聊一下運(yùn)營(yíng)(這里運(yùn)營(yíng)不單單指?jìng)鹘y(tǒng)意義上的運(yùn)營(yíng)工作者,其實(shí)只有工作場(chǎng)景中有經(jīng)常用到office等辦公軟件,處理很多數(shù)據(jù)的都算)為什么要學(xué)習(xí)編程了?
站在我個(gè)人角度簡(jiǎn)單聊聊:
-
運(yùn)營(yíng)學(xué)編程絕不是為了解決上面這種簡(jiǎn)單 單一的問(wèn)題 -
我們希望的是通過(guò)編程提高工作效率、優(yōu)化工作流程 -
比如:批量處理excel文件(可能是1000或者更多行數(shù)據(jù)的增刪改)
3.1 環(huán)境準(zhǔn)備
首先需要你的電腦安裝好了Python環(huán)境,并且安裝好了Python開(kāi)發(fā)工具。
如果你還沒(méi)有安裝,可以參考以下文章:
如果僅用Python來(lái)處理數(shù)據(jù)、爬蟲(chóng)、數(shù)據(jù)分析或者自動(dòng)化腳本、機(jī)器學(xué)習(xí)等,建議使用Python基礎(chǔ)環(huán)境+jupyter即可,安裝使用參考Windows/Mac 安裝、使用Python環(huán)境+jupyter notebook
如果想利用Python進(jìn)行web項(xiàng)目開(kāi)發(fā)等,建議使用Python基礎(chǔ)環(huán)境+Pycharm,安裝使用參考 :Windows下安裝、使用Pycharm教程,這下全了 和 Mac下玩轉(zhuǎn)Python-安裝&使用Python/PyCharm 。
3.2 模塊安裝
本次實(shí)驗(yàn)是在jupyter notebook上進(jìn)行,默認(rèn)你已經(jīng)安裝好了Python基本環(huán)境和jupyter,如果沒(méi)有安裝可以看上面的環(huán)境安裝部分。
首先打開(kāi)終端,輸入:
jupyter notebook
即可進(jìn)入jupyter,會(huì)自動(dòng)連接服務(wù)器,并跳轉(zhuǎn)到網(wǎng)頁(yè),新建一個(gè)python文件。
給文件重命名,容易區(qū)分:
在代碼塊中輸入以下指令并運(yùn)行,即可安裝 xlwings(連接操作excel表格模塊):
!pip3 install xlwings --user
3.3 模塊基本介紹與使用
xlwings
基本介紹:用于Python與Excel之間的交互,可以輕松地從 Excel 調(diào)用 Python,也可以利用Python自動(dòng)化操作Excel,調(diào)用VBA,非常方便。
項(xiàng)目地址:https://github.com/xlwings/xlwings
基本使用方法:新建一個(gè)excel文件,取名為xlwings_wb.xlsx,并新建一個(gè)sheet,取名為first_sht,在其A1單元格內(nèi)插入字符串簡(jiǎn)說(shuō)Python。
# 導(dǎo)入xlwings,并起一個(gè)別名 xw,方便操作
import xlwings as xw
# 1、創(chuàng)建一個(gè)app應(yīng)用,打開(kāi)Excel程序
# visible=True 表示打開(kāi)操作Excel過(guò)程可見(jiàn) 初次接觸可以設(shè)置為T(mén)rue,了解其過(guò)程
# add_book=False 表示啟動(dòng)app后不用新建個(gè)工作簿
app = xw.App(visible=True, add_book=False)
# 2、新建一個(gè)工作簿
wb = app.books.add()
# 3、新建一個(gè)sheet,并操作
# 3.1 新建sheet 起名為first_sht
sht = wb.sheets.add('first_sht')
# 3.2 在新建的sheet表中A1位置插入一個(gè)值:簡(jiǎn)說(shuō)Python
sht.range('A1').value = '簡(jiǎn)說(shuō)Python'
# 3.3 保存新建的工作簿,并起一個(gè)名字
wb.save('xlwings_wb.xlsx')
# 4、關(guān)閉工作簿
wb.close()
# 5、程序運(yùn)行結(jié)束,退出Excel程序
app.quit()
通過(guò)簡(jiǎn)單五步,我們就可以完成新建一個(gè)excel,并向其中指定sheet中的指定位置輸入值了。
四、xlwings模塊實(shí)戰(zhàn)
4.1 基礎(chǔ)語(yǔ)法一覽
-
導(dǎo)包
# 基礎(chǔ)導(dǎo)入包
import xlwings as xw # 程序第一步
-
打開(kāi)關(guān)閉Excel程序(理解成excel軟件打開(kāi)、關(guān)閉)
# visible=True 表示打開(kāi)操作Excel過(guò)程可見(jiàn) 初次接觸可以設(shè)置為T(mén)rue,了解其過(guò)程
# add_book=False 表示啟動(dòng)app后不用新建個(gè)工作簿
app = xw.App(visible=True, add_book=False) # 程序第二步
# 關(guān)閉excel程序
app.close() # 程序最后一步
-
工作簿相關(guān)操作(理解成excel文件)
# 1、新建一個(gè)工作簿
wb = app.books.add() # 程序第三步
# 2、保存新建的工作簿,并起一個(gè)名字
# 程序倒數(shù)第三步,非常關(guān)鍵,保存操作數(shù)據(jù)結(jié)果
wb.save('xlwings_wb.xlsx')
# 3、打開(kāi)一個(gè)已經(jīng)存在的工作簿
wb = app.books.open('xlwings_wb.xlsx') # 程序第三步
# 4、關(guān)閉工作簿
wb.close() # 程序倒數(shù)第二步
-
sheet相關(guān)操作(理解成工作表)
# 在工作簿中新建一個(gè)sheet,起名為 second_sht
sht1 = wb.sheets.add('second_sht')
# 選中已經(jīng)存在的sheet
sht2 = wb.sheets('first_sht')
# 也可以通過(guò)索引選擇已存在的sheet
sht3 = wb.sheets[0] # 選中工作簿中的第一個(gè)sheet
# 獲取工作簿中工作表的個(gè)數(shù)
sht_nums = wb.sheets.count
print('工作簿中的sheet個(gè)數(shù)為:%d'% sht_nums)
# 當(dāng)前工作表名字
sht1.name
# 獲取指定sheet中數(shù)據(jù)的行數(shù)
sht1.used_range.last_cell.row
# 獲取指定sheet中數(shù)據(jù)的列數(shù)
sht1.used_range.last_cell.column
# 刪除指定的sheet 比如刪除:first_sht
wb.sheets('first_sht').delete()
-
單元格相關(guān)操作(就是excel單元格子)
'''
寫(xiě)入
'''
# 在工作表中指定位置插入數(shù)據(jù)
sht1.range('B1').value = '簡(jiǎn)說(shuō)Python'
# 在工作表指定位置插入多個(gè)數(shù)據(jù) 默認(rèn)是橫向插入
sht1.range('B2').value = [1, 2, 3, 4]
# 在工作表指定位置豎向插入多個(gè)數(shù)據(jù)
# 設(shè)置options(transpose=True),transpose=True表示轉(zhuǎn)置的意思
sht1.range('B3').options(transpose=True).value = ['老表', '老表Pro', '老表Max', '老表Mini']
# 在工作表指定位置開(kāi)始插入多行數(shù)據(jù)
sht1.range('B7').value = [['a', 'b'], ['c', 'd']]
# 在工作表指定位置開(kāi)始插入多列數(shù)據(jù)
sht1.range('B9').options(transpose=True).value = [['a', 'b'], ['c', 'd']]
# 向單元格寫(xiě)入公式
sht1.range('F2').formula = '=sum(B2:E2)'
'''
讀取
'''
# 在工作表中讀取指定位置數(shù)據(jù)
print('單元格B1=', sht1.range('B1').value)
# 在工作表中讀取指定區(qū)域數(shù)據(jù) 一行
print('單元格B2:F2=', sht1.range('B2:F2').value)
# 在工作表中讀取指定區(qū)域數(shù)據(jù) 一列
print('單元格B3:B6=', sht1.range('B3:B6').value)
# 在工作表中讀取指定區(qū)域數(shù)據(jù) 一個(gè)區(qū)域
# 設(shè)置options(transpose=True)就可以按列讀 不設(shè)置就是按行讀
print('單元格B7:C10=', sht1.range('B7:C10').options(transpose=True).value)
'''
刪除
'''
# 刪除指定單元格中的數(shù)據(jù)
sht1.range('B10').clear()
# 刪除指定范圍內(nèi)單元格數(shù)據(jù)
sht1.range('B7:B9').clear()
'''
格式修改
'''
# 選中已經(jīng)存在的sheet
sht1 = wb.sheets('second_sht')
# 返回單元格絕對(duì)路徑
sht1.range('B3').get_address()
# sht1.range('B3').address
# 合并單元格B3 C3
sht1.range('B3:C3').api.merge()
# 解除合并單元格B3 C3
sht1.range('B3:C3').api.unmerge()
# 向指定單元格添加帶超鏈接文本
# address- 超連接地址
# text_to_display- 超鏈接文本內(nèi)容
# screen_tip- 鼠標(biāo)放到超鏈接上后顯示提示內(nèi)容
sht1.range('C2').add_hyperlink(address='https://pythonbrief.blog.csdn.net/',
text_to_display='簡(jiǎn)說(shuō)Python CSDN博客',
screen_tip='點(diǎn)擊查看簡(jiǎn)說(shuō)Python CSDN博客')
# 獲取指定單元格的超鏈接地址
sht1.range('C2').hyperlink
# 自動(dòng)調(diào)試指定單元格高度和寬度
sht1.range('B1').autofit()
# 設(shè)置指定單元格背景顏色
sht1.range('B1').color = (93,199,221)
# 返回指定范圍內(nèi)的中第一列的編號(hào) 數(shù)字,如:A-1 B-2
sht1.range('A2:B2').column
# 獲取或者設(shè)置行高/列寬
# row_height/column_width會(huì)返回行高/列寬 ,范圍內(nèi)行高/列寬不一致會(huì)返回None
# 也可以設(shè)置一個(gè)新的行高/列寬
sht1.range('A2').row_height = 25
sht1.range('B2').column_width = 20
在windows上可以使用以下方法設(shè)置單元格文字顏色等格式,如下:
# windows系統(tǒng)下字體設(shè)置在 sheet.range().api.Font下
# 顏色
sht1.range('A1').api.Font.Color = (255,0,124)
# 字體名字
sht1.range('A1').api.Font.Name = '宋體'
# 字體大小
sht1.range('A1').api.Font.Size = 28
# 是否加粗
sht1.range('A1').api.Font.Bold = True
# 數(shù)字格式
sht1.range('A1').api.NumberFormat = '0.0'
# -4108 水平居中
# -4131 靠左
# -4152 靠右
sht1.range('A1').api.HorizontalAlignment = -4108
# -4108 垂直居中(默認(rèn))
# -4160 靠上
# -4107 靠下
# -4130 自動(dòng)換行對(duì)齊。
sht1.range('A1').api.VerticalAlignment = -4130
# 設(shè)置上邊框線風(fēng)格和粗細(xì)
sht1.range('A1').api.Borders(8).LineStyle = 5
sht1.range('A1').api.Borders(8).Weight = 3
...
在mac下可以通過(guò)以下方法設(shè)置字體格式:
# 設(shè)置單元格的字體顏色
rgb_tuple = (0, 10, 200)
sht1.range('B1').api.font_object.color.set(rgb_tuple)
# 獲取指定單元格字體顏色
sht1.range('B1').api.font_object.color.get()
# 獲取指定單元格字體名字 可以使用set方法修改字體 set('宋體')
sht1.range('B1').api.font_object.name.get()
# 設(shè)置指定單元格字體格式 可以用get方法查看單元格字體格式
sht1.range('B3').api.font_object.font_style.set('加粗')
# 設(shè)置指定單元格字體大小
sht1.range('B3').api.font_object.font_size.set(20)
# 設(shè)置邊框線粗細(xì)
sht1.range('B2').api.get_border(which_border=9).weight.set(4)
# 設(shè)置邊框線風(fēng)格
sht1.range('B2').api.get_border(which_border=9).line_style.set(8)
...
再次提醒,進(jìn)行完所有操作后一定要記得執(zhí)行以下三句:
# 保存新建的工作簿,并起一個(gè)名字(如果已存在有名字的excel文件,就直接save即可)
wb.save()
# 關(guān)閉工作簿(關(guān)閉Excel文件)
wb.close()
# 程序運(yùn)行結(jié)束,退出Excel程序
app.quit()
-
自動(dòng)生成統(tǒng)計(jì)圖
import xlwings as xw
# 新建一個(gè)sheet
app = xw.App(visible=True, add_book=False)
wb = app.books.open('xlwings_wb.xlsx')
sht3 = wb.sheets.add('third_sht')
import pandas as pd
import numpy as np
# 生成模擬數(shù)據(jù)
df = pd.DataFrame({
'money':np.random.randint(45, 50, size = [1, 20])[0],
},
index=pd.date_range('2021-02-01', '2021-02-20'), # 行索引和時(shí)間相關(guān)
)
df.index.name = '消費(fèi)日期' # 設(shè)置索引名字
sht3.range('A1').value = df
# 生成圖表
chart1 = sht3.charts.add() # 創(chuàng)建一個(gè)圖表對(duì)象
chart1.set_source_data(sht3.range('A1').expand()) # 加載數(shù)據(jù)
chart1.chart_type = 'line' # 設(shè)置圖標(biāo)類(lèi)型
chart1.top = sht3.range('D2').top
chart1.left = sht3.range('D2').left # 設(shè)置圖標(biāo)開(kāi)始位置
除了繪制折線圖,我們還可以繪制其他類(lèi)型的圖,修改chart_type值即可。
# 查看其他chart_types值
xw.constants.chart_types
返回結(jié)果,感興趣的讀者朋友可以自己試試~
('3d_area',
'3d_area_stacked',
'3d_area_stacked_100',
'3d_bar_clustered',
'3d_bar_stacked',
'3d_bar_stacked_100',
'3d_column',
'3d_column_clustered',
'3d_column_stacked',
'3d_column_stacked_100',
'3d_line', # 3D折線圖
'3d_pie', # 3D餅圖
'3d_pie_exploded',
'area', # 面積圖
'area_stacked',
'area_stacked_100',
'bar_clustered', # 柱狀圖相關(guān)
'bar_of_pie',
'bar_stacked',
'bar_stacked_100',
'bubble', # 氣泡圖
'bubble_3d_effect',
'column_clustered', # 條形圖相關(guān)
'column_stacked',
'column_stacked_100',
'combination',
'cone_bar_clustered',
'cone_bar_stacked',
'cone_bar_stacked_100',
'cone_col',
'cone_col_clustered',
'cone_col_stacked',
'cone_col_stacked_100',
'cylinder_bar_clustered',
'cylinder_bar_stacked',
'cylinder_bar_stacked_100',
'cylinder_col',
'cylinder_col_clustered',
'cylinder_col_stacked',
'cylinder_col_stacked_100',
'doughnut',
'doughnut_exploded',
'line', # 折線圖
'line_markers',
'line_markers_stacked',
'line_markers_stacked_100',
'line_stacked',
'line_stacked_100',
'pie',
'pie_exploded',
'pie_of_pie',
'pyramid_bar_clustered',
'pyramid_bar_stacked',
'pyramid_bar_stacked_100',
'pyramid_col',
'pyramid_col_clustered',
'pyramid_col_stacked',
'pyramid_col_stacked_100',
'radar',
'radar_filled',
'radar_markers',
'stock_hlc', # 有意思 股票K線圖
'stock_ohlc',
'stock_vhlc',
'stock_vohlc',
'surface',
'surface_top_view',
'surface_top_view_wireframe',
'surface_wireframe',
'xy_scatter',
'xy_scatter_lines',
'xy_scatter_lines_no_markers',
'xy_scatter_smooth',
'xy_scatter_smooth_no_markers')
-
將本地圖片或者matplotlib圖片保存到excel
'''
matplotlib 生成的圖片存入excel
'''
import matplotlib.pyplot as plt
# 隨便繪制一個(gè)餅圖
fig1 = plt.figure() # 先創(chuàng)建一個(gè)圖像對(duì)象
plt.pie([0.5, 0.3, 0.2], # 值
labels=['a', 'b', 'c'], # 標(biāo)簽
explode=(0, 0.2, 0), # (爆裂)距離
autopct='%1.1f%%', # 顯示百分?jǐn)?shù)格式
shadow=True) # 是否顯示陰影
plt.show()
# 將餅圖添加到excel指定位置 J17為圖片開(kāi)始位置
sht3.pictures.add(fig1, name='matplotlib',
left=sht3.range('J17').left,
top=sht3.range('J17').top, update=True)
'''
本地圖片存入excel
'''
# 將本地圖片添加到excel指定位置 J1為圖片開(kāi)始位置
pic_path = './0923.jpeg'
sht3.pictures.add(pic_path, name='local',
left=sht3.range('J1').left,
top=sht3.range('J1').top, update=True)
4.2 實(shí)戰(zhàn)練習(xí)一:將消費(fèi)數(shù)據(jù)可視化生成帶平均線的趨勢(shì)圖,存入excel
'''
實(shí)戰(zhàn)練習(xí)一:將消費(fèi)數(shù)據(jù)可視化生成帶平均線的趨勢(shì)圖,存入excel
數(shù)據(jù)就是之前生成的模擬數(shù)據(jù)
'''
import matplotlib.pyplot as plt
fig, ax = plt.subplots() # 創(chuàng)建一個(gè)畫(huà)板
# 生成一條新線- 平均消費(fèi)數(shù)據(jù)
money_m = [df['money'].mean(axis=0) for i in range(len(df['money']))]
# 建一條線:消費(fèi)趨勢(shì)折線圖
ax.plot(df.index, df['money'], color='#f16a0b', label='每日消費(fèi)')
# 再建一條線:平均消費(fèi)直線圖
ax.plot(df.index, money_m, linestyle='--', color='#301502', label='平均消費(fèi)')
# 設(shè)置橫縱坐標(biāo)基礎(chǔ)說(shuō)明
ax.set_xlabel(u'日期')
ax.set_ylabel(u'消費(fèi)金額/元')
ax.set_title(u'消費(fèi)折線圖')
# 設(shè)置x軸值顯示方向
plt.setp(ax.get_xticklabels(), rotation=70, horizontalalignment='right')
# 添加圖例(label說(shuō)明到圖片上) loc設(shè)置顯示位置
ax.legend(loc=2)
plt.show()
sht3.pictures.add(fig, name='消費(fèi)情況',
left=sht3.range('J1').left,
top=sht3.range('J1').top, update=True)
4.3 實(shí)戰(zhàn)練習(xí)二:將基金數(shù)據(jù)以指定的格式存儲(chǔ)到excel并生成基金凈值走勢(shì)圖
-
新建一個(gè)sheet,然后獲取數(shù)據(jù)
'''
實(shí)戰(zhàn)練習(xí)二:將股票數(shù)據(jù)以指定的格式存儲(chǔ)到excel并生成股票走勢(shì)圖
利用akshare爬取上證指數(shù)數(shù)據(jù) 代號(hào):sh000001
'''
import akshare as ak
import xlwings as xw
# -1、新建一個(gè)sheet
app = xw.App(visible=True, add_book=False)
wb = app.books.open('xlwings_wb.xlsx')
sz_sht = wb.sheets.add('sz_sht') # 第一次新建
# sz_sht = wb.sheets['sz_sht'] # 已經(jīng)存在,直接打開(kāi)
# 獲取數(shù)據(jù) open high low close volume index-date
# volume 是成交量 多少股
# 0、獲取數(shù)據(jù)
sz_index = ak.stock_zh_index_daily(symbol="sh000001")
sz_index
-
處理并存儲(chǔ)數(shù)據(jù)到excel
# 1、處理下數(shù)據(jù)
sz_data = sz_index['20210101':'20210922'].iloc[:,0:4] # 只取今年數(shù)據(jù) ohlc
sz_data.index = sz_data.index.strftime('%m-%d') # 將索引日期格式改為 月-日
# 2、存儲(chǔ)數(shù)據(jù)
sz_sht.range('A1').value = sz_data
-
處理表格中數(shù)據(jù)格式
# 3、處理數(shù)據(jù)格式
# - 表頭字體 格式加粗 背景顏色
sz_sht.range('A1:E1').api.font_object.name.set('Calibri')
sz_sht.range('A1:E1').api.font_object.font_style.set('加粗')
sz_sht.range('A1:E1').api.font_object.color.set((255, 255, 255))
# 背景顏色
sz_sht.range('A1:E1').color = (16, 156, 245)
# mac上居中未實(shí)現(xiàn),有了解的小伙伴可以留言指出下,感謝
# sz_sht.range('B1').api.font_object.horizontalalignment = xw.constants.Constants.xlCenter
# - 添加邊框
# 1 左+內(nèi)部豎線
sz_sht.range('A1:E177').api.get_border(which_border=1).weight.set(2)
# 10 最右側(cè)豎線
sz_sht.range('A1:E177').api.get_border(which_border=10).weight.set(2)
# 3 上+內(nèi)部橫線
sz_sht.range('A1:E177').api.get_border(which_border=3).weight.set(2)
# 9 最下面橫線
sz_sht.range('A1:E177').api.get_border(which_border=9).weight.set(2)
-
生成ohlc k線圖并存儲(chǔ)到excel指定位置
# 4、生成圖表
chart_ohlc = sz_sht.charts.add() # 創(chuàng)建一個(gè)圖表對(duì)象
chart_ohlc.set_source_data(sz_sht.range('A1').expand()) # 加載數(shù)據(jù)
chart_ohlc.chart_type = 'stock_ohlc' # 設(shè)置圖標(biāo)類(lèi)型
chart_ohlc.top = sz_sht.range('G2').top
chart_ohlc.left = sz_sht.range('G2').left # 設(shè)置圖標(biāo)開(kāi)始位置
4.4 實(shí)戰(zhàn)練習(xí)三:將基金數(shù)據(jù)以指定的格式存儲(chǔ)到excel并生成基金凈值走勢(shì)圖
-
創(chuàng)建一個(gè)新的sheet&獲取數(shù)據(jù)
'''
實(shí)戰(zhàn)練習(xí)三:將基金數(shù)據(jù)以指定的格式存儲(chǔ)到excel并生成基金凈值走勢(shì)圖
利用akshare爬取易方達(dá)藍(lán)籌基金數(shù)據(jù) 基金代號(hào):005827
'''
import akshare as ak
import matplotlib.pyplot as plt
import xlwings as xw
# 1、新建一個(gè)sheet&獲取數(shù)據(jù)
app = xw.App(visible=True, add_book=False)
wb = app.books.open('xlwings_wb.xlsx')
# sht_fund = wb.sheets.add('fund_sht')
sht_fund = wb.sheets['fund_sht']
# 凈值日期 單位凈值 日增長(zhǎng)率
yfd_fund = ak.fund_em_open_fund_info(fund="005827", indicator="單位凈值走勢(shì)")
-
數(shù)據(jù)處理&存儲(chǔ)數(shù)據(jù)
# 2、數(shù)據(jù)處理
yfd_fund['單位凈值'] = yfd_fund['單位凈值'].astype(float)
yfd_fund = yfd_fund.round(4) # 數(shù)值列只保留4位小數(shù)
# 3、存儲(chǔ)數(shù)據(jù)
sht_fund.range('A1').value = yfd_fund
# 存儲(chǔ)后發(fā)現(xiàn)有索引列,刪除(也可以在數(shù)據(jù)處理時(shí)處理)
sht_fund.range('A:A').delete()
-
設(shè)置數(shù)據(jù)格式
# 4、設(shè)置數(shù)據(jù)格式
# - 表頭字體 格式加粗 背景顏色
sht_fund.range('A1:C1').api.font_object.name.set('Calibri')
sht_fund.range('A1:C1').api.font_object.font_style.set('加粗')
sht_fund.range('A1:C1').api.font_object.color.set((255, 255, 255))
# 背景顏色
sht_fund.range('A1:C1').color = (16, 156, 245)
# mac上居中未實(shí)現(xiàn),有了解的小伙伴可以留言指出下,感謝
# sht_fund.range('B1').api.font_object.horizontalalignment = xw.constants.Constants.xlCenter
# - 添加邊框 設(shè)置的時(shí)候多加一行一列,這樣就可以兩步設(shè)置好邊框了
# 1 左+內(nèi)部豎線
sht_fund.range('A1:D717').api.get_border(which_border=1).weight.set(2)
# 3 上+內(nèi)部橫線
sht_fund.range('A1:C718').api.get_border(which_border=3).weight.set(2)
-
利用matplotlib畫(huà)圖存儲(chǔ)
# 5、繪制圖片
fig, ax = plt.subplots(2, 1, figsize=(20, 20), dpi=100) #2行 1列
# 生成一條新線- 平均消費(fèi)數(shù)據(jù)
yfd_fund_m = [yfd_fund['單位凈值'].mean(axis=0) for i in range(len(yfd_fund['單位凈值']))]
# 圖一
# 建一條線:基金趨勢(shì)折線圖
ax[0].plot(yfd_fund['凈值日期'], yfd_fund['單位凈值'], color='#a5ea37', label='單位凈值')
# 再建一條線:平均消費(fèi)直線圖
ax[0].plot(yfd_fund['凈值日期'], yfd_fund_m, linestyle='--', color='#F91860', label='平均凈值')
# 設(shè)置橫縱坐標(biāo)基礎(chǔ)說(shuō)明
ax[0].set_xlabel(u'日期')
ax[0].set_ylabel(u'單位凈值/元')
ax[0].set_title(u'易方達(dá)基金凈值走勢(shì)圖')
# 添加圖例(label說(shuō)明到圖片上) loc設(shè)置顯示位置
ax[0].legend(loc=2)
# 圖二
# 建一條線:平均消費(fèi)直線圖
ax[1].plot(yfd_fund['凈值日期'], yfd_fund['日增長(zhǎng)率'], color='#F9181c', label='日增長(zhǎng)率')
# 設(shè)置橫縱坐標(biāo)基礎(chǔ)說(shuō)明
ax[1].set_xlabel(u'日期')
ax[1].set_ylabel(u'日增長(zhǎng)率/%')
ax[1].set_title(u'易方達(dá)基金日增長(zhǎng)率走勢(shì)圖')
# 添加圖例(label說(shuō)明到圖片上) loc設(shè)置顯示位置
ax[1].legend(loc=2)
# 設(shè)置x軸值顯示方向
plt.setp(ax[0].get_xticklabels(), rotation=70, horizontalalignment='right')
plt.setp(ax[1].get_xticklabels(), rotation=70, horizontalalignment='right')
plt.show()
sht_fund.pictures.add(fig, name='易方達(dá)基金數(shù)據(jù)',
left=sht_fund.range('E2').left,
top=sht_fund.range('E2').top, update=True)
再次提醒,進(jìn)行完所有操作后一定要記得執(zhí)行以下三句:
# 保存新建的工作簿,并起一個(gè)名字(如果已存在有名字的excel文件,就直接save即可)
wb.save()
# 關(guān)閉工作簿(關(guān)閉Excel文件)
wb.close()
# 程序運(yùn)行結(jié)束,退出Excel程序
app.quit()
五、xlwings模塊進(jìn)階實(shí)戰(zhàn)
這個(gè)實(shí)戰(zhàn)來(lái)自一個(gè)讀者需求,雖然已經(jīng)是一周后了,希望對(duì)大家學(xué)習(xí)xlwings有所幫助。
需求分析:輸入一個(gè)搜索詞/值,返回該搜索詞/值所在的行列,如果不存在就返回:不存在。
技術(shù)分析:(標(biāo)題起的高深)xlwings和vba聯(lián)動(dòng)
操作思路:
-
直接通過(guò)Python編寫(xiě)代碼,利用xlwings中cell的find函數(shù)進(jìn)行查找 -
編寫(xiě)一個(gè)vba宏函數(shù),然后利用Python調(diào)用vba函數(shù)進(jìn)行查找
這篇文章肝太久了,最后實(shí)戰(zhàn)部分我們下回見(jiàn),由于本人水平有限,文中錯(cuò)誤,敬請(qǐng)指出,互相學(xué)習(xí),一起進(jìn)步。
覺(jué)得文章有用的朋友,記得點(diǎn)贊、轉(zhuǎn)發(fā)、留言三連支持下,感謝。
--End--
文章點(diǎn)贊超過(guò)100+
我將在個(gè)人視頻號(hào)直播(老表Max)
帶大家一起進(jìn)行項(xiàng)目實(shí)戰(zhàn)復(fù)現(xiàn)
掃碼即可加我微信
老表朋友圈經(jīng)常有贈(zèng)書(shū)/紅包福利活動(dòng)
點(diǎn)擊上方卡片關(guān)注公眾號(hào),回復(fù):1024 領(lǐng)取最新Python學(xué)習(xí)資源 學(xué)習(xí)更多: 整理了我開(kāi)始分享學(xué)習(xí)筆記到現(xiàn)在超過(guò)250篇優(yōu)質(zhì)文章,涵蓋數(shù)據(jù)分析、爬蟲(chóng)、機(jī)器學(xué)習(xí)等方面,別再說(shuō)不知道該從哪開(kāi)始,實(shí)戰(zhàn)哪里找了 “點(diǎn)贊”就是對(duì)博主最大的支持 ![]()

