书:Python让Excel飞起来

    1. #批量处理xlwings
    2. import xlwings as xw#导入xlwings模块
    3. app = xw.App(visible=True,add_book=False)
    4. #visible设置Excel程序窗口的可见性,True显示,False为隐藏;add_book启动Excel程序窗口后是否新建程序窗口,True表示创建
    5. workbook=app.books.add()#新建一个工作薄,add()为books对象的函数
    6. #保存
    7. workbook.save('F:\\python_test\\分公.xlsx')
    8. #保存路径及文件名称—绝对路径,也可以用save(r'F:\python_test\分公.xlsx'),里面r用来取消路径的反斜杠的转义功能
    9. workbook.close()#关闭工作薄
    10. app.quit()#退出Excel程序
    11. #打开工作簿
    12. import xlwings as xw
    13. app=xw.App(visible=True,add_book=False)
    14. workbook=app.books.open(r'F:\python_test\分公.xlsx')#指定的工作薄必须存在,并不能处于打开的状态
    15. workbook
    16. #操控工作表和单元格
    17. worksheet=workbook.sheets['Sheet1']#选中工作表里名字为Sheet1
    18. worksheet.range('A1').value='编号'#在单元格输入内容
    19. worksheet=workbook.sheets.add('产品统计表')#新增一个名为产品统计表的工作表
    1. #模式一
    2. import math
    3. a=math.sqrt(16)
    4. print(a)
    5. #模式二 直接引用函数,不用加前缀
    6. from math import sqrt #
    7. a=sqrt(16)
    8. print(a)
    9. #\n 转义字符 换行
    10. print('2021,\n 一起加油')
    11. #打印文件路径是用\\ 代替\
    12. print('F:\\python_test\分公司1.xlsx')
    13. for i in range(len(title)): #等同于range(3)
    14. print(str(i+1)+' '+'.'+title[i])
    15. from math import sqrt #导入math模块中单个函数
    16. from turtle import forwward,backward,right,left#导入turtle模块
    17. import os #E盘下文件名称
    18. path='E:\\'
    19. file_list=os.listdir(path)
    20. print(file_list)
    21. #分离文件主名和扩展名
    22. import os
    23. path='F:\\python_test\分公司1.xlsx'
    24. separate=os.path.splitext(path)
    25. print(separate) #返回包含两个元素的元祖
    26. #os模块重命名rename(src,dst) oldname.newname
    27. import os
    28. oldname='F:\\python_test\\分公司1.xlsx'
    29. newname='F:\\python_test\\分公.xlsx'
    30. os.rename(oldname,newname)
    31. #rename可以修改文件路径,newname='F:\\分公.xlsx'
    1. #Numpy数组的基础
    2. import numpy as np
    3. a=[1,2,3,4]
    4. b=np.array([1,2,3,4]) #一维数组
    5. c=a*2
    6. d=b*2
    7. print(c) #数据复制
    8. print(d) #数据*2
    9. #print(type(a)) print(type(b))
    10. #数组存储多维数据
    11. e=[[1,3],[2,6],[3,9]]
    12. f=np.array([[1,3],[2,6],[3,9]]) #二维数组
    13. print(f)
    14. print(e)
    15. #np.arange()
    16. #1个参数:起点默认为0,参数值为终点,步长为1,左闭右开
    17. #2个参数:第1个参数值起点,第2个参数值为终点,步长为1,左闭右开
    18. #3个参数:第1个参数值起点,第2个参数值为终点,第3个参数步长,左闭右开
    19. x=np.arange(5)
    20. y=np.arange(1,5)
    21. z=np.arange(1,10,5)
    22. print(x)
    23. print(y)
    24. print(z)
    25. #np.random #创建一维
    26. c=np.random.randn(3)
    27. print(c)
    28. #np.arange() 和reshape()#创建二维
    29. d=np.arange(12).reshape(3,4)
    30. print(d)
    31. #创建二维其他方式
    32. e=np.random.randint(0,10,(4,4))#np.random.randint创建随机整数,起始数,终止数,多行多列的二维数组
    33. print(e)
    1. #第4章
    2. #案例1:批量新建并关闭工作簿、
    3. #案例2:批量打开一个文件夹下的所有工作簿
    4. import os
    5. import xlwings as xw
    6. file_path=f'F:/python_test'
    7. file_list=os.listdir(file_path)
    8. app=xw.App(visible=True,add_book=False)
    9. for i in file_list:
    10. if os.path.splitext(i)[1]=='.xlsx':#判断文件夹下文件的扩展是否为.xlxs
    11. app.books.open(file_path+'/'+i)
    12. #案例3 批量重命名工作表
    13. import xlwings as xw
    14. app=xw.App(visible=False,add_book=False)#启动excel程序
    15. workbook=app.books.open(f'F:/python_test/tt.xlsx')
    16. worksheets=workbook.sheets#获取工作薄中所有工作表
    17. for i in range(len(worksheets)):#遍历取到的工作表
    18. worksheets[i].name=worksheets[i].name.replace('销售','')#重命名工作表
    19. workbook.save(f'F:/python_test/ttt.xlsx')#另存
    20. app.quit()
    21. #案例3 批量重命名部分工作表 比如前3个sheet
    22. import xlwings as xw
    23. app=xw.App(visible=False,add_book=False)
    24. workbook=app.books.open(f'F:/python_test/tt.xlsx')
    25. worksheets=workbook.sheets
    26. for i in range(len(worksheets))[:5]:
    27. worksheets[i].name=worksheets[i].name.replace('销售','')
    28. workbook.save(f'F:/python_test/ttt2.xlsx')
    29. app.quit()
    30. #案例4 批量重命名工作薄 前提条条件名称有规律
    31. import os
    32. file_path='F:/python_test/t'
    33. file_list=os.listdir(file_path)
    34. old_book_name='销售'
    35. new_book_name='xs'
    36. for i in file_list:
    37. if i.startswith('~$'):#判断是否有~$开头的文件
    38. continue#如有,跳过
    39. new_file=i.replace(old_book_name,new_book_name)
    40. old_file_path=os.path.join(file_path,i)
    41. new_file_path=os.path.join(file_path,new_file)
    42. os.rename(old_file_path,new_file_path)
    43. #案例4 批量多个工作薄的同名工作表
    44. import os
    45. import xlwings as xw
    46. file_path='F:\\python_test\\t'
    47. file_list=os.listdir(file_path)
    48. old_sheet_name='S'
    49. new_sheet_name='gzb'
    50. app=xw.App(visible=False,add_book=False)
    51. for i in file_list:
    52. if i.startswith('~$'):
    53. continue
    54. old_file_path=os.path.join(file_path,i)
    55. workbook=app.books.open(old_file_path)
    56. for j in workbook.sheets:
    57. if j.name==old_sheet_name:
    58. j.name==new_sheet_name
    59. workbook.save()
    60. app.quit()
    1. #案例9 举一反三 将工作簿名称有规律的工作表合并到一个工作表
    2. import os
    3. import xlwings as xw
    4. workbook_name='F:\\python_test\\t\\xin.xlsx'
    5. sheet_names=[str(sheet)+'外访回款' for sheet in range (0,2)]
    6. new_sheet_name='合并'#指定合并的新工作表名称
    7. app=xw.App(visible=False,add_book=False)
    8. header=None
    9. all_data=[]
    10. workbook=app.books.open(workbook_name)
    11. for i in workbook.sheets:
    12. if new_sheet_name in i.name:
    13. i.delete()#如果已经存在删除
    14. new_worksheet=workbook.sheets.add(new_sheet_name)#注意缩进
    15. title_copyed=False
    16. for j in workbook.sheets:
    17. if j.name in sheet_names:
    18. if title_copyed==False:
    19. j['A1'].api.EntireRow.Copy(Destination=new_worksheet['A1'].api)#将要合并的工作表列标题复制到新增工作表
    20. title.copyed=True
    21. row_num=new_worksheet['A1'].current_region.last_cell.row#列出新增工作表含有数据区域的最后一行
    22. j['A1'].current_region.offset(1,0).api.Copy(Destination=new_worksheet["A{}".format(row_num+1)].api)
    23. #在最后一行的下一行复制其他要合并工作表的数据,不复制标题
    24. new_worksheet.autofit()
    25. workbook.save()
    26. app.quit()
    27. Jupyter Notebook
    28. EXCEL-PY 最后检查: 25 分钟前 (未保存改变) Current Kernel Logo
    29. Python 3
    30. File
    31. Edit
    32. View
    33. Insert
    34. Cell
    35. Kernel
    36. Widgets
    37. Help
    38. import xlwings as xw
    39. app=xw.App(visible=True,add_book=False)
    40. for i in range(1,21):
    41. workbook=app.books.add()
    42. workbook.save(f'F://python_test//t//销售分公司{i}.xlsx')
    43. workbook.close()
    44. app.quit()
    45. #制定文件夹生成20个Excel工作薄
    46. #三引号定义字符串 可以换行
    47. print('''2020,
    48. hello!
    49. ''')
    50. 2020,
    51. hello!
    52. #\n 转义字符 换行
    53. print('2021,\n 一起加油')
    54. #打印文件路径是用\\ 代替\
    55. print('F:\\python_test\分公司1.xlsx')
    56. 2021,
    57. 一起加油
    58. F:\python_test\分公司1.xlsx
    59. for i in range(5):
    60. if i ==1:
    61. print('安静')
    62. else:
    63. print('加油')
    64. 加油
    65. 安静
    66. 加油
    67. 加油
    68. 加油
    69. title=['标题1','标题2','标题3']
    70. print(len(title))
    71. 3
    72. for i in range(len(title)): #等同于range(3)
    73. print(str(i+1)+' '+'.'+title[i])
    74. 1 .标题1
    75. 2 .标题2
    76. 3 .标题3
    77. #模式一
    78. import math
    79. a=math.sqrt(16)
    80. print(a)
    81. 4.0
    82. #模式二 直接引用函数,不用加前缀
    83. from math import sqrt #
    84. a=sqrt(16)
    85. print(a)
    86. 4.0
    87. from math import sqrt #导入math模块中单个函数
    88. from turtle import forwward,backward,right,left#导入turtle模块
    89. import os
    90. path=os.getcwd()
    91. print(path)
    92. C:\Users\Administrator
    93. import os #E盘下文件名称
    94. path='E:\\'
    95. file_list=os.listdir(path)
    96. print(file_list)
    97. ['$RECYCLE.BIN', 'Anaconda', 'BaiduNetdisk', 'BaiduNetdiskDownload', 'Program Files (x86)', 'System Volume Information', 'WeChat', 'write', '工作—报表', '工作报表', '蜜蜂', '记录']
    98. #分离文件主名和扩展名
    99. import os
    100. path='F:\\python_test\分公司1.xlsx'
    101. separate=os.path.splitext(path)
    102. print(separate) #返回包含两个元素的元祖
    103. ('F:\\python_test\\分公司1', '.xlsx')
    104. #os模块重命名rename(src,dst) oldname.newname
    105. import os
    106. oldname='F:\\python_test\\分公司1.xlsx'
    107. newname='F:\\python_test\\分公.xlsx'
    108. os.rename(oldname,newname)
    109. #rename可以修改文件路径,newname='F:\\分公.xlsx'
    110. #批量处理xlwings
    111. import xlwings as xw#导入xlwings模块
    112. app = xw.App(visible=True,add_book=False)
    113. #visible设置Excel程序窗口的可见性,True显示,False为隐藏;add_book启动Excel程序窗口后是否新建程序窗口,True表示创建
    114. workbook=app.books.add()#新建一个工作薄,add()为books对象的函数
    115. #保存
    116. workbook.save('F:\\python_test\\分公.xlsx')
    117. #保存路径及文件名称—绝对路径,也可以用save(r'F:\python_test\分公.xlsx'),里面r用来取消路径的反斜杠的转义功能
    118. workbook.close()#关闭工作薄
    119. app.quit()#退出Excel程序
    120. #打开工作簿
    121. import xlwings as xw
    122. app=xw.App(visible=True,add_book=False)
    123. workbook=app.books.open(r'F:\python_test\分公.xlsx')#指定的工作薄必须存在,并不能处于打开的状态
    124. workbook
    125. <Book [分公.xlsx]>
    126. #操控工作表和单元格
    127. worksheet=workbook.sheets['Sheet1']#选中工作表里名字为Sheet1
    128. worksheet.range('A1').value='编号'#在单元格输入内容
    129. worksheet=workbook.sheets.add('产品统计表')#新增一个名为产品统计表的工作表
    130. #Numpy数组的基础
    131. import numpy as np
    132. a=[1,2,3,4]
    133. b=np.array([1,2,3,4]) #一维数组
    134. c=a*2
    135. d=b*2
    136. print(c) #数据复制
    137. print(d) #数据*2
    138. #print(type(a)) print(type(b))
    139. [1, 2, 3, 4, 1, 2, 3, 4]
    140. [2 4 6 8]
    141. #数组存储多维数据
    142. e=[[1,3],[2,6],[3,9]]
    143. f=np.array([[1,3],[2,6],[3,9]]) #二维数组
    144. print(f)
    145. print(e)
    146. [[1 3]
    147. [2 6]
    148. [3 9]]
    149. [[1, 3], [2, 6], [3, 9]]
    150. #np.arange()
    151. #1个参数:起点默认为0,参数值为终点,步长为1,左闭右开
    152. #2个参数:第1个参数值起点,第2个参数值为终点,步长为1,左闭右开
    153. #3个参数:第1个参数值起点,第2个参数值为终点,第3个参数步长,左闭右开
    154. x=np.arange(5)
    155. y=np.arange(1,5)
    156. z=np.arange(1,10,5)
    157. print(x)
    158. print(y)
    159. print(z)
    160. [0 1 2 3 4]
    161. [1 2 3 4]
    162. [1 6]
    163. #np.random #创建一维
    164. c=np.random.randn(3)
    165. print(c)
    166. #np.arange() 和reshape()#创建二维
    167. d=np.arange(12).reshape(3,4)
    168. print(d)
    169. #创建二维其他方式
    170. e=np.random.randint(0,10,(4,4))#np.random.randint创建随机整数,起始数,终止数,多行多列的二维数组
    171. print(e)
    172. [-0.99569137 0.41325471 -0.70682801]
    173. [[ 0 1 2 3]
    174. [ 4 5 6 7]
    175. [ 8 9 10 11]]
    176. [[1 8 5 0]
    177. [6 5 9 3]
    178. [8 2 9 7]
    179. [7 0 2 4]]
    180. #pandas 数据导入和整理模块
    181. import pandas as pd
    182. a=pd.DataFrame()#创建一个空DataFrame
    183. date=[1,3,5]
    184. score=[2,4,6]
    185. a['data']=date#注意保证date和score的长度一致,否则会报错
    186. a['score']=score
    187. print(a)
    188. data score
    189. 0 1 2
    190. 1 3 4
    191. 2 5 6
    192. import pandas as pd
    193. data=pd.DataFrame([[1,3],[2,6]],columns=['A','B'])
    194. data.to_excel(r'F:\python_test\test1.xlsx')
    195. data=pd.DataFrame(np.arange(1,10).reshape(3,3),index=['r1','r2','r3'],columns=['c1','c2','c3'])
    196. data
    197. c1 c2 c3
    198. r1 1 2 3
    199. r2 4 5 6
    200. r3 7 8 9
    201. #数据的选取,筛选,排序,运算和删除
    202. a=data['c1']
    203. a
    204. r1 1
    205. r2 4
    206. r3 7
    207. Name: c1, dtype: int32
    208. b=data.iloc[1:3]
    209. b
    210. c1 c2 c3
    211. r2 4 5 6
    212. r3 7 8 9
    213. b=data[1:3]
    214. b
    215. c1 c2 c3
    216. r2 4 5 6
    217. r3 7 8 9
    218. c=data.iloc[-1] ##d=data[-1]报错,-1被认为是列名
    219. c
    220. c1 7
    221. c2 8
    222. c3 9
    223. Name: r3, dtype: int32
    224. e=data.loc[['r2','r3']] #选取行
    225. e
    226. c1 c2 c3
    227. r2 4 5 6
    228. r3 7 8 9
    229. #按区块选取数据 iloc通常先取行再取列 loc方法使用字符串作为索引,iloc使用数字作为索引 无ix方法
    230. b=data.iloc[0:2][['c1','c2']]
    231. c=data.loc[['r1','r2']][['c1','c2']]
    232. c
    233. c1 c2
    234. r1 1 2
    235. r2 4 5
    236. #筛选
    237. a=data[data['c1']>1]
    238. b=data[(data['c1']>1)&(data['c2']==5)]#多个条件筛选需用用&,并且需要用小括号筛选条件括起来
    239. c=data[(data['c1']<5)|(data['c2']==5)]
    240. a
    241. c1 c2 c3
    242. r2 4 5 6
    243. r3 7 8 9
    244. b
    245. c1 c2 c3
    246. r2 4 5 6
    247. c
    248. c1 c2 c3
    249. r1 1 2 3
    250. r2 4 5 6
    251. #数据的排序sort_values
    252. a=data.sort_values(by='c2',ascending=False)#by用于指定按哪列排序,ascending=True为默认值,升序排列
    253. b=a.sort_index()
    254. c1 c2 c3
    255. r3 7 8 9
    256. r2 4 5 6
    257. r1 1 2 3
    258. b=a.sort_index()#按索引排序
    259. b
    260. c1 c2 c3
    261. r1 1 2 3
    262. r2 4 5 6
    263. r3 7 8 9
    264. #数据运算
    265. data['c4']=data['c3']-data['c1']
    266. data
    267. c1 c2 c3 c4
    268. r1 1 2 3 2
    269. r2 4 5 6 2
    270. r3 7 8 9 2
    271. #数据删除
    272. b=data.drop(columns='c1')#1
    273. b
    274. c2 c3 c4
    275. r1 2 3 2
    276. r2 5 6 2
    277. r3 8 9 2
    278. c=data.drop(columns=['c1','c2'])#2
    279. c
    280. c3 c4
    281. r1 3 2
    282. r2 6 2
    283. r3 9 2
    284. d=data.drop(index=['r1','r2'])#2
    285. d
    286. c1 c2 c3 c4
    287. r3 7 8 9 2
    288. #上述演示的将数据删除后的新DataFrame赋给新的变量,不会改变原有结构,如想改原有结构,设置参数inplace=True
    289. data.drop(index=['r1','r2'],inplace=True)
    290. data
    291. c1 c2 c3 c4
    292. r3 7 8 9 2
    293. #数据的拼接merge(),concat(),append()
    294. import pandas as pd
    295. df1=pd.DataFrame({'公司':['恒盛','创锐','快学'],'分数':[90,80,85]})
    296. df2=pd.DataFrame({'公司':['恒盛','创锐','京西'],'股价':[20,180,30]})
    297. df1
    298. 公司 分数
    299. 0 恒盛 90
    300. 1 创锐 80
    301. 2 快学 85
    302. df2
    303. 公司 股价
    304. 0 恒盛 20
    305. 1 创锐 180
    306. 2 京西 30
    307. #merge()
    308. df3=pd.merge(df1,df2)#默认为内连接
    309. df3
    310. 公司 分数 股价
    311. 0 恒盛 90 20
    312. 1 创锐 80 180
    313. #merge()
    314. df4=pd.merge(df1,df2,on='公司',how='left')#默认为内连接 设置参数how='outer'或是leftright
    315. df4
    316. 公司 分数 股价
    317. 0 恒盛 90 20.0
    318. 1 创锐 80 180.0
    319. 2 快学 85 NaN
    320. #merge()按行索引合并
    321. df5=pd.merge(df1,df2,left_index=True,right_index=True)
    322. df5
    323. 公司_x 分数 公司_y 股价
    324. 0 恒盛 90 恒盛 20
    325. 1 创锐 80 创锐 180
    326. 2 快学 85 京西 30
    327. #concat() 类似union all,用axis指定连接轴向
    328. df6=pd.concat([df1,df2],ignore_index=True)#等同于pd.concat([df1,df2],axis=0);ignore_index=True生成新索引
    329. df6
    330. 公司 分数 股价
    331. 0 恒盛 90.0 NaN
    332. 1 创锐 80.0 NaN
    333. 2 快学 85.0 NaN
    334. 3 恒盛 NaN 20.0
    335. 4 创锐 NaN 180.0
    336. 5 京西 NaN 30.0
    337. df7=pd.concat([df1,df2],axis=1)
    338. df7
    339. 公司 分数 公司 股价
    340. 0 恒盛 90 恒盛 20
    341. 1 创锐 80 创锐 180
    342. 2 快学 85 京西 30
    343. #append()
    344. df8=df1.append(df2) #类似pd.concat([df1,df2],axis=0)
    345. df8
    346. 公司 分数 股价
    347. 0 恒盛 90.0 NaN
    348. 1 创锐 80.0 NaN
    349. 2 快学 85.0 NaN
    350. 0 恒盛 NaN 20.0
    351. 1 创锐 NaN 180.0
    352. 2 京西 NaN 30.0
    353. df9=df1.append({'公司':'腾飞','分数':90},ignore_index=True)
    354. df9
    355. 公司 分数
    356. 0 恒盛 90
    357. 1 创锐 80
    358. 2 快学 85
    359. 3 腾飞 90
    360. #Matplotlib
    361. import matplotlib.pyplot as plt
    362. #plt.plot()
    363. #plt.bar()
    364. #plt.pie()
    365. #折线图
    366. import matplotlib.pyplot as plt
    367. x=[1,2,3,4,5]
    368. y=[2,4,6,8,10]
    369. plt.plot(x,y)
    370. plt.show()
    371. #柱形图
    372. x=[1,2,3,4,5,6]
    373. y=[6,5,4,3,2,1]
    374. plt.bar(x,y)
    375. plt.show()
    376. #模块的交互
    377. #案例1 与pandas
    378. import xlwings as xw
    379. import pandas as pd
    380. app=xw.App(visible=False)
    381. workbook=app.books.add()
    382. worksheet=workbook.sheets.add('新工作表')
    383. df=pd.DataFrame([[1,2],[3,4]],columns=['a','b'])
    384. worksheet.range('A1').value=df
    385. workbook.save(f'F://python_test//tt.xlsx')
    386. workbook.close()
    387. app.quit()
    388. #案例2 xlwings与matplotlib
    389. import xlwings as xw
    390. import matplotlib.pyplot as plt
    391. figure=plt.figure()
    392. x=[1,2,3,4,5]
    393. y=[2,4,6,8,10]
    394. plt.plot(x,y)
    395. app=xw.App(visible=False)
    396. workbook=app.books.add()
    397. worksheet=workbook.sheets.add('新工作表')
    398. worksheet.pictures.add(figure,name='图片1',update=True,left=100)
    399. workbook.save(r'F:\python_test\tt3.xlsx')
    400. workbook.close()
    401. app.quit()
    402. #第4章
    403. #案例1:批量新建并关闭工作簿、
    404. #案例2:批量打开一个文件夹下的所有工作簿
    405. import os
    406. import xlwings as xw
    407. file_path=f'F:/python_test'
    408. file_list=os.listdir(file_path)
    409. app=xw.App(visible=True,add_book=False)
    410. for i in file_list:
    411. if os.path.splitext(i)[1]=='.xlsx':#判断文件夹下文件的扩展是否为.xlxs
    412. app.books.open(file_path+'/'+i)
    413. #案例3 批量重命名工作表
    414. import xlwings as xw
    415. app=xw.App(visible=False,add_book=False)#启动excel程序
    416. workbook=app.books.open(f'F:/python_test/tt.xlsx')
    417. worksheets=workbook.sheets#获取工作薄中所有工作表
    418. for i in range(len(worksheets)):#遍历取到的工作表
    419. worksheets[i].name=worksheets[i].name.replace('销售','')#重命名工作表
    420. workbook.save(f'F:/python_test/ttt.xlsx')#另存
    421. app.quit()
    422. #案例3 批量重命名部分工作表 比如前3个sheet
    423. import xlwings as xw
    424. app=xw.App(visible=False,add_book=False)
    425. workbook=app.books.open(f'F:/python_test/tt.xlsx')
    426. worksheets=workbook.sheets
    427. for i in range(len(worksheets))[:5]:
    428. worksheets[i].name=worksheets[i].name.replace('销售','')
    429. workbook.save(f'F:/python_test/ttt2.xlsx')
    430. app.quit()
    431. #案例4 批量重命名工作薄 前提条条件名称有规律
    432. import os
    433. file_path='F:/python_test/t'
    434. file_list=os.listdir(file_path)
    435. old_book_name='销售'
    436. new_book_name='xs'
    437. for i in file_list:
    438. if i.startswith('~$'):#判断是否有~$开头的文件
    439. continue#如有,跳过
    440. new_file=i.replace(old_book_name,new_book_name)
    441. old_file_path=os.path.join(file_path,i)
    442. new_file_path=os.path.join(file_path,new_file)
    443. os.rename(old_file_path,new_file_path)
    444. #案例4 批量重命名多个工作薄的同名工作表
    445. import os
    446. import xlwings as xw
    447. file_path='F:\\python_test\\t'
    448. file_list=os.listdir(file_path)
    449. old_sheet_name='Sheet1'
    450. new_sheet_name='gzb'
    451. app=xw.App(visible=True,add_book=False)
    452. for i in file_list:
    453. if i.startswith('~$'):
    454. continue
    455. old_file_path=os.path.join(file_path,i)
    456. workbook=app.books.open(old_file_path)
    457. for j in workbook.sheets:
    458. if j.name==old_sheet_name: #判断
    459. j.name=new_sheet_name #赋值
    460. workbook.save()
    461. app.quit()
    462. #案例5 在多个工作薄新增工作表
    463. import os
    464. import xlwings as xw
    465. file_path='F:\\python_test\\t'
    466. file_list=os.listdir(file_path)
    467. sheet_name='xinzeng'
    468. app=xw.App(visible=False,add_book=False)
    469. for i in file_list:
    470. if i.startswith('~$'):
    471. continue
    472. file_paths=os.path.join(file_path,i)
    473. workbook=app.books.open(file_paths)
    474. sheet_names=[j.name for j in workbook.sheets]
    475. if sheet_name not in sheet_names:
    476. workbook.sheets.add(sheet_name)
    477. workbook.save()
    478. app.quit()
    479. #案例5 举一反三 批量删除工作表
    480. import os
    481. import xlwings as xw
    482. file_path='F:\\python_test\\t'
    483. file_list=os.listdir(file_path)
    484. sheet_name='xinzeng'
    485. app=xw.App(visible=False,add_book=False)
    486. for i in file_list:
    487. if i.startswith('~$'):
    488. continue
    489. file_paths=os.path.join(file_path,i)
    490. workbook=app.books.open(file_paths)
    491. for j in workbook.sheets:
    492. if j.name==sheet_name:
    493. j.delete()
    494. break
    495. workbook.save()
    496. app.quit()
    497. #案例6 批量打印工作薄 PrintOut()
    498. import os
    499. import xlwings as xw
    500. file_path='F:\\python_test\\t'
    501. file_list=os.listdir(file_path)
    502. app=xw.App(visible=False,add_book=False)
    503. for i in file_list:
    504. if i.startswith('~$'):
    505. continue
    506. file_paths=os.path.join(file_path,i)
    507. workbook=app.books.open(file_paths)
    508. workbook.api.PrintOut()#打印
    509. app.quit()
    510. #案例6 批量打印工作薄指定工作表
    511. import os
    512. import xlwings as xw
    513. file_path='F:\\python_test\\t'
    514. file_list=os.listdir(file_path)
    515. sheet_name='gzb'
    516. app=xw.App(visible=False,add_book=False)
    517. for i in file_list:
    518. if i.startswith('~$'):
    519. continue
    520. file_paths=os.path.join(file_path,i)
    521. workbook=app.books.open(file_paths)
    522. for j in workbook.sheets:
    523. if j.name==sheet_name:
    524. j.api.PrintOut()#打印
    525. app.quit()
    526. #案例7 将一个工作薄批量复制到其他工作薄
    527. import os
    528. import xlwings as xw
    529. app=xw.App(visible=True,add_book=False)
    530. file_path='F:\\python_test\\t'
    531. file_list=os.listdir(file_path)
    532. workbook=app.books.open('F:\\python_test\\资管外访日报20210512.xlsx')
    533. worksheet=workbook.sheets
    534. for i in file_list:
    535. if os.path.splitext(i)[1]=='.xlsx':
    536. workbooks=app.books.open(file_path+'\\'+i)
    537. for j in worksheet:
    538. contents=j.range('A1').expand('table').value
    539. name=j.name
    540. workbooks.sheets.add(name=name,after=len(workbooks.sheets))
    541. workbooks.sheets[name].range('A1').value=contents
    542. workbooks.save()
    543. app.quit()
    544. #案例7 举一反三 将某个工作表的数据批量复制到其他工作簿指定工作表中
    545. import os
    546. import xlwings as xw
    547. app=xw.App(visible=True,add_book=False)
    548. file_path='F:\\python_test\\t'
    549. file_list=os.listdir(file_path)
    550. workbook=app.books.open('F:\\python_test\\资管外访日报20210512.xlsx')
    551. worksheet=workbook.sheets['外访回款0']#选择工作薄里面的工作表
    552. value=worksheet.range('A1').expand('table')#读取工作表里面数据
    553. start_cell=(2,1)
    554. end_cell=(value.shape[0],value.shape[1])
    555. cell_area=worksheet.range(start_cell,end_cell).value#根据前面设定的区域选取复制的数据
    556. for i in file_list:
    557. if os.path.splitext(i)[1]=='.xlsx':
    558. try:
    559. workbooks=xw.Book(file_path+'\\'+i)
    560. sheet=workbooks.sheets['gzb']#选择要粘贴数据的工作表
    561. scope=sheet.range('A1').expand()#选中要粘贴数据的区域
    562. sheet.range(scope.shape[0]+1,1).value=cell_area#粘贴数据
    563. workbooks.save()
    564. finally:
    565. workbooks.close()
    566. workbook.close()
    567. app.quit()
    568. #案例8 按条件将一个工作表拆分为多个工作簿 ************
    569. import xlwings as xw
    570. app=xw.App(visible=True,add_book=True)
    571. file_path='F:\\python_test\\资管外访日报20210512.xlsx'
    572. sheet_name='外访回款'
    573. workbook=app.books.open(file_path)
    574. worksheet=workbook.sheets[sheet_name]
    575. value=worksheet.range('A2').expand('table').value#读取拆分工作表的所有是数据
    576. data=dict()
    577. for i in range(len(value)):
    578. product_name=value[i][10]#获取当前行的产品名称,名称不要带/,识别不了报错
    579. if product_name not in data:
    580. data[product_name]=[]
    581. data[product_name].append(value[i])
    582. for key,value in data.items():
    583. new_workbook=xw.books.add()
    584. new_worksheet=new_workbook.sheets.add(key)
    585. new_worksheet['A1'].value=worksheet['A1:Y1'].value#将拆分的的工作表列标题复制到新表中
    586. new_worksheet['A2'].value=value
    587. new_workbook.save('{}.xlsx'.format(key))#以当前产品名作为文件名称
    588. new_workbook.save()
    589. workbook.close()
    590. app.quit()
    591. #案例8 举一反三 按条件将一个工作表拆分为多个工作表 默认保存地址为C:\Users\Administrator\Documents
    592. import xlwings as xw
    593. import pandas as pd
    594. app=xw.App(visible=True,add_book=False)
    595. workbook=app.books.open('F:\\python_test\\日报20210512.xlsx')
    596. worksheet=workbook.sheets['外访回款0']
    597. value=worksheet.range('A1').options(pd.DataFrame,header=1,index=False,expand='table').value
    598. data=value.groupby('产品')
    599. for idx,group in data:
    600. new_worksheet=workbook.sheets.add(idx)#数据新增到工作表
    601. new_worksheet['A1'].options(index=False).value=group#数据新增到工作表
    602. workbook.save()
    603. workbook.close()
    604. app.quit()
    605. #案例8 举一反三 按条件将一个工作簿里多个工作表拆分为多个工作薄
    606. import xlwings as xw
    607. workbook_name='F:\\python_test\\资管外访日报20210512.xlsx'
    608. app=xw.App(visible=True,add_book=False)
    609. header=None
    610. all_data=[]
    611. workbook=app.books.open(workbook_name)
    612. for i in workbook.sheets:
    613. workbook_split=app.books.add()#新建目标工作簿
    614. sheet_split=workbook_split.sheets[0]#选择目标工作簿的第一个工作表
    615. i.api.Copy(Before=sheet_split.api)#将来源工作簿中当前的工作表复制到目前工作簿的第一个工作表之前
    616. workbook_split.save('{}'.format(i.name))#以当前工作表名称作为文件名保存目标工作薄
    617. app.quit()
    618. #案例9 批量合并多个工作薄的同名工作表
    619. import os
    620. import xlwings as xw
    621. file_path='F:\\python_test\\t'
    622. file_list=os.listdir(file_path)
    623. sheet_name='外访回款0'#合并的同名工作表名称
    624. app=xw.App(visible=False,add_book=False)
    625. header=None#定义变量,初始值为空对象,后续用于存放要合并数据的列标题
    626. all_data=[]
    627. for i in file_list:
    628. if i.startswith('~$'):
    629. continue
    630. file_paths=os.path.join(file_path,i)
    631. workbook=app.books.open(file_paths)
    632. for j in workbook.sheets:
    633. if j.name==sheet_name:
    634. if header==None:
    635. header=j['A1:Y1'].value
    636. values=j['A2'].expand('table').value
    637. all_data=all_data+values
    638. new_workbook=xw.Book()#新建工作薄
    639. new_worksheet=new_workbook.sheets.add(sheet_name)#新建工作表,表名为外访回款0
    640. new_worksheet['A1'].value=header
    641. new_worksheet['A2'].value=all_data
    642. new_worksheet.autofit()#根据合并后的互数据自动调整新增工作表的行高和列宽
    643. new_workbook.save('F:\\python_test\\t\\xin.xlsx')#保存
    644. app.quit()
    645. #案例9 举一反三 将工作簿名称有规律的工作表合并到一个工作表
    646. import os
    647. import xlwings as xw
    648. workbook_name='F:\\python_test\\t\\xin.xlsx'
    649. sheet_names=[str(sheet)+'外访回款' for sheet in range (0,2)]
    650. new_sheet_name='合并'#指定合并的新工作表名称
    651. app=xw.App(visible=False,add_book=False)
    652. header=None
    653. all_data=[]
    654. workbook=app.books.open(workbook_name)
    655. for i in workbook.sheets:
    656. if new_sheet_name in i.name:
    657. i.delete()#如果已经存在删除
    658. new_worksheet=workbook.sheets.add(new_sheet_name)#注意缩进
    659. title_copyed=False
    660. for j in workbook.sheets:
    661. if j.name in sheet_names:
    662. if title_copyed==False:
    663. j['A1'].api.EntireRow.Copy(Destination=new_worksheet['A1'].api)#将要合并的工作表列标题复制到新增工作表
    664. title.copyed=True
    665. row_num=new_worksheet['A1'].current_region.last_cell.row#列出新增工作表含有数据区域的最后一行
    666. j['A1'].current_region.offset(1,0).api.Copy(Destination=new_worksheet["A{}".format(row_num+1)].api)
    667. #在最后一行的下一行复制其他要合并工作表的数据,不复制标题
    668. new_worksheet.autofit()
    669. workbook.save()
    670. app.quit()

    day3

    1. #第5章 python 批量处理行、列和单元格 os pandas xlwings
    2. #案例01 精确调整多个工作薄的行高和列宽 xlwings de column_width,row_height
    3. import os
    4. import xlwings as xw
    5. file_path='F:\\python_test'#注意该路径下不要存在其他类型文件,识别不了会报错
    6. file_list=os.listdir(file_path)
    7. app=xw.App(visible=True,add_book=True)
    8. for i in file_list:
    9. if i.startswith('~$'):
    10. continue
    11. file_paths=os.path.join(file_path,i)#多个参数
    12. workbook=app.books.open(file_paths)
    13. for j in workbook.sheets:
    14. value=j.range('A1').expand('table')
    15. value.column_width=12
    16. value.row_height=20
    17. workbook.save()
    18. workbook.close()
    19. app.quit()
    20. #案例01 举一反三 精确调整1个工作薄的行高和列宽
    21. import xlwings as xw
    22. app=xw.App(visible=True,add_book=False)
    23. workbook=app.books.open('F:\\python_test\\资管外访日报20210512.xlsx')
    24. for i in workbook.sheets:
    25. value=i.range('A1').expand('table')
    26. value.column_width=12
    27. value.row_height=20
    28. workbook.save()
    29. app.quit()
    30. #案例02 批量修改多个工作薄的数据格式 ********************
    31. import os
    32. import xlwings as xw
    33. file_path='F:\\python_test'
    34. file_list=os.listdir(file_path)
    35. app=xw.App(visible=True,add_book=True)
    36. for i in file_list:
    37. if i.startswith('~$'):
    38. continue
    39. file_paths=os.path.join(file_path,i)
    40. workboook=app.books.open(file_paths)
    41. for j in workbook.sheets:
    42. row_num=j['A1'].current_region.last_cell.row
    43. j['A2:A{}'.format(row_num)].number_format='m/d'
    44. j['H2:H{}'.format(row_num)].number_format='¥#,##0.00'
    45. workbook.save()
    46. workbook.close()
    47. app.quit()
    48. #案例02 举一反三 批量更改多个工作薄外观格式
    49. import os
    50. import xlwings as xw
    51. file_path='F:\\python_test'
    52. file_list=os.listdir(file_path)
    53. app=xw.App(visible=True,add_book=False)
    54. for i in file_list:
    55. if i.startswith('~$'):
    56. continue
    57. file_paths=os.path.join(file_path,i)
    58. workbook=app.books.open(file_paths)
    59. for j in workbook.sheets:
    60. j['A1:N1'].api.Font.Name='宋体'
    61. j['A1:N1'].api.Font.Size=10
    62. j['A1:N1'].api.Font.Bold=True
    63. j['A1:N1'].api.Font.Color=xw.utils.rgb_to_int((255,255,255))
    64. j['A1:N1'].Color=xw.utils.rgb_to_int((0,0,0))
    65. j['A1:N1'].api.HorizontalAlignment=xw.constants.HAlign.xlHAlignCenter
    66. #j['A1:N1'].api.VerticalAlignment=xw.constants.VAlign.xlHAlignCenter #代码有问题报错xlHAlignCenter
    67. j['A2'].expand('table').api.Font.Name='宋体'
    68. j['A2'].expand('table').api.Font.Size=10
    69. j['A2'].expand('table').api.HorizontalAlignment=xw.constants.HAlign.xlHAlignLeft
    70. #j['A2'].expand('table').api.VerticalAlignment=xw.constants.VAlign.xlHAlignCenter
    71. for cell in j['A1'].expand('table'):
    72. for b in range(7,12):
    73. cell.api.Borders(b).LineStyle=1
    74. cell.api.Borders(b).Weight=2
    75. workbook.save()
    76. workbook.close()
    77. app.quit()
    78. #案例03 批量替换多个工作薄的行数据
    79. import os
    80. import xlwings as xw
    81. file_path='F:\\python_test'
    82. file_list=os.listdir(file_path)
    83. app=xw.App(visible=True,add_book=False)
    84. for i in file_list:
    85. if i.startswith('~$'):
    86. continue
    87. file_paths=os.path.join(file_path,i)
    88. workbook=app.books.open(file_paths)
    89. for j in workbook.sheets:
    90. value=j['A2'].expand('table').value
    91. for index,val in enumerate(value):#enumerate两个参数,第1个参数可以是列表,元祖和字符串;第2个参数省略默认为0
    92. if val==['背包','12','36']:
    93. value[index]=['2背包','32','96']
    94. j['A2'].expand('table').value=value
    95. workbook.save()
    96. workbook.close()
    97. app.quit()
    98. #案例04 批量提取一个工作薄一个工作表的特定数据
    99. import xlwings as xw
    100. import pandas as pd
    101. app=xw.App(visible=False,add_book=False)
    102. workbook=app.books.open('F:\\python_test\\资管外访日报20210512.xlsx')
    103. worksheet=workbook.sheets
    104. data=[]
    105. for i in worksheet:
    106. values=i.range('A1').expand().options(pd.DataFrame).value
    107. filtered=values[values['产品']=='城市信贷']
    108. if not filtered.empty:
    109. data.append(filtered)
    110. new_workbook=xw.books.add()
    111. new_worksheet=new_workbook.sheets.add('城市信贷')
    112. new_worksheet.range('A1').value=pd.concat(data,ignore_index=False)
    113. new_workbook.save()
    114. workbook.close()
    115. app.quit()
    116. #案例05 对多个工作薄工指定工作表数据分列
    117. import os
    118. import xlwings as xw
    119. import pandas as pd
    120. file_path='F:\\python_test\\'
    121. file_list=os.listdir(file_path)
    122. app=xw.App(visible=True,add_book=True)
    123. for i in file_list:
    124. if i.startswith('~$'):
    125. continue
    126. file_paths=os.path.join(file_path,i)
    127. workbook=app.books.open(file_paths)
    128. worksheet=workbook.sheets['外访回款']
    129. values=worksheet.range('A1').options(pd.DataFrame,header=1,index=False,expand='table').value
    130. new_values=values['拆分'].str.split('*',expand=True)
    131. values['1']=new_values[0]
    132. values['2']=new_values[1]
    133. values['3']=new_values[2]
    134. values.drop(columns=['拆分'],inplace=True)
    135. worksheet['A1'].options(index=False).value=values
    136. worksheet.autofit()
    137. workbook.save()
    138. workbook.close()
    139. app.quit()
    140. #案例06 批量提取一个工作簿的所有工作表的唯一值
    141. import xlwings as xw
    142. app=xw.App(visible=False,add_book=True)
    143. workbook=app.books.open('F:\\python_test\\报表.xlsx')
    144. data=[]
    145. for i,worksheet in enumerate(workbook.sheets):#遍历工作薄的工作表
    146. values=worksheet['B2'].expand('down').value#提取所需的列
    147. data=data+values
    148. data=list(set(data))#set()去重后,用list转为列表,以便于用insert()添加元素
    149. data.insert(0,'name')#增加标题
    150. new_workbook=xw.books.add()#新建book
    151. new_worksheet=new_workbook.sheets.add('name')#新建sheet,名name
    152. new_worksheet['A1'].options(transpose=True).value=data#转置
    153. new_worksheet.autofit()
    154. new_workbook.save()
    155. new_workbook.close()
    156. app.quit()
    1. #第6章 python批量进行数据分析
    2. #案例01 批量在工作簿升序pandas sort_values()
    3. import xlwings as xw
    4. import pandas as pd
    5. app=xw.App(visible=True,add_book=True)
    6. workbook=app.books.open('F:\\python_test\\报表.xlsx')
    7. worksheet=workbook.sheets
    8. for i in worksheet:
    9. values=i.range('A1').expand('table').options(pd.DataFrame).value#读取数据,转换格式
    10. result=values.sort_values(by='yuan',ascending=False)
    11. i.range('A1').value=result#将排序结果写入当前工作表,替换原有数据
    12. workbook.save()
    13. workbook.close()
    14. app.quit()
    15. #案例02 筛选一个工作簿的所有工作表数据
    16. #案例03 对多个工作薄的工作表分别进行分类汇总
    17. import os
    18. import xlwings as xw
    19. import pandas as pd
    20. app=xw.App(visible=True,add_book=True)
    21. file_path='F:\python_test'
    22. file_list=os.listdir(file_path)
    23. for i in file_list:
    24. if os.path.splitext(i)[1]=='.xlsx':
    25. workbook=app.books.open(file_path+'\\'+i)
    26. worksheet=workbook.sheets
    27. for j in worksheet:
    28. values=j.range('A1').expand('table').options(pd.DataFrame).value
    29. values['数值']=values['数值'].astype('float')
    30. result=values.groupby('产品').sum()
    31. j.range('f1').value=result['数值']#将汇总结果写到当前工作表位置
    32. workbook.save()
    33. workbook.close()
    34. app.quit()
    35. #案例04 对1个工作薄所有工作表分别进行分别求和
    36. import os
    37. import xlwings as xw
    38. import pandas as pd
    39. app=xw.App(visible=True,add_book=True)
    40. workbook=app.books.open('F:\\python_test\\报表.xlsx')
    41. worksheet=workbook.sheets
    42. for i in worksheet:
    43. values=i.range('A1').expand('table')
    44. data=values.options(pd.DataFrame).value
    45. sums=data['数值'].sum()
    46. column=values.value[0].index('数值')+1#index()是列表对象的函数,找出某个元素的索引位置;获取数值列号
    47. row=values.shape[0]#获取数据区域最后一行的行号,shape(行数,列数)
    48. i.range(row+1,column).value=sums
    49. workbook.save()
    50. workbook.close()
    51. app.quit()
    52. #案例05 批量统计工作薄的最大值最小值
    53. #案例06 批量制作数据透视表
    54. import os
    55. import xlwings as xw
    56. import pandas as pd
    57. app=xw.App(visible=True,add_book=True)
    58. file_path='F:\python_test'
    59. file_list=os.listdir(file_path)
    60. for i in file_list:
    61. if os.path.splitext(i)[1]=='.xlsx':
    62. workbook=app.books.open(file_path+'\\'+i)
    63. worksheet=workbook.sheets
    64. for j in worksheet:
    65. values=j.range('A1').expand('table').options(pd.DataFrame).value
    66. pivottale=pd.pivot_table(values,values='数值',index='产品',columns='类型',aggfunc='sum',fill_value=0,margins=True,margins_name='总计')
    67. j.range('f1').value=pivottale#将汇总结果写到当前工作表位置
    68. workbook.save()
    69. workbook.close()
    70. app.quit()
    71. #pd.pivot_table是pandas模块的函数 data 必选 指用于制作数据透视表的区域,values 可选 指定汇总计算的字段
    72. #index 必选 指定行字段 columns必须 指定列 aggfunc 指定汇总计算方式(sum,mean)
    73. #fill_value 用于指定填充缺失值的内容,默认不填充
    74. #margins 用于是否这只显示行列的总计数据,false不显示
    75. #margins_name 总计行名称
    76. #dropna
    77. #案例07 使用相关系数判断数据的相关性 corr()
    78. import pandas as pd
    79. df=pd.read_excel('F:\\t\\相关分析.xlsx',sheet_name='0')
    80. result=df.corr()
    81. print(result)
    82. #案例08 使用方差分析对比数据的差异
    83. import pandas as pd
    84. from statsmodels.formula.api import ols
    85. from statsmodels.stats.anova import anova_lm
    86. import xlwings as xw
    87. df=pd.read_excel('F:\\t\\方差分析.xlsx')
    88. df=df[['AA','BB','CC','DD','EE']]
    89. df_melt=df.melt()#把列名转换为列数据,重构DataFrame
    90. df_melt.columns=['Treat','Value']
    91. df_describe=pd.DataFrame()#df_describe,总结数据集中分布趋势,生成描述性统计
    92. df_describe['AA']=df['AA'].describe()
    93. df_describe['BB']=df['BB'].describe()
    94. df_describe['CC']=df['CC'].describe()
    95. df_describe['DD']=df['DD'].describe()
    96. df_describe['EE']=df['EE'].describe()
    97. model=ols('Value~C(Treat)',data=df_melt).fit()#对样本进行最小二乘线性拟合激素那
    98. anova_table=anova_lm(model,typ=3)#样本进行方差分析
    99. app=xw.App(visible=False)
    100. workbook=app.books.open('F:\\t\\方差分析.xlsx')
    101. worksheet=workbook.sheets['单因素方差分析']
    102. worksheet.range('H2').value=df_describe.T#计算后的值转置
    103. worksheet.range('H14').value='方差分析'
    104. worksheet.range('H15').value=anova_table
    105. workbook.save()
    106. workbook.close()
    107. app.quit()
    108. #案例08 举一反三(箱型图,观察数据的离散情况和异常值)
    109. import pandas as pd
    110. import matplotlib.pyplot as plt
    111. import xlwings as xw
    112. df=pd.read_excel('F:\\t\\方差分析.xlsx')
    113. df=df[['AA','BB','CC','DD','EE']]
    114. figure=plt.figure()#创建绘图窗口
    115. plt.rcParams['font.sans-serif']=['SimHei']#解决中文乱码
    116. df.boxplot(grid=False)#绘制箱型图并删除网格线
    117. app=xw.App(visible=False)
    118. workbook=app.books.open('F:\\t\\方差分析.xlsx')
    119. worksheet=workbook.sheets['单因素方差分析']
    120. worksheet.pictures.add(figure,name='p1',update=True,left=500,top=10)#将绘制图形插入表
    121. workbook.save()
    122. workbook.close()
    123. app.quit()
    124. #案例09 使用描述性统计和直方图定目标
    125. import pandas as pd
    126. import matplotlib.pyplot as plt
    127. import xlwings as xw
    128. df=pd.read_excel('F:\\t\\制定目标.xlsx')
    129. df.columns=['序号','员工姓名','销售额']
    130. df=df.drop(columns=['序号','员工姓名'])
    131. df_describe=df.astype('float').describe()
    132. df_cut=pd.cut(df['销售额'],bins=7,precision=2)#分成七个均等的区间
    133. cut_count=df['销售额'].groupby(df_cut).count()#统计人数
    134. df_all=pd.DataFrame()
    135. df_all['计数']=cut_count
    136. df_all_new=df_all.reset_index()#索引重置为数字序号
    137. df_all_new['销售额']=df_all_new['销售额'].apply(lambda x: str(x))
    138. fig=plt.figure()
    139. plt.rcParams['font.sans-serif']=['SimHei']#解决中文乱码
    140. n,bins,pathes=plt.hist(df['销售额'],bins=7,edgecolor='black',linewidth=0.5)
    141. #使用销售额数据绘制直方图 柱子的边框颜色和粗细
    142. plt.xticks(bins)#直方图x轴刻度标签设置为各区间的端点值
    143. plt.title('销售额分布')
    144. plt.xlabel('销售额')
    145. plt.ylabel('频数')
    146. app=xw.App(visible=False)
    147. workbook=app.books.open('F:\\t\\制定目标.xlsx')
    148. worksheet=workbook.sheets['1']
    149. worksheet.range('A2').value=df_describe
    150. worksheet.range('AA2').value=df_all_new
    151. worksheet.pictures.add(figure,name='p1',update=True,left=500,top=10)#将绘制图形插入表
    152. worksheet.autofit()
    153. workbook.save()
    154. workbook.close()
    155. app.quit()
    156. #pandas里面cut()函数进行离散化处理,将数据从最大值到最小值进行等距划分
    157. #matplotlib里hist()函数绘制直方图
    158. #案例10 使用回归分析预测未来值
    159. import pandas as pd
    160. from sklearn import linear_model
    161. df=pd.read_excel('F:\\t\\回归.xlsx')
    162. df=df[2:]
    163. df.columns=['序号','gg1','gg2','销售额']
    164. x=df[['gg1','gg2']]
    165. y=df['销售额']
    166. model=linear_model.LinearRegression()#创建线性回归模型
    167. #LinearRegression 属于sklearn函数 (fit_intercept=True,normalize=False,copy_X=True,n_j)
    168. #fit_intercept可选参数,是否计算截距,默认True;normalize选参数,是否数据标准化,默认False;
    169. #copy_X可选参数默认True,表示复制X值,Flase表示该值可能被覆盖;n_j可选参数,表示计算使用的CPU数量,默认为1
    170. model.fit(x,y)#用自变量和因变量数据对线性回归模型进行训练,拟合
    171. coef=model.coef_#获取自变量系数
    172. model_intercept=model.intercept_#获取截距
    173. result='y={}x1+{}x2'.format(coef[0],coef[1],model_intercept)#获取线性回归方程
    174. print(result)
    175. R2=model.score(x,y)#属于sklearn函数 计算回归模型的R2 范围[0,1] 越接近1拟合效果越好
    176. print(R2)

    day4
    图片.png

    1. #第7章 制作简单图表并设置图表元素
    2. #案例1
    3. import matplotlib.pyplot as plt
    4. x=[1,2,3,4,5,6]
    5. y=[2,4,6,8,10,12]
    6. plt.plot(x,y,color='red',linewidth=3,linestyle='solid')#会中折线图 折线颜色、粗细、线型:实线
    7. plt.show()
    8. #案例2 导入Excel数据制作简单图表
    9. import pandas as pd
    10. import matplotlib.pyplot as plt
    11. import xlwings as xw
    12. df=pd.read_excel('F:\\t\\回归.xlsx')
    13. figure=plt.figure()
    14. plt.rcParams['font.sans-serif']=['SimHei']#为图表中文字体设置默认字体:黑体 (Micsoft YaHei:微软雅黑)
    15. plt.rcParams['axes.unicode_minus']=False#解决坐标轴为负数时无法正常显示负号
    16. x=df['序号']
    17. y=df['销售额']
    18. plt.bar(x,y,color='green')
    19. app=xw.App(visible=True)
    20. workbook=app.books.open('F:\\t\\回归.xlsx')
    21. worksheet=workbook.sheets[1]
    22. worksheet.pictures.add(figure,left=850)#left参数用于图表插入的位置
    23. workbook.save()
    24. workbook.close()
    25. app.quit()
    26. #案例3 组合图 相当于叠加,注意两个指标用同一坐标轴,数据差距不能太大
    27. import pandas as pd
    28. import matplotlib.pyplot as plt
    29. df=pd.read_excel('F:\\t\\图表.xlsx')
    30. plt.rcParams['font.sans-serif']=['SimHei']#为图表中文字体设置默认字体:黑体 (Micsoft YaHei:微软雅黑)
    31. plt.rcParams['axes.unicode_minus']=False#解决坐标轴为负数时无法正常显示负号
    32. x=df['序号']
    33. y1=df['销售额']
    34. y2=df['gg1']
    35. plt.plot(x,y1,color='red')
    36. plt.bar(x,y2,color='green')
    37. plt.show()
    38. #案例4 图表及坐标轴标题 title(),xlabel(),ylabel()
    39. import pandas as pd
    40. import matplotlib.pyplot as plt
    41. df=pd.read_excel('F:\\t\\图表.xlsx')
    42. plt.rcParams['font.sans-serif']=['SimHei']#为图表中文字体设置默认字体:黑体 (Micsoft YaHei:微软雅黑)
    43. plt.rcParams['axes.unicode_minus']=False#解决坐标轴为负数时无法正常显示负号
    44. x=df['序号']
    45. y=df['销售额']
    46. #设置图例名
    47. plt.bar(x,y,color='pink',label='销售额')
    48. #图表及坐标轴标题
    49. plt.title(label='月销售额数据',fontdict={'family':'SimHei','color':'red','size':20},loc='center',pad=50)
    50. #title label:图表标题的文本内容,fontdict:字体色号颜色,loc:显示位置,pad标题到坐标系顶端距离
    51. plt.xlabel('月份',fontdict={'family':'SimHei','color':'black','size':16},labelpad=50)
    52. plt.ylabel('销售额',fontdict={'family':'SimHei','color':'black','size':16},labelpad=50)
    53. #添加图例
    54. plt.legend(loc='upper left',fontsize=10)
    55. plt.show()
    56. #案例5 数据标签 text()函数
    57. import pandas as pd
    58. import matplotlib.pyplot as plt
    59. df=pd.read_excel('F:\\t\\图表.xlsx')
    60. plt.rcParams['font.sans-serif']=['SimHei']#为图表中文字体设置默认字体:黑体 (Micsoft YaHei:微软雅黑)
    61. plt.rcParams['axes.unicode_minus']=False#解决坐标轴为负数时无法正常显示负号
    62. x=df['序号']
    63. y=df['销售额']
    64. #设置图例名
    65. plt.bar(x,y,color='pink',label='销售额')
    66. #图表及坐标轴标题
    67. plt.title(label='月销售额数据',fontdict={'family':'SimHei','color':'red','size':20},loc='center',pad=50)
    68. #title label:图表标题的文本内容,fontdict:字体色号颜色,loc:显示位置,pad标题到坐标系顶端距离
    69. plt.xlabel('月份',fontdict={'family':'SimHei','color':'black','size':16},labelpad=50)
    70. plt.ylabel('销售额',fontdict={'family':'SimHei','color':'black','size':16},labelpad=50)
    71. #添加图例
    72. plt.legend(loc='upper left',fontsize=10)
    73. #y轴的取值范围
    74. plt.ylim(0,100)#ylim(min,max)
    75. #数据标签
    76. # zip 迭代对象作为参数,将对象中对应的元素打包成一个元组,返回由这些元组组成的列表
    77. for a,b in zip(x,y):
    78. plt.text(a,b,b,fontdict={'family':'KaiTi','color':'red','size':16})
    79. #数据标签x坐标,y坐标,标签文本内容,格式
    80. plt.show()
    81. #案例6 组合图设置次坐标轴 twinx()
    82. import pandas as pd
    83. import matplotlib.pyplot as plt
    84. df=pd.read_excel('F:\\t\\图表.xlsx')
    85. plt.rcParams['font.sans-serif']=['SimHei']#为图表中文字体设置默认字体:黑体 (Micsoft YaHei:微软雅黑)
    86. plt.rcParams['axes.unicode_minus']=False#解决坐标轴为负数时无法正常显示负号
    87. x=df['序号']
    88. y1=df['销售额']
    89. y2=df['gg1']
    90. plt.bar(x,y2,color='green',label='销售额')
    91. plt.legend(loc='upper right',fontsize=10)
    92. plt.twinx()
    93. plt.plot(x,y1,color='red',label='gg1')
    94. plt.legend(loc='upper right',fontsize=10)
    95. #y轴添加网格线
    96. plt.grid(b=True,which='major',axis='y',color='gray',linestyle='dashed',linewidth=1)
    97. #b为True,显示网格线,反之不显示;which:可选参数 设置哪种网格线 major/minor/both 主/次要/都要;axis x/y/both
    98. plt.show()

    图片.png
    pip install scipy
    报错:
    Requirement already satisfied: scipy in d:\users\administrator\anaconda3\lib\site-packages (1.5.2)
    Requirement already satisfied: numpy>=1.14.5 in d:\users\administrator\anaconda3\lib\site-packages (from scipy) (1.19.2)
    Note: you may need to restart the kernel to use updated packages.

    pip install —target=D:\Users\Administrator\anaconda3\Lib\site-packages scipy
    解决:
    原文链接:https://blog.csdn.net/sliver_goup/article/details/112497385
    Note: you may need to restart the kernel to use updated packages.
    这个问题其实就是需要你把所需要的库升级一下子,更新到最新版本,旧版本与代码用到的库版本冲突,升级。
    pip install —upgrade 库名
    图片.png#第8章 制作常用图表

    1. #第8章 制作常用图表
    2. #案例1 柱形图并对比数据
    3. import xlwings as xw
    4. app=xw.App(visible=True,add_book=False)
    5. workbook=app.books.open('F:\\t\\常用图.xlsx')
    6. for i in workbook.sheets:
    7. chart=i.charts.add(left=200,top=0,width=355,height=211)#图表位置和尺寸
    8. chart.set_source_data(i['A1'].expand())#读取制作图表数据
    9. chart.chart_type='column_clustered'#柱形图
    10. workbook.save()
    11. workbook.close()
    12. app.quit()
    13. #案例2 折线图展示数据变化趋势
    14. #plt.axis('off') 隐藏坐标轴
    15. import pandas as pd
    16. import matplotlib.pyplot as plt # matplotlib报错 ;matplotlib.pyplot运行ok
    17. import xlwings as xw
    18. df=pd.read_excel('F:\\t\\常用图.xlsx')
    19. figure=plt.figure()
    20. plt.rcParams['font.sans-serif']=['SimHei']
    21. plt.rcParams['axes.unicode_minus']=False
    22. x=df['序号']
    23. y=df['销售额']
    24. plt.plot(x,y,color='red',linewidth=3,linestyle='solid')
    25. plt.title(label='趋势图',fontdict={'color':'black','size':30},loc='center')
    26. #为最高点添加数据标签
    27. max1=df['销售额'].max()
    28. df_max=df[df['销售额']==max1]
    29. for a,b in zip(df_max['序号'],df_max['销售额']):
    30. plt.text(a,b+0.05,(a,'%.0f'%b),ha='center',va='bottom',fontsize=10)
    31. plt.axis('off')
    32. app=xw.App(visible=False)
    33. workbook=app.books.open('F:\\t\\常用图.xlsx')
    34. worksheet=workbook.sheets['0']
    35. worksheet.pictures.add(figure,name='2',update=True,left=200)
    36. workbook.save()
    37. workbook.close()
    38. app.quit()
    39. #案例2 平滑折线图
    40. import pandas as pd
    41. import matplotlib.pyplot as plt
    42. import numpy as np
    43. from scipy import interpolate #scipy
    44. import xlwings as xw
    45. df=pd.read_excel('F:\\t\\常用图.xlsx')
    46. figure=plt.figure()
    47. plt.rcParams['font.sans-serif']=['SimHei']
    48. plt.rcParams['axes.unicode_minus']=False
    49. x=df['序号']
    50. y=df['销售额']
    51. xnew=np.arange(1,9,0.1)#numpy模块函数 创建等差数组
    52. func=interpolate.interp1d(x,y,kind='cubic')#interp1d表示1维插值 返回一个插值后的函数
    53. ynew=func(xnew)
    54. plt.plot(xnew,ynew,color='red',linewidth=3,linestyle='solid')
    55. plt.title(label='趋势图',fontdict={'color':'black','size':30},loc='center')
    56. #为最高点添加数据标签
    57. max1=df['销售额'].max()
    58. df_max=df[df['销售额']==max1]
    59. for a,b in zip(df_max['序号'],df_max['销售额']):
    60. plt.text(a,b+0.05,(a,'%.0f'%b),ha='center',va='bottom',fontsize=10)
    61. plt.axis('off')
    62. app=xw.App(visible=False)
    63. workbook=app.books.open('F:\\t\\常用图.xlsx')
    64. worksheet=workbook.sheets['0']
    65. worksheet.pictures.add(figure,name='2',update=True,left=200)
    66. workbook.save()
    67. workbook.close()
    68. app.quit()
    69. #案例3 制作散点图
    70. import pandas as pd
    71. import matplotlib.pyplot as plt
    72. import xlwings as xw
    73. df=pd.read_excel('F:\\t\\常用图.xlsx')
    74. figure=plt.figure()
    75. plt.rcParams['font.sans-serif']=['SimHei']
    76. plt.rcParams['axes.unicode_minus']=False
    77. x=df['序号']
    78. y=df['销售额']
    79. plt.scatter(x,y,s=400,color='red',marker='o',edgecolor='black')
    80. plt.xlabel('序号',fontdict={'family':'SimHei','color':'black'})
    81. plt.ylabel('销售额',fontdict={'family':'SimHei','color':'black'})
    82. plt.title('销售额图',fontdict={'family':'SimHei','color':'black'},loc='center')
    83. plt.show()
    84. #案例3 制作散点图和线性趋势
    85. import pandas as pd
    86. import matplotlib.pyplot as plt
    87. import xlwings as xw
    88. from sklearn import linear_model
    89. df=pd.read_excel('F:\\t\\常用图.xlsx')
    90. figure=plt.figure()
    91. plt.rcParams['font.sans-serif']=['SimHei']
    92. plt.rcParams['axes.unicode_minus']=False
    93. x=df['序号']
    94. y=df['销售额']
    95. plt.scatter(x,y,s=400,color='red',marker='o',edgecolor='black')
    96. plt.xlabel('序号',fontdict={'family':'SimHei','color':'black'})
    97. plt.ylabel('销售额',fontdict={'family':'SimHei','color':'black'})
    98. plt.title('销售额图',fontdict={'family':'SimHei','color':'black'},loc='center')
    99. model=linear_model.LinearRegression().fit(x.values.reshape(-1,1),y)
    100. pred=model.predict(x.values.reshape(-1,1))
    101. plt.plot(x,pred,color='black',linewidth=3,linestyle='solid',label='线型趋势')
    102. plt.legend(loc='upper left')
    103. plt.show()
    104. #案例3 气泡
    105. import pandas as pd
    106. import matplotlib.pyplot as plt
    107. import xlwings as xw
    108. from sklearn import linear_model
    109. df=pd.read_excel('F:\\t\\常用图.xlsx')
    110. figure=plt.figure()
    111. plt.rcParams['font.sans-serif']=['SimHei']
    112. plt.rcParams['axes.unicode_minus']=False
    113. x=df['序号']
    114. y=df['销售额']
    115. plt.scatter(x,y,s=y*50,color='red',marker='o',edgecolor='black')#sy的倍数,气泡图
    116. plt.xlabel('序号',fontdict={'family':'SimHei','color':'black'})
    117. plt.ylabel('销售额',fontdict={'family':'SimHei','color':'black'})
    118. plt.title('销售额图',fontdict={'family':'SimHei','color':'black'},loc='center')
    119. #气泡图显示产品类型
    120. for a,b,c in zip(x,y,z):
    121. plt.text(a,b,c,ha='center',va='center',fontsize=30,color='white')
    122. #坐标轴
    123. plt.xlim(0,10)
    124. plt.ylim(0,60)
    125. plt.show()
    126. #案例4 饼图
    127. import pandas as pd
    128. import matplotlib.pyplot as plt
    129. df=pd.read_excel('F:\\t\\常用图.xlsx')
    130. plt.rcParams['font.sans-serif']=['SimHei']
    131. plt.rcParams['axes.unicode_minus']=False
    132. x=df['序号']
    133. y=df['销售额']
    134. plt.pie(y,labels=x,labeldistance=1.1,autopct='%.2f%%',pctdistance=0.8,startangle=90,radius=1.0,explode=[0,0,0,0,0,0,0,0.2,0])
    135. plt.xlabel('序号',fontdict={'family':'SimHei','color':'black'})
    136. plt.ylabel('销售额',fontdict={'family':'SimHei','color':'black'})
    137. plt.title('销售额图',fontdict={'family':'SimHei','color':'black'},loc='center')
    138. plt.show()
    139. #案例4 圆环 wedgeprops 用于设置饼图的属性,取值为字典,字典中的元素是饼图的各个属性的值
    140. import pandas as pd
    141. import matplotlib.pyplot as plt
    142. df=pd.read_excel('F:\\t\\常用图.xlsx')
    143. plt.rcParams['font.sans-serif']=['SimHei']
    144. plt.rcParams['axes.unicode_minus']=False
    145. x=df['序号']
    146. y=df['销售额']
    147. #饼图块的宽度 'width':0.3 小于饼图半径 radius=1.0
    148. plt.pie(y,labels=x,autopct='%.2f%%',pctdistance=0.8,radius=1.0,wedgeprops={'width':0.3,'linewidth':2,'edgecolor':'white'})
    149. plt.xlabel('序号',fontdict={'family':'SimHei','color':'black'})
    150. plt.ylabel('销售额',fontdict={'family':'SimHei','color':'black'})
    151. plt.title('销售额图',fontdict={'family':'SimHei','color':'black'},loc='center')
    152. plt.show()
    153. #案例5 雷达图 ********
    154. import pandas as pd
    155. import numpy as np
    156. import matplotlib.pyplot as plt
    157. df=pd.read_excel('C:\\Users\\Administrator\\Documents\\py\\雷达图.xlsx')
    158. df=df.set_index('zb')
    159. df=df.T
    160. df.index.name='品牌'
    161. def plot_radar(data,feature):
    162. plt.rcParams['font.sans-serif']=['SeiHei']
    163. plt.rcParams['axes.unicode_minus']=False
    164. cols=['zb1','zb2','zb3','zb4','zb5','zb6','zb7','zb8']#指定显示的性能评价名称
    165. colors=['green','blue','pink','red']
    166. angles=np.linspace(0.1*np.pi,2.1*np.pi,len(cols),endpoint=False)#
    167. angles = np.append(angles, angles[0]) # 在末尾添加第一个值,保证曲线闭合
    168. #angles=np.concatenate((angles,[angles[0]])) #更新版本后需要注销 连接刻度线
    169. #feature=np.concatenate((feature,[feature[0]]))
    170. fig=plt.figure(figsize=(8,8))
    171. ax=fig.add_subplot(111,polar=True)
    172. for i,c in enumerate(feature):
    173. stats=data.loc[c]#获取品牌对应坐标
    174. #stats=np.concatenate((stats,[stats[0]])) #[stats[0]] #更新版本后需要注销 连接指标品牌数据
    175. stats=np.append(stats,stats[0]) # 在末尾添加第一个值,保证曲线闭合
    176. ax.plot(angles,stats,'-',linewidth=6,c=colors[i],label='%s'%(c))#构建图
    177. ax.fill(angles,stats,color=colors[i],alpha=0.25)#填充颜色
    178. ax.legend()
    179. ax.set_yticklabels([])
    180. ax.set_thetagrids(angles*180/np.pi,cols,fontsize=16)#添加并设置数据标签
    181. plt.show()
    182. return fig
    183. fig=plot_radar(df,['A','B','C','D'])
    184. #https://blog.csdn.net/u014421797/article/details/103842928 参考雷达图
    185. #案例6 温度计 ***柱形图叠加,先目标后,实际完成数据
    186. import pandas as pd
    187. import numpy as np
    188. import matplotlib.pyplot as plt
    189. df=pd.read_excel('C:\\Users\\Administrator\\Documents\\py\\雷达图.xlsx')
    190. sum=0
    191. for i in range(12):
    192. sum=df['销售额'][i]+sum
    193. goal=df['销售额'][13]
    194. percentage=sum/goal
    195. plt.bar(1,1,color='yellow')
    196. plt.bar(1,percentage,color='cyan')
    197. plt.xlim(0,2)
    198. plt.ylim(0,1.2)
    199. plt.text(1,percentage-0.01,percentage,ha='center',va='top',fontdict={'color':'black','size':20})
    200. plt.show()


    第9章:excel之插件python
    另涉及pip打包
    详情见书(书中涉及很少,需要拓展其他资料)