Python|数据分析与网络爬虫

某农带专业Python课实验四

numpy数据分析

题目描述:利用numpy库完成2项编程任务。实验效果如图1-1所示。

(1)创建一个一维数组arr1,存放10个[10, 99]随机整数,计算其最大值,最小值和平均值。

(2)创建一个二维数组arr2,存放5行5列共25个[10, 99]随机整数,计算其最大值,最小值和平均值。

提示:使用numpy.array( )函数创建,通过列表生成数组对象。

# -*- coding: utf-8 -*-
"""
PROJECT_NAME: pythonProject_ lesson 
FILE_NAME: numpy_analysis
AUTHOR: welt 
E_MAIL: tjlwelt@foxmail.com
DATE: 2022/12/8 
"""
import numpy as np

if __name__ == '__main__':
   arr1 = np.random.randint(10, 99, 10)
   arr1_max = arr1.max()
   arr1_min = arr1.min()
   arr1_mean = arr1.mean()
   print("一维数组: ", arr1)
   print("数据分析: 最大值={} 最小值={} 平均值={}".format(arr1_max, arr1_min, arr1_mean))
   arr2 = np.random.randint(10, 99, (5, 5))
   arr2_max = arr2.max()
   arr2_min = arr2.min()
   arr2_mean = arr2.mean()
   print("二维数组: ", arr2)
   print("数据分析: 最大值={} 最小值={} 平均值={}".format(arr2_max, arr2_min, arr2_mean))

pandas数据分析

题目描述:利用pandas库完成2项编程任务。

(1)利用列表、元组和字典分别创建3个一级索引的数据结构Series。

(2)利用字典和Series分别创建2个二级索引的数据结构DataFrame。

提示:使用pandas.Series( )和pandas.DataFrame( )分别创建一维Series和二维DataFrame数据结构;

# -*- coding: utf-8 -*-
"""
PROJECT_NAME: pythonProject_ lesson 
FILE_NAME: pandas_analysis
AUTHOR: welt 
E_MAIL: tjlwelt@foxmail.com
DATE: 2022/12/8 
"""

import pandas as pd

if __name__ == '__main__':
   print("创建3个一级索引的Series数据结构: ", end='\n')
   obj_list = [98, 88, 78, 68]
   obj_tuple = ("C++程序设计", "Python程序设计", "Java程序设计", "物联网工程")
   obj_dict = {"201801": ["张珊", 18, "女", "计算机1801"],
               "201802": ["李斯", 19, "男", "计算机1802"],
               "201803": ["王武", 18, "男", "计算机1803"],
               "201804": ["赵柳", 19, "女", "计算机1804"]}
   series_list = pd.Series(obj_list, index=["No1", "No2", "No3", "No4"])
   series_tuple = pd.Series(obj_tuple, index=["cId0001", "cId0002", "cId0003", "cId0004"])
   series_dict = pd.Series(obj_dict)
   print("(1)通过列表创建第一个Series数据结构: ")
   print(series_list)
   print("(2)通过元组创建第二个Series数据结构: ")
   print(series_tuple)
   print("(3)通过字典创建第三个Series数据结构: ")
   print(series_dict)

   print("(1)通过字典创建第一个DataFrame数据结构(学生信息): ")
   print("创建2个二级索引的DataFrame数据结构:", end='\n')
   stu = {"学号": ["201801", "201802", "201803", "201804", "201801"],
          "姓名": ["张珊", "李斯", "王武", "赵柳", "周琪"],
          "年龄": [18, 19, 19, 18, 18],
          "性别": ["女", "男", "男", "女", "女"],
          "班级": ["计算机1801", "计算机1802", "计算机1803", "计算机1804", "计算机1801"]
          }
   dataframe_stu = pd.DataFrame(stu)
   print(dataframe_stu)
   print("(2)通过Series创建第二个DataFrame数据结构(教师信息):")
   obj_index = ["工号", "姓名", "年龄", "性别", "职称"]
   series_list1 = pd.Series(["2001020", "张珊", 38, "女", "副教授"], index=obj_index)
   series_list2 = pd.Series(["2001021", "李斯", 39, "男", "副教授"], index=obj_index)
   series_list3 = pd.Series(["2001023", "王武", 39, "男", "副教授"], index=obj_index)
   series_list4 = pd.Series(["2001024", "赵柳", 38, "女", "副教授"], index=obj_index)
   series_list5 = pd.Series(["2001025", "周琪", 38, "女", "副教授"], index=obj_index)
   dataframe_t = pd.DataFrame([series_list1, series_list2, series_list3, series_list4, series_list5])
   print(dataframe_t)

matplotlib数据可视化

题目描述:利用csv、random、datetime、pandas和matplotlib库完成5项编程任务。

(1)利用csv、random和datetime创建1个WPF商店2018年营业额模拟数据文件data.csv,此文件中包含两列数据(日期date、销量amount)。模拟数据随机生成共365条,数据日期date起于2018-01-01止于2018-12-31,数据销量amount的取值范围为[300,600]之间。

(2)利用pandas读取文件data.csv中数据,创建1个行列索引的数据结构DataFrame,并删除其中的所有缺失值。

(3)利用matplotlib生成折线图,按每天进行统计,显示商店每天的销量情况,并把图形保存为本地文件day_amount_plot.png。实验效果如下图所示。

image-20221219163647393

(4)利用matplotlib生成柱状图,按月份进行统计,显示商店每月的销量情况,并把图形保存为本地文件month_amount_bar.png。实验效果如下图所示。同时,找出相邻两个月最大涨幅,并把涨幅最大的月份写入到文件maxMonth.txt中。

image-20221219163721174

(5)利用matplotlib生成饼状图,按季度进行统计,显示商店4个季度的销量分布情况,并把图形保存为本地文件season_amount_pie.png。实验效果如下图所示。

image-20221219163739490

提示:使用pandas.DataFrame( )创建二维DataFrame数据结构;使用matplotlib.pyplot库中的figure( )、plot( )、bar( )、pie( )、title( )、savefig( )和show( )等创建数据可视化图片,其功能分别设置图片大小、生成这线图、生成柱状图、生成饼状图、设置图片标题、保存图片和显示图片等。

# -*- coding: utf-8 -*-
"""
PROJECT_NAME: pythonProject_ lesson 
FILE_NAME: plt_vis 
AUTHOR: welt 
E_MAIL: tjlwelt@foxmail.com
DATE: 2022/12/8 
"""

import csv
import datetime
import random
import matplotlib.pyplot as plt
import pandas as pd

if __name__ == '__main__':
   with open(r"data.csv", "w+", newline='') as csvfile:
      wr = csv.writer(csvfile, dialect="excel")
      wr.writerow(["date", "amount"])
      startDate = datetime.date(2018, 1, 1)
      for i in range(365):
         amount = random.randint(300, 600)
         wr.writerow([startDate, amount])
         startDate = startDate + datetime.timedelta(days=1)

   df = pd.read_csv("data.csv")
   df = df.dropna()
   fig = plt.figure(figsize=(12, 6))
   ax = fig.add_subplot(1, 1, 1)
   plt.plot(df["date"], df["amount"], label="day->amount", color="red", linewidth=2)
   plt.legend(loc="best")
   plt.title("2018 Day Business Volume of Wpf Store")
   plt.xlabel("date")
   plt.ylabel("amount")
   plt.xlim("2018-01-01", "2018-12-31")
   plt.savefig("day_amount_plot.png", )
   plt.show()

   df1 = df
   df1["month"] = df1["date"].map(lambda x: x[:x.rindex('-')])
   df1 = df1.groupby(by="month", as_index=False).sum()
   plt.figure(figsize=(12, 6))
   plt.bar(df1["month"], df1["amount"], label="month->amount", color="blue")
   plt.title("2018 Month Business Volume of Wpf Store")
   plt.xlabel("month")
   plt.ylabel("amount")
   plt.xlim("2018-01", "2018-12")
   plt.legend(loc='best')
   plt.savefig("month_amount_bar.png")
   plt.show()

   df2 = df1.drop("month", axis=1).diff()
   m = df2["amount"].nlargest(1).keys()[0]
   with open("max_month.txt", 'w') as txtfile:
      txtfile.write(df1.loc[m, "month"])
   txtfile.close()

   season1 = df1[:3]['amount'].sum()
   season2 = df1[3:6]['amount'].sum()
   season3 = df1[6:9]['amount'].sum()
   season4 = df1[9:12]['amount'].sum()
   plt.figure(figsize=(12, 6))
   plt.pie([season1, season2, season3, season4], labels=["season1", "season2", "season3", "season4"])
   plt.title("2018 Season Business Volume of Wpf Store")  # 设置图标题
   plt.savefig('season_amount_pie.png')
   plt.show()

   csvfile.close()  # 关闭文件

scipy数据分析

题目描述:利用scipy库完成2项编程任务。

(1)求解线性方程组。如下式所示。

\[\left\{\begin{array}{l} 5 x+2 y+3 z=6 \\ 2 x+3 y-4 z=7 \\ 3 x-4 y-5 z=8 \end{array}\right. \]

(2)图像处理。预处理灰度图片效果、平移处理未自动填充图片效果、平移处理自动填充图片效果、旋转处理图片效果如下图所示:

image-20221219153746139image-20221219153809351image-20221219153825577image-20221219153853724

提示:使用scipy.mat( )和scipy.linalg.solve( )对线性方程求解;

使用scipy.ndimage和scipy.misc库对图像进行处理。使用pylab内部图库

# -*- coding: utf-8 -*-
"""
PROJECT_NAME: pythonProject_ lesson 
FILE_NAME: scipy_analysis 
AUTHOR: welt 
E_MAIL: tjlwelt@foxmail.com
DATE: 2022/12/8 
"""
import scipy
from scipy import ndimage
from scipy import misc
import pylab as pl
import numpy as np

if __name__ == "__main__":
   print("方程求解的结果为: ", end='\n')
   a = np.mat("[5 2 3; 2 3 -4; 3 -4 -5]")
   b = np.mat("[6; 7; 8]")
   result = scipy.linalg.solve(a, b)
   print(result)

   ascent = misc.ascent()
   shifted_ascent = ndimage.shift(ascent, (50, 50))
   shifted_ascent2 = ndimage.shift(ascent, (50, 50), mode="nearest")
   rotated_ascent = ndimage.rotate(ascent, 30)

   pl.imshow(ascent)
   pl.figure()

   pl.imshow(shifted_ascent, cmap='gray')
   pl.figure()

   pl.imshow(shifted_ascent2, cmap='gray')
   pl.figure()

   pl.imshow(rotated_ascent, cmap='gray')
   pl.show()

requests爬取文本

题目描述:利用爬虫库requests、正则表达式解析库re和纯文本txt完成编程任务,任务是爬取豆瓣排行榜的电影名称。本爬虫实验分为三个步骤:

(1)第一步数据爬取,通过requests爬取豆瓣排行榜的电影名称数据;本步骤实验说明如下:

爬取网址url=”https://movie.douban.com/chart”

浏览器用户代理”User-Agent”:”Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebkit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.39”

说明:不同机器安装的浏览器用户代理也不一样,需要打开网址后,通过F12键打开开发工具查看URL和User-Agent。

(2)第二步数据解析,通过正则表达式re解析豆瓣排行榜的电影名称数据;

本步骤解析数据参考正则表达式是:re.compile(’<a.?nbg.?title=”(.*?)”>’,re.S)

(3)第三步存储数据,通过纯文本存储豆瓣排行榜的电影名称数据。

代码实现:

# -*- coding: utf-8 -*-
"""
PROJECT_NAME: pythonProject_ lesson 
FILE_NAME: douban_rank 
AUTHOR: welt 
E_MAIL: tjlwelt@foxmail.com
DATE: 2022/12/8 
"""

from lxml import etree
import requests
import time

if __name__ == '__main__':
   url = "https://movie.douban.com/chart"
   headers = {
      'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                    'Chrome/96.0.4664.93 Safari/537.36 '
   }

   data = requests.get(url, headers=headers).text

   s = etree.HTML(data)
   file = s.xpath('.//*[@id="content"]/div/div[1]/div/div/table/tr')
   time.sleep(3)
   Note = open('douban.txt', mode='w')
   for div in file:
      title = div.xpath("./td[1]/a/@title")[0]
      print(title)  # 输出爬取到的内容
      Note.write(title+'\n')

requests爬取图片

题目描述:利用爬虫库requests、html提取库beautifulsoup4(简称bs4)、html解析库lxml和urllib库完成编程任务,任务是爬取wallhaven网站上的壁纸图片。

(1)第一步数据爬取,通过requests爬取wallhaven的html数据;本步骤实验说明如下:

爬取网址url=”https://wallhaven.cc/search?q=id:711&sorting=random&ref=fp”

浏览器用户代理”User-Agent”:”Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebkit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Mobile Safari/537.36”

说明:不同机器安装的浏览器用户代理也不一样,需要打开网址后,通过F12键打开开发工具查看URL和User-Agent。

(2)第二步数据解析,通过html提取库beautifulsoup4和html解析库lxml提取并解析wallhaven的html数据,本步骤提取并解析数据参考方法是:

res=requests.get(url,headers=headers)
html=res.text
info=BeautifulSoup(html,”lxml”)
data=info.select(”#thumbs > section > ul > li > figure > img”)

(3)第三步存储数据,通过目录./spider_picture存储wallhaven网站上的壁纸图片。实验效果如下图所示。

image-20221219153422628

代码实现:

# -*- coding: utf-8 -*-
"""
PROJECT_NAME: pythonProject_ lesson 
FILE_NAME: wallhaven_image 
AUTHOR: welt 
E_MAIL: tjlwelt@foxmail.com
DATE: 2022/12/8 
"""

import requests
from bs4 import BeautifulSoup
import os

if __name__ == '__main__':
   url = "https://wallhaven.cc/search?q=id:711&sorting=random&ref=fp"
   header = {
      'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                    'Chrome/96.0.4664.93 Safari/537.36 '
   }
   res = requests.get(url, headers=header)
   html = res.text
   info = BeautifulSoup(html, "lxml")
   data = info.select("#thumbs section ul li figure img")
   imagelist =[]
   for i in data:
      image = i.get("data-src")
      imagelist.append(image)
   if not os.path.exists('./wallpapers'):
      os.mkdir('./wallpapers')
   path = './wallpapers/'
   for i in range(len(imagelist)):
      img_url = imagelist[i]
      img_data = requests.get(url=img_url, headers=header, timeout=20).content  # 获取壁纸图片的二进制数据,加入timeout限制请求时间
      img_name = img_url.split('/')[-1]  # 生成图片名字
      img_path = path + '/' + img_name
      with open(img_path, 'wb') as fp:
         fp.write(img_data)
posted @ 2022-12-19 16:41  Weltㅤ  阅读(324)  评论(0编辑  收藏  举报