1.1.1 投资-编程基础-numpy

跳转到根目录:知行合一:投资篇

已完成:
1、投资&技术
  1.1.1 投资-编程基础-numpy
  1.1.2 投资-编程基础-pandas
  1.2 金融数据处理
  1.3 金融数据可视化
2、投资方法论
  2.1.1 预期年化收益率
  2.1.2 一个关于y=ax+b的故事
  2.1.3-数据标准化
  2.1.4-相关性分析
  2.2.1.1-一个关于定投的故(姿)事(势)
  2.2.1.3-移动平均线

3、投资实证

1. 创建

1.1. 通过列表

通过列表创建numpy数组很简单,不过实际应用中很少这么操作。

# 通过列表创建数组
import numpy as np
a_list = [2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023]
arr = np.array(a_list)
arr

array([2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023])

1.2. np.arange起止、步长

知道开始、截止、步长,来创建数组。

注意:前闭后开[)。输出的最后一个 <= 截止。

# 通过np.arange创建数组
import numpy as np
arr = np.arange(2014, 2024, 1)  # 前闭后开:从2014到2024,递增1
print('长度:', len(arr))
print(arr)

arr = np.arange(2014, 2024, 2)  # 前闭后开:从2014到2024,递增1
print('长度:', len(arr))
print(arr)


长度: 10
[2014 2015 2016 2017 2018 2019 2020 2021 2022 2023]
长度: 5
[2014 2016 2018 2020 2022]

1.3. np.linspace固定个数

知道开始、截止,创建固定输出个数的数组。

注意:1. 前闭后开;2. 输出结果是小数(可以通过参数dtype=int来指定输出的结果)

场景:比如说知道一只股票的最低和最高价,在此间均分10等份,统计各区间命中个数后形成直方图。

import numpy as np
arr = np.linspace(2014, 2023, 10)
print(arr)

arr = np.linspace(2014, 2024, 10)
print(arr)

arr = np.linspace(2014, 2024, 10, dtype=int)
print(arr)


[2014. 2015. 2016. 2017. 2018. 2019. 2020. 2021. 2022. 2023.]
[2014.         2015.11111111 2016.22222222 2017.33333333 2018.44444444	2019.55555556 2020.66666667 2021.77777778 2022.88888889 2024.        ]
[2014 2015 2016 2017 2018 2019 2020 2021 2022 2024]

2. 访问

2.1. 取出第x个

0和-1,是第一个和最后一个

import numpy as np
arr = np.arange(2014, 2024, 1)  # 前闭后开:从2014到2024,递增1
print(arr[0])
print(arr[-1])

2014
2023

2.2. 间隔着取数

有时候,不一定是间隔1个,也可能是间隔x个。

然后看到两个冒号连一起,第一感觉是懵的…

import numpy as np
arr = np.arange(2014, 2024, 1)  # 前闭后开:从2014到2024,递增1
print(arr)
print(arr[0:5:2])  # 从第0到第5,每隔2个取1个
print(arr[::2])    # 2个冒号,也就这么回事儿

[2014 2015 2016 2017 2018 2019 2020 2021 2022 2023]
[2014 2016 2018]
[2014 2016 2018 2020 2022]

2.3. 迭代nditer flat

迭个代,也是要了命。

import numpy as np
arr = np.arange(2014, 2024, 1)  # 前闭后开:从2014到2024,递增1
print('arr=', arr)

for i in arr:
    print(arr)  # surprise! 其实想想也合理,人家numpy也没说是一维数组啊,况且人家强项应该就是多维数组的处理,嗯,就是这样...吧
    

# 真的是要了命了,就是想简单遍历一下一维的数组,还得查资料,没有简(偷)便(懒)办法
# 迭代大法1:  np.nditer(arr)
for item in np.nditer(arr):
    print(item)

# 迭代大法2: arr.flat 与 arr.flatten() 效果一样
for item in arr.flat:  
    print(item)
    
for item in arr.flatten():
    print(item)

2.4. 花式索引

一般常用的就是1维数组,2维和更高维的。

不过!好消息是!可能用不到!

import numpy as np
arr = np.arange(2014, 2024, 1)  # 前闭后开:从2014到2024,递增1
print('arr=', arr)

print(arr[[0, -1, 2]]) # 要用2个方括号,因为第一层的方括号,其实是去找对应的维度
# 实际做投资分析,遇到的还真不多,真的需要,就把代码写的细致一点,也更好理解,不做防御性编程。

# 用一个2维数组看看
arr = np.arange(32).reshape(8,4)
print(arr)
# 如果用1个方括号,取出来的是什么呢?
print('1个方括号arr[0]= ', arr[0])  # 如果是多维的,最好就不这么写,自己也难理解。写成"行,列"这种格式,逗号前是对行的限制,逗号后是对列的限制,不要炫技,没意思。
print('2个方括号arr[[0]]= ', arr[[0]])  # 和 arr[[0],] 等价,就好理解了,逗号左边代表怎么取行,右边代表怎么取列。那就是第0行,对列没限制,取所有列
print('2个方括号arr[[0],]= ', arr[[0],])
print('2个方括号arr[:[0]]= ', arr[:,[0]])  # 逗号前的冒号,代表取所有行;逗号之后的[0],代表只需要这些行里面的第0列


arr= [2014 2015 2016 2017 2018 2019 2020 2021 2022 2023]
[2014 2023 2016]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]]
1个方括号arr[0]=  [0 1 2 3]
2个方括号arr[[0]]=  [[0 1 2 3]]
2个方括号arr[[0],]=  [[0 1 2 3]]
2个方括号arr[:[0]]=  [[ 0]
 [ 4]
 [ 8]
 [12]
 [16]
 [20]
 [24]
 [28]]

2.5. 布尔型索引

起到过滤的作用,比如取出特定条件的数据。这种操作在一般的编程语言里少见。

import numpy as np
arr = np.arange(2014, 2024, 1)  # 前闭后开:从2014到2024,递增1
print('arr=', arr)

print('布尔型索引,过滤2018年之后的数据:', arr[arr > 2018])

arr= [2014 2015 2016 2017 2018 2019 2020 2021 2022 2023]
布尔型索引,过滤2018年之后的数据: [2019 2020 2021 2022 2023]

3. 变更

3.1. 切片

如果是一维数组,print(arr[[0,-1]])表示:取第0和-1位置的值。

如果是二维数组,arr[x:y , m:n]表示:取第x到y行,再从中取m到n列。

一维数组案例:

import numpy as np
arr = np.arange(2014, 2024, 1)  # 前闭后开:从2014到2024,递增1
print('arr=', arr)

print(int(len(arr)/2))
print(arr[int(len(arr)/2): -1])  # arr[5:-1]

arr= [2014 2015 2016 2017 2018 2019 2020 2021 2022 2023]
5
[2019 2020 2021 2022]

二维数组案例:

import numpy as np

# 用一个2维数组看看
arr = np.arange(32).reshape(8,4)
print(arr)
# 如果用1个方括号,取出来的是什么呢?
print('1个方括号arr[0]= ', arr[0])  # 如果是多维的,最好就不这么写,自己也难理解。写成"行,列"这种格式,逗号前是对行的限制,逗号后是对列的限制,不要炫技,没意思。
print('2个方括号arr[[0]]= ', arr[[0]])  # 和 arr[[0],] 等价,就好理解了,逗号左边代表怎么取行,右边代表怎么取列。那就是第0行,对列没限制,取所有列
print('2个方括号arr[[0],]= ', arr[[0],])
print('2个方括号arr[:[0]]= ', arr[:,[0]])  # 逗号前的冒号,代表取所有行;逗号之后的[0],代表只需要这些行里面的第0列

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]]
1个方括号arr[0]=  [0 1 2 3]
2个方括号arr[[0]]=  [[0 1 2 3]]
2个方括号arr[[0],]=  [[0 1 2 3]]
2个方括号arr[:[0]]=  [[ 0]
 [ 4]
 [ 8]
 [12]
 [16]
 [20]
 [24]
 [28]]

3.2. 拼接concatenate

这个可能用在比如拉取数据,将2个区间数据合并的场景。

import numpy as np
arr = np.arange(2014, 2024, 1)  # 前闭后开:从2014到2024,递增1
print('arr = ', arr)

future = [2024, 2025, 2026]
arr2 = np.concatenate((arr, future))
print('arr2 = ', arr2)

arr= [2014 2015 2016 2017 2018 2019 2020 2021 2022 2023]
arr2 =  [2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026]

3.3. 平均分split

注意:如果不能平均分,会报错 array split does not result in an equal division

import numpy as np
arr = np.arange(2014, 2024, 1)  # 前闭后开:从2014到2024,递增1
print('arr = ', arr)

# arr2 = np.split(arr, 3) 
# arr2  # array split does not result in an equal division

arr3 = np.split(arr[0:len(arr)-1], 3) 
print('arr3 = ', arr3)

arr =  [2014 2015 2016 2017 2018 2019 2020 2021 2022 2023]
arr3 =  [array([2014, 2015, 2016]), array([2017, 2018, 2019]), array([2020, 2021, 2022])]

3.4. 去重np.unique

import numpy as np
arr = np.array([2014, 2015, 2016, 2017, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023])
print('arr = ', arr)

u_data, u_index = np.unique(arr, return_index=True) # 这个返回的是去重后的数组,以及这个数组中元素在原来数组的下标
print('去重后的数据:', u_data)
print('取这些index:', u_index)  # 当第i个元素在之前出现过,那么就认为它应该去掉,继续向后逐个排查

arr =  [2014 2015 2016 2017 2015 2016 2017 2018 2019 2020 2021 2022 2023]
去重后的数据: [2014 2015 2016 2017 2018 2019 2020 2021 2022 2023]
取这些index: [ 0  1  2  3  7  8  9 10 11 12]

3.5. 排序

排序主要注意看本身排序,还是说排序返回新ordered数组。

import numpy as np
arr = np.array([2014, 2017, 2016, 2015, 2016, 2021, 2018, 2019, 2020, 2017, 2022, 2023, 2015])
print('arr = ', arr)

arr2 = arr.sort()
print('是直接在arr上排序的', arr)
print('arr2是None:', arr2)

arr =  [2014 2017 2016 2015 2016 2021 2018 2019 2020 2017 2022 2023 2015]
是直接在arr上排序的 [2014 2015 2015 2016 2016 2017 2017 2018 2019 2020 2021 2022 2023]
arr2是None None

如果使用的是np.sort(arr),那就不是在arr上直接排序,arr并不会被改变

import numpy as np
arr = np.array([2014, 2017, 2016, 2015, 2016, 2021, 2018, 2019, 2020, 2017, 2022, 2023, 2015])
print('arr = ', arr)

arr3 = np.sort(arr)
print('arr3=', arr3)
print('arr=', arr)

arr =  [2014 2017 2016 2015 2016 2021 2018 2019 2020 2017 2022 2023 2015]
arr3= [2014 2015 2015 2016 2016 2017 2017 2018 2019 2020 2021 2022 2023]
arr= [2014 2017 2016 2015 2016 2021 2018 2019 2020 2017 2022 2023 2015]

4. 常用函数

4.1. 字符串函数

目前看用的不多,参考:https://www.runoob.com/numpy/numpy-string-functions.html

4.2. 算数函数

NumPy 算术函数包含简单的加减乘除: add()subtract()multiply()divide()。用的不多。

4.3. 统计函数

4.3.1. percentile

import numpy as np
arr = np.arange(1,100, 1) # [1-99]
d_75 = np.percentile(arr, 75)  # 这个很有意思,结果74.5,并不是原来arr数组里的数字
d_75

74.5

4.3.2. 最大、最小、中值、平均数

np.max、np.min、np.median中位数(中值)

import numpy as np
arr = np.array([2014, 2017, 2016, 2015, 2016, 2021, 2018, 2019, 2020, 2017, 2022, 2023, 2015])
print('最小:', np.min(arr))
print('中值:', np.median(arr))
print('平均数:', np.average(arr))  # average, 不指定权重时相当于 mean 函数。用法np.average([1,2,3,4],weights =  [4,3,2,1], returned =  True)
print('算术平均值mean:', np.mean(arr))

最小: 2014
中值: 2017.0
平均数: 2017.923076923077
算术平均值mean: 2017.923076923077
  • 18
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值