赞
踩
Pandas 是 Python 语言的一个扩展程序库,用于数据分析。
Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具。
Pandas 名字衍生自术语 "panel data"(面板数据)和 "Python data analysis"(Python 数据分析)。
Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算)。
Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。
Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。
Pandas 广泛应用在学术、金融、统计学等各个数据分析领域。
pip install pandas
pip install openpyxl
- import pandas as pd
- import os
-
- excel_path = '%s\\house.xlsx' % (os.getcwd())
- house = pd.read_excel(excel_path)
- # print(house.shape) # shape关键获取表格的行数和列数,打印结果:(9869, 18)
- # print(house.楼盘名称)#打印表格汇总表头是“楼盘名称”列的值
-
- # '''需求1:统计房租最贵/最便宜的前五个数据'''###################################
- house.房租 = house.房租.str.split('元', expand=True)[0].astype('int')
- # 统计房租最贵的前5个数据
- # print(house.sort_values('房租').tail(5))
- # 统计房租最便宜的前5个数据
- # print(house.sort_values('房租').head(5))
- # 返回最初行:head()
- # 返回最后行:tail()
-
- # '''需求2:统计北京每个区域发不了多少条租房信息'''###################################
- total = house.区域.value_counts() # 返回区域关联的数据行数,默认降序
- # print(total)
-
- # '''需求3:从数据中筛选出房租大于28万的'''###################################
- # print(house[house.房租 >= 280000]['房租'])
- len(house[house.房租 >= 280000])
-
- # '''需求4:统计比较受欢迎的租金价格'''###################################
- hot_counts = house.房租.value_counts() # 房租价格出现的次数
- top_counts = hot_counts[hot_counts >= 100].index # 房租价格出现100次及以上的数据
- # print(top_counts)
-
- # '''需求5:统计北京每个区域平均租金是多少'''###################################
- rate = house.groupby('区域').房租.mean().sort_values(ascending=False)
- # print(rate) #打印每个区域的平均租金
- # goupby 分组; mean() 平均值;
-
- # '''需求6:按地区分割成若干个Excel文件'''###################################
- area_list = house['区域'].unique() # 去重,变成列表
- # print(area_list)
-
- # isin 过滤,对数据进行抽取
- for i in area_list:
- data = house[house['区域'].isin([i])]
- # data.to_excel(i+'.xlsx',index=False,encoding='utf-8')
-
- # '''需求7:把分隔好的10Excel文件合并在一起'''###################################
- path = 'D:\\PycharmProjects\\Python_Office_Auto\\Day7\\'
- dfs = [] # 定义一个空的列表,用来装10个Excel文件
- for j in area_list:
- dfs.append(pd.read_excel(path + j + '.xlsx'))
- # !!!!!!!pandas合并的函数:concat
- df = pd.concat(dfs)
- df.to_excel('area_10.xlsx', index=False)
-
- # '''需求8:清除部分相同的数据,保留最后一个录入的数据'''###################################
- house_5 = house.loc[:5] # 从house中读取5条数据
- house_5.to_excel('house_5.xlsx', index=False) # 把读出来的5条数据放入表格中
- house_5_path = 'D:\\PycharmProjects\\Python_Office_Auto\\Day7\\house_5.xlsx'
- house_5 = pd.read_excel(house_5_path)
-
- # keep = 'first' 删除第一次出现的
- # keep = 'last' 删除最后一次出现的
- new_data = house_5.drop_duplicates(subset=['楼盘名称', '户型'], keep='first')
- print(new_data)
DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。
以下代码中有用到numpy,需要提前安装好。安装命令:
pip3 install numpy scipy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
ndarray 对象是用于存放同类型元素的多维数组。
ndarray 中的每个元素在内存中都有相同存储大小的区域。
创建一个 ndarray 只需调用 NumPy 的 array 函数即可:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
参数说明:
名称 | 描述 |
---|---|
object | 数组或嵌套的数列 |
dtype | 数组元素的数据类型,可选 |
copy | 对象是否需要复制,可选 |
order | 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) |
subok | 默认返回一个与基类类型一致的数组 |
ndmin | 指定生成数组的最小维度 |
实例:
- import pandas as pd
- import numpy as np
-
- path = 'D:\\PycharmProjects\\Python_Office_Auto\\Day7\\全量.xlsx' # 定义文件路径
- ql = pd.read_excel(path) # 用pandas读取表格文件
-
- ##############把两列装到dataframe中##########
- # no.1 提取 描述、数字两个字段
- num_list = [str(x) for x in ql.数字.values]
- # print(num_list)
-
- # 列表生成式:把for和函数写在括号中。
- # 作用:生成一个全新的列表。
- # 示例
- # [i for i in range(3)] # 运行结果:[0,1,2]
-
- # 把 描述 列的值装到列表中
- # desc_list = [d for d in ql.描述.values]
- desc_list = ql.描述.values.tolist()
- # print(desc_list)
-
- # no.2 把两个列表装到DataFrame中
- df = pd.DataFrame({'描述': desc_list, '数字': num_list})
- # print(df) #验证dataframe数据结构
-
- ###################把描述进行分类,以描述和数字进行组合#################
- group_data = np.array(df.groupby(['描述']), dtype=None)
- group_num = len(group_data)
-
- # print(group_data[0]) # 一整个分类的数据,通过0,1,2来查询对应的分组
- # print(group_data[0][0]) # 只包含分类的名字
- # print(group_data[0][1]) # 只包含分类的数据
- # print(group_data[0][1]['描述']) # 只包含分类的数据里的描述字段和它的值
-
- # 创建一个空的字典
- dict_empty_desc = {}
-
- for j in range(group_num):
- num_group_list = [] # 定义空列表装分组的数字
- for i in group_data[j][1]['数字']:
- num_group_list.append(i)
- group_name = group_data[j][0]
- dict_empty_desc.update({group_name: num_group_list})
- # print(dict_empty_desc)
-
- ######################对原始全量数据进行去重##############################
- # 把dict_empty_desc里的list值拼接成字符串
- # 把拼接好的字符串,赋值给去重的数据的数据字段
-
- # 去重,保留第一行数据
- newdata = ql.drop_duplicates(subset=['描述'], keep='first')
-
- # 重置索引,连续的数据更好处理0,1,2
- newdata = newdata.reset_index(drop=True)
-
- # 把数字变成字符串,便于赋值处理
- newdata.数字 = newdata.数字.astype('str')
-
- # 验证被去重过的数据
- # print(newdata)
-
- # 把描述字段的值取出来,通过if判断
- # 如果去重数据里面的描述字段的值在dict_empty_desc里面
- # 就把dict_empty_desc里面的值拼接成123+233+2+3+4
-
- # {'abd':['123','233','2','3','4'],'卡卡':['8','4445','43434']}
-
- j = 0
- for i in newdata.描述:
- if i in dict_empty_desc.keys():
- str_desc_num_dict = '+'.join(dict_empty_desc[i])
- newdata.loc[j, '数字'] = str_desc_num_dict
- j = j + 1
- # print(newdata)
- newdata.to_excel('newdata.xlsx')
- # 安装:pip install openpyxl
-
- # 引入
- from openpyxl import Workbook
-
- # 创建工作簿
- workbook = Workbook()
- ws = workbook.active # 激活
-
-
- # 功能1:创建sheet工作表,起名,赋值
- def create_sheet():
- ws1 = workbook.create_sheet('Mysheet') # 创建工作表并起名
- ws12 = workbook.create_sheet('Mysheet1', 0)
- ws12.title = 'newMysheet1' # 修改sheet名称
-
- # 给工作表A1单元格赋值 32
- ws1['A1'] = 32
- # 给newMysheet1的A10单元格赋值为666
- ws12['A10'] = 666
-
- workbook.save('create_sheet.xlsx') # 保存
-
-
- # 功能2:给Excel表插入数据
- def insert_value():
- # 第一种插入方式
- ws['A1'] = '刘亦菲'
- ws['A2'] = '张韶涵'
-
- # 第二种插入方式
- ws.cell(row=4, column=2, value='赵丽颖')
-
- # 第三种插入方式
- ws.append([4, 5, 6]) # 在现有数据下方,按行追加
-
- workbook.save('insert_value.xlsx')
-
-
- # 功能3:获取并打印表格中数据
- from openpyxl import load_workbook
-
- def get_value():
- workbook2 = load_workbook('test.xlsx')
- ws2 = workbook2.active
- print(ws2['B4'].value)
- for row in ws2.iter_rows(min_row=1, max_row=2, min_col=1, max_col=2, values_only=True):
- print('打印Excel数据:', row) # ('杨幂!', '张小乐') 数据类型:元组,也可叫安全列表(元组中的值不允许修改)
-
-
- # 功能4:删除表格中的数据
- def del_value():
- workbook3 = load_workbook('test.xlsx')
- ws3 = workbook3.active
- ws3.delete_rows(4, 5) # 删除第4行到第5行
- ws3.delete_cols(3) # 删除第3列
- workbook3.save('del_value.xlsx')
-
-
- if __name__ == '__main__':
- # create_sheet()
- # insert_value()
- # get_value()
- del_value()
安装:pip install pyecharts
实例1:
- from pyecharts.charts import Bar
- from pyecharts import options as opts
- # 内置主题类型可查看 pyecharts.globals.ThemeType
- from pyecharts.globals import ThemeType
- from openpyxl import load_workbook
-
-
- # 读取表格数据
- def read_excel():
- wb = load_workbook('商品季度售卖表.xlsx')
- ws = wb.active
-
- # 创建四个列表,装四列数据
- shop_name_list = []
- first_count_list = []
- second_count_list = []
- third_count_list = []
-
- for row in ws.iter_rows(min_row=1, max_row=6, min_col=1, max_col=4, values_only=True):
- shop_name_list.append(row[0])
- first_count_list.append(row[1])
- second_count_list.append(row[2])
- third_count_list.append(row[3])
- shop_name_list.pop(0)
- first_count_list.pop(0)
- second_count_list.pop(0)
- third_count_list.pop(0)
- return shop_name_list, first_count_list, second_count_list, third_count_list
-
-
- def bar_base():
- name, first, second, third = read_excel()
- bar = (
- Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
- .add_xaxis(name)
- .add_yaxis('第一周', first)
- .add_yaxis('第二周', second)
- .add_yaxis('第三周', third)
- .set_global_opts(title_opts=opts.TitleOpts(title="主标题", subtitle="副标题"))
- )
-
- # render():生成html文件
- return bar.render()
-
-
- if __name__ == '__main__':
- bar_base()
实例1的结果:
还可以做饼状图、折线图等,详细可参考:
https://pyecharts.org/#/zh-cn/quickstart
爬虫:一段自动抓取互联网信息的程序,从互联网上抓取对于我们有价值的信息。
- # 安装:pip install requests
- # 引入
- import requests
-
- # 1. 访问同乐学堂首页,并返回请求数
- r = requests.get('http://www.ztloo.com')
-
- # 2. 判断获取请求是否成功
- print(r.status_code) # 200
-
- # 3. 判断请求的同乐学堂首页的内容的类型
- print(r.headers['content-type']) # text/html; charset=UTF-8
-
- # 4. 获取同乐学堂首页的文本(字符串)内容
- # print(r.text)
-
- # 5. 查看网站的编码
- print(r.encoding)
-
- ############################################################################
- # 6. 链接传参
- r1 = requests.get('http://www.ztloo.com', params={'s': 'python'})
-
- # 验证是否访问成功
- print(r1.status_code)
-
- # 查看最后访问的url
- print(r1.url) # 打印结果:http://www.ztloo.com/?s=python
-
- # 数据接口地址
- # http://www.ztloo.com/wp-json/wp/v2/posts?per_page=2
-
- # 接口内容详解:
- # id 文章id
- # date 文章发布日期
- # status 发布状态
- # link 前台文章地址
- # title 文章标题
- # content 文章内容
-
- # 返回json数据:通过基础数据结构进行嵌套,然后转换成字符串格式,进行数据的传输。
-
- ##############################################################################
- # 7. 访问同乐学堂json数据接口
- # http://www.ztloo.com/wp-json/wp/v2/posts?per_page=2
- params = {
- 'per_page': 2
- }
- url = 'http://www.ztloo.com/wp-json/wp/v2/posts'
- page = requests.get(url, params=params)
- b = page.json() # 把str的内容转换成list
- # 取出数据接口中的文章标题
- print(b[0]['title']['rendered']) # 打印结果:Pandas 的YYDS教程目录
-
- import time
- import requests
- from bs4 import BeautifulSoup
- import os
- import random
-
- # 定义url
- url = 'http://jandan.net/ooxx'
- # 定义头部
- headers = {
- 'referer': 'http://jiandan.net',
- 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
- }
- # 定义变量:图片数量计数
- jpg_index = 0
-
-
- # 定义下载图片方法
- def get_jpg(url):
- # 将函数内容的变量定义为全局变量
- global jpg_index
- # 解析
- soup = BeautifulSoup(requests.get(url, headers=headers).text, 'lxml')
- # 查看网页源码,图片都有class属性,名称都为view_img_link。
- # 找到所有a标签中的图片
- img_list = soup.find_all('a', attrs={'class': 'view_img_link'})
-
- # 遍历图片列表
- for img in img_list:
- # 拼接图片链接
- img_url = 'http:' + img.get('href')
- # 爬虫限速,3~8s
- time.sleep(random.randint(3, 8))
- # 根据拼接的url解析页面
- r = requests.get(img_url)
- # 定义存储图片和路径和名称
- img_path = os.getcwd() + '\\images\\' + str(jpg_index + 1) + '.jpg'
- # 下载图片,存储
- with open(img_path, 'wb') as f:
- f.write(r.content)
-
- print('正在下载第%s条' % (jpg_index + 1))
- jpg_index += 1
-
-
- if __name__ == '__main__':
- # 定义一个循环,用于翻页
- for i in range(0, 2):
- # 执行下载图片的方法
- get_jpg(url)
- # 解析页面。找到【下一页】
- next_page = BeautifulSoup(requests.get(url, headers=headers).text, 'lxml').find('a', attrs={
- 'class': 'previous-comment-page'})
-
- # 如果有【下一页】,拼接下一页的URl,复制给全局变量URL
- if next_page != None:
- next_page_url = 'http:' + next_page.get('href')
- url = next_page_url # 更新url
- else:
- print('没有下一页存在,爬虫完成!')
pip install pandas-datareader
美股直接输入股票代码,如:BABA
港股直接输入代码+对应股市,如腾讯:0700.hk
国内股票需要区分上证和深证,股票代码后面加.ss或.sz
- from pandas_datareader import data
-
- # 阿里巴巴股票代码
- stocker_code = 'BABA'
- # 开始日期
- start_date = '2020-11-11'
- # 结束日期
- end_date = '2021-11-11'
- # 获取股票信息
- stocker_info = data.get_data_stooq(stocker_code, start_date, end_date)
- # 打印股票前五条信息
- print(stocker_info.head(5))
- # 打印股票后五条信息
- print(stocker_info.tail(5))
- # 把获取到的股票信息存到表格
- stocker_info.to_excel(stocker_code + '.xlsx')
注:上课的视频中用到的是get_data_yahoo,雅虎的不能用了,所以换成get_data_stooq
打印出的股票信息中表头的含义:
日期 | 开盘价 | 单股最高 | 单独最低 | 收盘价 | 交易量 |
Date | Open | High | Low | Close | Volume |
例子:抓股票信息,把收盘价生成折线图
- # 1. 引入库
- import pandas_datareader as data
- from pyecharts.charts import Line
- from pyecharts import options as opts
-
-
- # 2. 准备折线图的模板
- def fold_line():
-
- # 获取阿里巴巴2017双十一~2019双十一的股票信息
- alibaba = data.get_data_stooq('BABA', '2017-11-11', '2019-11-11')
- print(alibaba)
- # 获取,Adj Close的价格列表,作为统计图的Y轴 收盘价格
- adj_list = alibaba['Close'].values.tolist()
- # 获取,日期列表,作为统计图的X轴
- timelist = alibaba['Close'].index.tolist()
- # 日期列表
- date_list = []
- for i in timelist:
- date_list.append(i.strftime('%Y/%m/%d')) # 股票的日期时间格式化2019/11/11
-
- # 生成折线图
- c = (
- Line()
- .add_xaxis(date_list)
- .add_yaxis('收盘价格', adj_list, is_smooth=True)
- .set_global_opts(
- title_opts=opts.TitleOpts(title='阿里巴巴股票走势'),
- datazoom_opts=opts.DataZoomOpts()
- )
- )
- return c.render()
-
-
- if __name__ == '__main__':
- fold_line()
生成的折线图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。