Python之数据分析(星期均值、星期汇总、Numpy的take与where方法、apply_along_axis函数)

2023-05-16

文章目录

      • 一、处理星期数据
      • 二、apply_along_axis函数的用法
      • 三、星期汇总案例

一、处理星期数据

1、datetime对象的weekday()方法
该方法将会用0到6这七个数字表示周一到周日

2、计算周一到周五数据平均值的三种方法

  • 数组[关系表达式]:关系表达式的值是一个布尔型数组,其中为True的元素是数组中满足关系表达式的元素。以上下标运算的值就是从数组拣选与布尔数组中为True的元素相对于的元素。
  • np.where(关系表达式):数组中满足关系表达式的元素的下标数组
  • np.take(数组, 下标数组):数组中由下标数组所表示的元素的集合

3、按星期求均值案例

import numpy as np
import datetime as dt

# 将日期转换成天数
def dmy2week(dmy):
    dmy = str(dmy, encoding='utf-8')
    date = dt.datetime.strptime(dmy, '%d-%m-%Y').date()
    wdays = date.weekday()  # 将日期变成星期的格式
    return wdays

# 解包取出日期、收盘价
wdays, closing_prices = np.loadtxt(
    '0=数据源/beer_price.csv', delimiter=',',
    usecols=(0, 4), unpack=True,
    converters={0: dmy2week}
)

# print(wdays)


# 计算周一到周五的平均值
ave_closing_prices = np.zeros(7)
for wday in range(ave_closing_prices.size):
    # 方法一:用掩码的方法
    # ave_closing_prices[wday] = \
    #     closing_prices[wdays == wday].mean()

    # 方法二:用下标序列直接获取对应元素的均值
    # ave_closing_prices[wday] = \
    #     closing_prices[np.where(wdays == wday)].mean()

    # 方法三:take方法,一参是被提取数组,二参是下标数组
    ave_closing_prices[wday] = \
        np.take(closing_prices, np.where(wdays == wday)).mean()

for wday, ave_closing_price in zip(
        ['Mon','Tue','Wed','Thu','Fri','Sta','Sun'],
        ave_closing_prices):
    print(wday, np.round(ave_closing_price, 2))  # 保留两位小数

11

二、apply_along_axis函数的用法

1、格式
Y = numpy.apply_along_axis(函数, 轴向, 高维数组)

2、作用
再高维数组中沿着指向的轴向,提出低维子数组,作为参数传递给函数中,并将返回值按照同样的轴向组成新的数组返回给调用者。

3、轴向
二维:0是行方向,1是列方向
三维:0是页方向,1是行方向,2是列方向

4、练习

import numpy as np

def Func(x):
    return x ** 2
# X = [10, 11, 12]
X = np.array([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
])
Y1 = np.apply_along_axis(Func, 0, X)
print(Y1)
Y2 = np.apply_along_axis(Func, 1, X)
print(Y2)
# 将X沿着二参所指向的轴向来降维传入一参的函数中进行处理
# 此处的0表示沿着行方向降维,即纵向,则分别传入[1, 2, 3]、[4, 5, 6]、[7, 8, 9]
# 若是1则是沿着列方向降维,即横向,则分别传入[1, 4, 7]、[2, 5, 8]、[3, 6, 9]

三、星期汇总案例

1、目的
对每一个星期的数据进行汇总,将每个星期的星期一开盘价作为开盘价,每个星期的星期五的收盘价作为收盘价,整个星期的所有最高价中的最高价作为最高价,最低价作为最低价。这样就是将一个星期作为一个整体,分别求出各个星期整体的开盘价,最高价,最低价,收盘价了。

2、参考代码

import datetime as dt
import numpy as np

def dmy2wday(dmy):
    dmy = str(dmy, encoding='utf-8')  # 转码dmy日期
    date = dt.datetime.strptime(dmy, '%d-%m-%Y').date()  # 获取时间对象
    wday = date.weekday()  # 转换成星期的格式
    return wday
wdays, opening_prices, highest_prices, lowest_prices, closing_prices = np.loadtxt(
    '0=数据源/beer_price.csv', delimiter=',',
    usecols=(0, 1, 2, 3, 4), unpack=True,
    converters={0: dmy2wday}
)

# 只取前16个数据,索引是0到15,正好是4*4
wdays = wdays[:16]
opening_prices = opening_prices[:16]
highest_prices = highest_prices[:16]
lowest_prices = lowest_prices[:16]
closing_prices = closing_prices[:16]

# print(np.where(wdays == 0))  # 所有为0的下标,即所有星期一的日期
# 获取第一个星期一的下标
first_monday = np.where(wdays == 0)[0][0]
# 获取最后一个星期五的下标
last_sunday = np.where(wdays == 4)[0][-1]
# 取所有的日期:所有的日期都应该在第一个星期一到最后一个星期五之间
indices = np.arange(first_monday, last_sunday + 1)
indices = np.split(indices, 3)  # 分成三份,三个星期
# print(indices)

# 按照每一个星期来处理每个星期的数据
# 汇总每个星期的数据,传入的indices是每周的下标
def week_summary(indices):
    opening_price = opening_prices[indices[0]]  # 第一周第一天的开盘价
    highest_price = np.max(np.take(highest_prices, indices))  # 所有最高价中与idices下标相对应的数据,再取最大值,就是本周的最高价
    lowest_price = np.min(np.take(lowest_prices, indices))  # 本周最低价中的最小值
    closing_price = closing_prices[indices[-1]]  # 最后一个及交易日的收盘价
    return opening_price, highest_price,\
        lowest_price, closing_price

# 让每周的数据做汇总,传入汇总函数与对应的下标,因为是二维数组,1表示列方向即水平方向
summaries = np.apply_along_axis(
    week_summary, 1, indices
)
print(summaries)

3、参考结果
22

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python之数据分析(星期均值、星期汇总、Numpy的take与where方法、apply_along_axis函数) 的相关文章

随机推荐