天天看点

第1次感兴趣的开发模块:(共6个)半年后期望做成的小项目:外卖比价平台

第1次感兴趣的开发模块:(共6个)半年后期望做成的小项目:外卖比价平台

感兴趣的开发模块:(共6个)

1. Requests

Requests库中有7个主要的函数

分别是 request() 、get() 、 head() 、post() 、put() 、patch() 、delete() 。这七个函数中request()函数是其余六个函数的基础函数,其余六个函数的实现都是通过调用该函数实现的。

方法说明

  • requests.request() 构造一个请求,支撑一下方法的基础方法
  • requests.get() 获取HTML网页的主要方法,对应于HTTP的GET(请求URL位置的资源)
  • requests.head() 获取HTML网页头信息的方法,对应于HTTP的HEAD(请求URL位置的资源的头部信息)
  • requests.post() 向HTML网页提交POST请求的方法,对应于HTTP的POST(请求向URL位置的资源附加新的数据)
  • requests.put() 向HTML网页提交PUT请求的方法,对应于HTTP的PUT(请求向URL位置储存一个资源,覆盖原来URL位置的资源)
  • requests.patch() 向HTML网页提交局部修改的请求,对应于HTTP的PATCH(请求局部更新URL位置的资源)
  • requests.delete() 向HTML网页提交删除请求,对应于HTTP的DELETE(请求删除URL位置储存的资源)

而这几个函数中,最常用的又是 requests.get() 函数。get函数有很多的参数,我只举几个比较常用的参数

参数说明

  • url 就是网站的url
  • params 将字典或字节序列,作为参数添加到url中,get形式的参数
  • data 将字典或字节序列,作为参数添加到url中,post形式的参数
  • headers 请求头,可以修改User-Agent等参数
  • timeout 超时时间
  • proxies 设置代理

2. Pandas

一般写法

import pandas as pd

主要特点

  • 使用默认和自定义索引的快速高效的DataFrame对象。
  • 用于将数据从不同文件格式加载到内存数据对象的工具。
  • 数据对齐和缺失数据的集成处理。
  • 重新设置和旋转日期集。
  • 大数据集的基于标签的分片,索引和子集。
  • 数据结构中的列可以被删除或插入。
  • 按数据分组进行聚合和转换。
  • 高性能的数据合并和连接。
  • 时间序列功能。

主要功能

导入数据

  • pd.read_csv(filename):从CSV文件导入数据
  • pd.read_table(filename):从限定分隔符的文本文件导入数据
  • pd.read_excel(filename):从Excel文件导入数据
  • pd.read_sql(query, connection_object):从SQL表/库导入数据
  • pd.read_json(json_string):从JSON格式的字符串导入数据
  • pd.read_html(url):解析URL、字符串或者HTML文件,抽取其中的tables表格
  • pd.read_clipboard():从你的粘贴板获取内容,并传给read_table()
  • pd.DataFrame(dict):从字典对象导入数据,Key是列名,Value是数据

导出数据

  • df.to_csv(filename):导出数据到CSV文件
  • df.to_excel(filename):导出数据到Excel文件
  • df.to_sql(table_name, connection_object):导出数据到SQL表
  • df.to_json(filename):以Json格式导出数据到文本文件

创建测试对象

  • pd.DataFrame(np.random.rand(20,5)):创建20行5列的随机数组成的DataFrame对象
  • pd.Series(my_list):从可迭代对象my_list创建一个Series对象
  • df.index = pd.date_range(‘1900/1/30’, periods=df.shape[0]):增加一个日期索引

查看、检查数据

  • df.head(n):查看DataFrame对象的前n行
  • df.tail(n):查看DataFrame对象的最后n行
  • df.shape():查看行数和列数
  • df.info():查看索引、数据类型和内存信息
  • df.describe():查看数值型列的汇总统计
  • s.value_counts(dropna=False):查看Series对象的唯一值和计数
  • df.apply(pd.Series.value_counts):查看DataFrame对象中每一列的唯一值和计数

数据选取

  • df[col]:根据列名,并以Series的形式返回列
  • df[[col1, col2]]:以DataFrame形式返回多列
  • s.iloc[0]:按位置选取数据
  • s.loc[‘index_one’]:按索引选取数据
  • df.iloc[0,:]:返回第一行
  • df.iloc[0,0]:返回第一列的第一个元素

数据清理

  • df.columns = [‘a’,’b’,’c’]:重命名列名
  • pd.isnull():检查DataFrame对象中的空值,并返回一个Boolean数组
  • pd.notnull():检查DataFrame对象中的非空值,并返回一个Boolean数组
  • df.dropna():删除所有包含空值的行
  • df.dropna(axis=1):删除所有包含空值的列
  • df.dropna(axis=1,thresh=n):删除所有小于n个非空值的行
  • df.fillna(x):用x替换DataFrame对象中所有的空值
  • s.astype(float):将Series中的数据类型更改为float类型
  • s.replace(1,’one’):用‘one’代替所有等于1的值
  • s.replace([1,3],[‘one’,’three’]):用’one’代替1,用’three’代替3
  • df.rename(columns=lambda x: x + 1):批量更改列名
  • df.rename(columns={‘old_name’: ‘new_ name’}):选择性更改列名
  • df.set_index(‘column_one’):更改索引列
  • df.rename(index=lambda x: x + 1):批量重命名索引

数据处理:Filter、Sort和GroupBy

  • df[df[col] > 0.5]:选择col列的值大于0.5的行
  • df.sort_values(col1):按照列col1排序数据,默认升序排列
  • df.sort_values(col2, ascending=False):按照列col1降序排列数据
  • df.sort_values([col1,col2], ascending=[True,False]):先按列col1升序排列,后按col2降序排列数据
  • df.groupby(col):返回一个按列col进行分组的Groupby对象
  • df.groupby([col1,col2]):返回一个按多列进行分组的Groupby对象
  • df.groupby(col1)[col2]:返回按列col1进行分组后,列col2的均值
  • df.pivot_table(index=col1, values=[col2,col3], aggfunc=max):创建一个按列col1进行分组,并计算col2和col3的最大值的数据透视表
  • df.groupby(col1).agg(np.mean):返回按列col1分组的所有列的均值
  • data.apply(np.mean):对DataFrame中的每一列应用函数np.mean
  • data.apply(np.max,axis=1):对DataFrame中的每一行应用函数np.max

数据合并

  • df1.append(df2):将df2中的行添加到df1的尾部
  • df.concat([df1, df2],axis=1):将df2中的列添加到df1的尾部
  • df1.join(df2,on=col1,how=’inner’):对df1的列和df2的列执行SQL形式的join

数据统计

  • df.describe():查看数据值列的汇总统计
  • df.mean():返回所有列的均值
  • df.corr():返回列与列之间的相关系数
  • df.count():返回每一列中的非空值的个数
  • df.max():返回每一列的最大值
  • df.min():返回每一列的最小值
  • df.median():返回每一列的中位数
  • df.std():返回每一列的标准差

3.NumPy

numpy的主要对象是同种元素的多维数组,所有的元素都必须是一种类型,可通过一个正整数元组索引的元素表格。在numpy中维度称为轴(axes),轴的个数叫做秩(rank)。Numpy的数组类型narray,其常用对象属性:

  • ndarray.dim 数组轴的个数
  • ndarray.shape 数组的维度
  • ndarray.size 数组元素的个数
  • ndarray.dtype 数组元素类型
  • ndarray.itemsize 数组每个元素的字节大小
  • ndarray.data 指向数据内存,包含实际数组元素

主要功能

创建数组:

  1. 通过list或元组创建ndarray,元素类型可以由给定的数据自动推导出来,也可以由设计者给定。
  2. 调用zeros/ ones/ empty/ zeros_like/ones_like/ eye等函数生成
  3. 调用arange/ linspace也可生成

打印数组:

使用print即可,如 a = np.arange(9).reshape(3,3),再调用print(a)即可将数组a显示出来。

基本运算:

1.数组的算术运算是按元素进行的。

设a = np.array([2,3]),b=np.array(7,8)

加法:c = a + b, 则c为 array([9,11])

加法:c = b - a, 则c为 array([5,5])

乘法:c = a * b, 则c为 array([14,24])

二次方:c = a ** 2,则c为array([4, 9])

当两个数组元素的类型不同时,其会进行类型转换,往更精确的方向转换,比如int和float相加,得到的结果为float

2.矩阵乘法 dot函数

索引:

  • 可通过arr[a, b], arr[:,b],arr[a, :],arr[m:n, b],arr[a, m:n],arr[m:n, p:q]等多种形式进行访问某个位置的元素、行或列。
  • arr[-1]表示访问最后一行
    for row in arr:  //表示按行访问arr
    
      print row
               
  • 若想访问每个数组中元素,可以使用flat属性,如
    for element in b.flat:
    
      print element
               

组合不同的数组:

可以沿不同轴将数组堆叠在一起:

  • Column_stack: 以列将一维数组组合成二维数组
  • Row_stack:以行将一维数组组合成二维数组
  • Hstack:水平方向堆叠
  • Vstack:垂直方向堆叠
  • Concatenate:允许可选参数给出组合时沿着的轴

将数组分割:

  • Hsplit:水平分割
  • Vsplit:垂直分割
  • Array_split:指定沿哪个轴分割

深拷贝与浅拷贝:

a= np.array([1,2,3]);

b= a;  #浅拷贝,即b与a指向同一个空间,  b is a = true

c= a.copy()  #深拷贝,把a的内容复制给了c,不指向同一空间, c isa = false

d = a.view() #浅复制,d与a指向同一数据空间,但是此时创建了新的对象,d is a=false
           

mat函数:

mat函数将目标数据类型转换为矩阵(matrix)

matrix对象是继承ndarray而来,因此其和ndarray有相同的属性和方法,但它们之间有六个重要的区别:

  • 矩阵对象可以使用字符串符号创建,以允许matlab风格语法
  • 矩阵对象总是二维的
  • 矩阵对象乘法就是矩阵乘法
  • Matrix objects over-ridepower to be matrix raised to a power. The same warning about using power insidea function that uses asanyarray(…) to get an array object holds for this fact.(这个没太懂)
  • 矩阵对象的默认优先级__array_priority__是10.0,因此与ndarrays的混合操作总是产生矩阵
  • 矩阵有其特殊属性,使计算更容易. arr.T矩阵转置,arr.I矩阵求逆,arr.H矩阵共轭, arr.A将矩阵作为一个ndarray对象返回

4. Matplotlib

matplotlib库是什么

matplotlib是python中常用的一个绘图库,他的功能相当于matlab,基本上matlab上能实现的绘图功能都能够通过matplotlib库来在python中进行实现。

matplotlib基础用法

matplotlib绘图使用的是其中的pyplot库,其核心思想包括以下几个步骤:

  • 定一个画布;
  • 在画布上绘制所需要展示的图表;
  • 展示画布内容。

一些常用图表的绘制方法

统计图表绘制

  • 直方图绘制
  • 饼状图绘制

散点图 & 曲线绘制

  • 散点图绘制
  • 一般曲线绘制

图片属性设置

  • 图片大小设置
  • 坐标轴设置
  • 网格设置

复杂图表绘制

  • 同一张图中绘制多条曲线
  • 以子图的方式绘制多条曲线
  • 同一张图中设置双坐标系
  • 在大图中绘制子图

5.TensorFlow

简介

  • 随着各种图像识别, 语音识别的记录被不断刷新, 深度学习被证明是一个极具潜力的技术方向. 构建高效, 可靠, 可扩展的基础工具, 能为这一领域发展起到极大作用.
  • Google 退出了一套深度学习系统: TensorFlow. TensorFlow 是目前最优秀的深度学习系统之一:
  • 具有灵活的表达能力, 能够快速实现各种算法
  • 高执行能力, 具备分布扩展性
  • 跨平台可移植性
  • 试验可复现性
  • 支持快速产品化, 模型可随时部署
  • TensorFlow 是一个基于数据流图的数值计算开源库.
  • 面向数值计算 (深度学习, 通用计算机应用) 数据流图是 TensorFlow 计算的抽象表示. 数据流图是有向图, 图中的各点表示各种数学的计算操作, 边表示操作与操作之间传递的高纬度数值数据, 称为 tensor. 支持各种设备的灵活部署, 分布式集群, 手机移动设备.

特点

TensorFlow 是一个机遇数据流编程的符号数学系统, 被广泛应用于各类机器学习算法的编程实现.

TensorFlow 的特点:

  • 多平台支持, 很容易在移动设备上运行
  • 内置了简单的高级 API, 使用方便
  • 支持可视化训练 (TensorBoard)
  • 容易实现生产部署 (TensorFlow Serving)
  • 良好的文档和广大的社区支持

6. PyTorch

基本用法

输出版本

import torch
print(torch.__version__)
           
1.7.0+cpu
           

创建a矩阵

a = torch.empty(5, 3)
print(a)
           
tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])
           

创建一个随机矩阵

b = torch.rand(5, 3)
print(b)
           
tensor([[0.7127, 0.1942, 0.3997],
        [0.2898, 0.1822, 0.7947],
        [0.2400, 0.9720, 0.9462],
        [0.3822, 0.0322, 0.7618],
        [0.4938, 0.8348, 0.9067]])
           

创建一个全0矩阵

c = torch.zeros(5, 3, dtype=torch.long)
print(c)
           
tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]])
           

直接传入数据

d = torch.tensor([5.5, 3])
print(d)
           
tensor([5.5000, 3.0000])
           

创建一个全1矩阵

e = torch.ones(5, 3, dtype=torch.double)
print(e)
           
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)
           

标准差是1的随机数

f = torch.rand_like(e, dtype=torch.float)
print(f)
           
tensor([[0.1031, 0.3789, 0.9064],
        [0.0158, 0.2760, 0.3095],
        [0.1251, 0.3651, 0.4132],
        [0.3512, 0.9256, 0.9110],
        [0.1770, 0.0112, 0.9681]])
           

基本计算方法

定义张量

a = torch.zeros([5, 3])
b = torch.ones([5, 3])
           

加法

c = a + b
d = torch.add(a, b)
print(c)
print(d)
           
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])
           

减法

e = a - b
f = torch.sub(a, b)
print(e)
print(f)
           
tensor([[-1., -1., -1.],
        [-1., -1., -1.],
        [-1., -1., -1.],
        [-1., -1., -1.],
        [-1., -1., -1.]])
tensor([[-1., -1., -1.],
        [-1., -1., -1.],
        [-1., -1., -1.],
        [-1., -1., -1.],
        [-1., -1., -1.]])
           

索引

print(a[:, 1])
print(b[:, 1])
           
tensor([0., 0., 0., 0., 0.])
tensor([1., 1., 1., 1., 1.])
           

操作维度

x = torch.randn(4,4)
y = x.view(16)
z = x.view(-1,8)
print(x.size())
print(y.size())
print(z.size())
           
torch.Size([4, 4])
torch.Size([16])
torch.Size([2, 8])
           

与numpy协同操作

import numpy as np

x = torch.ones(5)
y = x.numpy()
print(y)
           
[1. 1. 1. 1. 1.]
           
x = np.ones(5)
y = torch.from_numpy(x)
print(x)
           
[1. 1. 1. 1. 1.]
           

半年后期望做成的小项目:外卖比价平台

背景

  1. 社畜与高校学生党,不管是在家还是在校还是在工作,上班的劳累与食堂菜色的单一,都导致对外卖的需求不减反增。
  2. 普通人没有时间各个平台比价,从而专注一个平台,容易被外卖平台使用算法杀熟。(比如是否是会员、是否短期内下过单、顾客的手机型号等)

场景描述

  • 订外卖的话,我更倾向于做成app,会更方便大多数人群随时随地使用。
  • 该app中包含各大外卖平台(美团、饿了么、到家美食会等)的商品。
  • 展示方式
    • 若某家店铺只使用一家外卖平台,那么app将直接展示。
    • 若某家店铺不止使用一家外卖平台,则展示同一商品的各个平台价格对比。

功能描述

  • 下单
    • 用户选择下单地址。
    • 用户搜索需要下单的商品。
    • 搜索的结果页面将展示包含该商品的所有店铺(由近及远 and 根据客户下单次数等 形成相应的排序算法)。
    • 点进某一店铺后,选择需要的商品,可以看到不同平台的商品价格、优惠情况、即时的配送费、打包费等。
    • 也可查询某一商品的30天/60天的历史价格变化曲线。
    • 用户选好之后,点击下单按钮,后台即可在相应的外卖平台下单,用户付款。
  • 收藏
    • 针对用户喜爱的商品 or 被他人种草且还未拔草的商品,可纳入收藏夹。
    • 当这些商品通过一些可取的优惠从而达到历史最低价格时,提醒用户下单。
  • 爆料
    • 当用户有时自己使用外卖平台通过领取比较特殊的优惠券,but 此时app的比价算法无法覆盖到时。
    • 用户可以选择爆料,把怎么领取优惠券的方式通过文字/截图,清晰地表述出来。
    • app客服人员审核通过后,可奖励爆料者适当奖励金,奖励金可以在外卖付款时直接抵用。