Python办公自动化学习笔记(三)—Python与数据分析

一、 利用Pandas进行租房数据统计分析

1. pandas简介

Pandas 是 Python 语言的一个扩展程序库,用于数据分析。

Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具。

Pandas 名字衍生自术语 "panel data"(面板数据)和 "Python data analysis"(Python 数据分析)。

Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算)。

Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。

Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。

Pandas 广泛应用在学术、金融、统计学等各个数据分析领域。

2. 安装pandas

pip install pandas

3. 安装openpyxl

pip install openpyxl

4. 实例:利用Pandas处理Excel

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)

 二、 利用Pandas处理全量数据

1. Pandas 数据结构 - DataFrame

DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。

2.实例:去重、组合

以下代码中有用到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')

 三、 利用Openpyxl处理Excel与 利用Pyecharts生成可视化报告

1.  使用openyxl处理Excel:创建、插入、读取、删除

# 安装: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()

 2. 利用Pyecharts生成可视化报告:做统计图

安装: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

四、 Python的网络爬虫

1. 什么是爬虫

      爬虫:一段自动抓取互联网信息的程序,从互联网上抓取对于我们有价值的信息。

2. 正确写爬虫代码的思路

  • 确定目标网址,查看robots文件(是否允许爬取的协议),比如:https://www.taobao.com/robots.txt
  • 确定目标网址里我们要抓取的内容
  • 发现某种规律
  • 按照规律,下载图片视频文本等
  • 将下载内容存储到文件夹、Excel、数据库等

3. 爬虫注意事项

  • 不要越权爬取网站本身禁止的内容
  • 不要使用高速,分布式爬虫这样会导致产生DDOS攻击行为
  • 抓取到大量的原创内容,不得随意发布和修改,商业发布一定要得到许可,并声明来源
  • 构成犯罪条件-对目标网站造成功能干扰、访问流量增大、系统响应缓慢,影响正常运营则触犯法律

4. 实例1:简单爬取页面

# 安装: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教程目录

5. 实例2:爬取网站,下载图片、翻页

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('没有下一页存在,爬虫完成!')

6. 实例3:获取金融数据、股票信息

  • 安装读取股票数据函数库
  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

打印出的股票信息中表头的含义:

日期开盘价单股最高单独最低收盘价交易量
DateOpenHighLowCloseVolume

例子:抓股票信息,把收盘价生成折线图

# 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()

生成的折线图:

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lj606

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值