jupyter的基本使用
启动
在终端中录入:jupyter notebook的指令,按下回车
cell有两种模式
code:编写代码 markdown:编写笔记
快捷键:
- 添加cell:a或者b
- 删除:x
- 执行cell:command+enter
- tab:自动补全
- 代开帮助文档:shift+tab
numpy模块
NumPy 包的核心是ndarray对象。它封装了n维同质数据类型数组
NumPy 数组和标准 Python 序列之间存在几个重要的区别:
- 与可以动态增长的 Python 列表不同,NumPy 数组在创建时大小是固定的。更改数组大小
ndarray会创建一个新数组并删除原数组。 - NumPy 数组中的所有元素必须是相同的数据类型,因此它们在内存中占用的空间大小也相同。例外情况是:数组可以包含对象(Python,包括 NumPy 对象),从而允许数组元素的大小不同。
- NumPy 数组便于对大量数据进行高级数学运算和其他类型的运算。通常情况下,与使用 Python 内置序列相比,这类运算的执行效率更高,代码量也更少。
- 越来越多的基于 Python 的科学和数学软件包开始使用 NumPy 数组;虽然这些软件包通常支持 Python 序列输入,但它们会在处理之前将此类输入转换为 NumPy 数组,并且通常输出 NumPy 数组。换句话说,为了高效地使用当今大部分(甚至可能是绝大多数)基于 Python 的科学/数学软件,仅仅了解如何使用 Python 的内置序列类型是不够的——还需要了解如何使用 NumPy 数组。
numpy的创建
使用np.array()创建
pythonimport numpy as np arr = np.array([[1,2,3],[4,5,6]]) arrTIP
数组是特殊的列表,数组中存储的数据类型必须是统一的类型,Python基础中没有数组的概念,只有list
使用plt创建
pythonimport matplotlib.pyplot as plt img_arr = plt.imread('./1.jpg')#返回的数组,数组中装载的就是图片内容 plt.imshow(img_arr)#将numpy数组进行可视化展示使用np函数创建
linespace()
一维的等差数列 ,个数固定
arange()
一维的等差数列,差值固定
random.randint()
随机数组
numpy常用的属性
arr.shape #返回的是数组的形状 (5,6)5行6列
arr.ndim #返回的是数组的维度 返回2表示二维数组
arr.size #返回数组元素的个数
arr.dtype #返回的是数组元素的类型 通过设置该属性可以改变数组内元素的数据类型,减少内存占用
type(arr) #数组的数据类型 numpy.ndarray索引和切片
和列表的索引一致
arr=np.random.randint(1,100,size=(4,5))
arr[1] # 单行数据
arr[[1,2,3]] # 多行数据
arr[0:2]# 切出arr前2行数据
arr[:,0:2]# 切出arr前2列
arr[::-1]# 将数组的行倒置
arr[:,::-1]#将数组的列倒置
arr[::-1,::-1]# 将数组所有元素都倒置变形reshape
arr.reshape((20))#二维变为一维数组
arr.reshape((2,2,5))#二维变为三维数组级联
将多个numpy数组进行横向或则纵向的拼接
TIP
必须是同一维度进行级联
np.concatenate((arr,arr),axis=1)# axis=0表示行拼接,axis=1表示列的拼接常用的聚合操作
默认计算所有元素,如何设置了axis,则计算对应的行或列的值
TIP
axis 0表示每一列,1表示每一行
- sum
- max
- min
- mean
常用的数学函数
- sin
- cos
- tan
- around 四舍五入
常用的统计函数
median
中位数
std
标准差 表示一组数据平均值离散程度的度量
公式: std=sqrt(mean((x-x.mean())**2))
var
方差
公式: var=mean((x-x.mean())**2)
矩阵相关
创建矩阵
np.eye(6) # 返回一个标准的单位矩阵,行列相同,对角线都是1,其余是0转置矩阵
行和列互换
np.eye(6).T相乘
import numpy as np
a=np.array([
[2,1],
[4,3]
])
b=np.array([
[1,2],
[1,0]
])
c=np.dot(a,b)
# 结果是
array([[3, 4],
[7, 8]])
[
[第一行*第一列,第一行*第二列]
[第二行*第一列,第二行*第二列]
]numpy.dot(a, b, out=None)
- a : ndarray 数组
- b : ndarray 数组
TIP
矩阵的本质就是线性方程式,两者是一一对应关系。
pandas
numpy能够帮助我们处理的是数值型的数据,当然在数据分析中除了数值型的数据还有好多其他类型的数据(字符串,时间序列),那么pandas就可以帮我们很好的处理除了数值型的其他数据!
Series
Series是一种类似与一维数组的对象,由下面两个部分组成:
- values:一组数据(ndarray类型)
- index:相关的数据索引标签
Series的创建
from pandas import Series
# data是列表 index用来指定显示索引,不设置默认是数字序号
s = Series(data=[1,2,3,'four'],index=['a','b','c','d'])
# data是numpy数组
s = Series(data=np.random.randint(0,100,size=(3,)))
# data是字典
dic = {
'语文':100,
'数学':99,
'理综':250
}
s = Series(data=dic)Series的索引和切片
s[0]
s.语文
s[0:2]Series的常用属性
s.shape
s.size
s.index #返回索引
s.values #返回值
s.dtype #元素的类型Series的常用方法
head(3)
默认5个
tail(3)
unique()
去重
isnull()
用于判断每一个元素是否为空,为空返回True,否则返回False
notnull()
TIP
Series的算术运算
法则:索引一致的元素进行算数运算否则补空
DataFrame
DataFrame是一个【表格型】的数据结构。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。
- 行索引:index
- 列索引:columns
- 值:values
DataFrame的创建
from pandas import DataFrame
# data是列表
df = DataFrame(data=[[1,2,3],[4,5,6]])
# data是numpy数组
df = DataFrame(data=np.random.randint(0,100,size=(6,4)))
# data是字典 字典的key作为列索引
dic = {
'name':['zhangsan','lisi','wanglaowu'],
'salary':[1000,2000,3000]
}
df = DataFrame(data=dic,index=['a','b','c'])DataFrame的属性
df.values
df.columns
df.index
df.shapeDataFrame索引操作
from pandas import DataFrame
df = DataFrame(data=np.random.randint(60,100,size=(8,4)),columns=['a','b','c','d'])
df['a'] # 取单列,如果df有显示的索引,通过索引机制去行或者列的时候只可以使用显示索引
df[['a','c']] # 取多列
df.loc[0] # 通过显示索引取行
df.loc[[0,1,2]] # 通过显示索引取多行
df.iloc[[0,3,5]] # 通过隐式索引取多行
df.loc[0,'a'] # 通过显示索引取第一行第一列
df.iloc[0,0] # 通过隐式索引取第一行第一列TIP
尽量用显示索引取,可读性好
DataFrame的切片操作
TIP
索引操作中括号里的是列索引,切片操作中括号里的是行索引
df索引和切片操作
- 索引:
- df[col]:取列
- df.loc[index]:取行
- df.iloc[index,col]:取元素
- 切片:
- df[index1:index3]:切行
- df.iloc[:,col1:col3]:切列
# 切行
df[0:2]
#切列
df.iloc[:,0:2]DataFrame的运算
- 同Series
时间数据类型的转换
import pandas as pd
dic = {
'time':['2010-10-10','2011-11-20','2020-01-10'],
'temp':[33,31,30]
}
df = DataFrame(data=dic)
#将time列的数据类型转换成时间序列类型
df['time'] = pd.to_datetime(df['time'])
df
#将time列作为源数据的行索引
df.set_index('time',inplace=True)其他方法
TIP
在分析的过程中如果产生了boolean值则下一步马上将布尔值作为源数据的行索引
df.loc[(df['open'] - df['close']) / df['open'] > 0.03] #获取了True对应的行数据(满足需求的行数据)
df.loc[(df['open'] - df['close']) / df['open'] > 0.03].index #df的行数据原理是如果布尔值作为df的行索引,则可以取出true对应的行数据,忽略false对应的行数据
drop 删除
info 查看数据类型
shift 正数向下移动,负数向上移动
python#将布尔值作为源数据的行索引取出True对应的行数据 df.loc[(df['open'] - df['close'].shift(1))/df['close'].shift(1) < -0.02] df.loc[(df['open'] - df['close'].shift(1))/df['close'].shift(1) < -0.02].indexresample 数据的重新取样
python#买股票:找每个月的第一个交易日对应的行数据(捕获到开盘价)==》每月的第一行数据 #根据月份从原始数据中提取指定的数据 #每月第一个交易日对应的行数据 df_monthly = new_df.resample('M').first()#数据的重新取样 df_monthly #买入股票花费的总金额 cost = df_monthly['open'].sum()*100 cost #卖出股票到手的钱 #特殊情况:2020年买入的股票卖不出去 new_df.resample('A').last() #将2020年最后一行切出去 df_yearly = new_df.resample('A').last()[:-1] df_yearly #卖出股票到手的钱 resv = df_yearly['open'].sum()*1200 resv #最后手中剩余的股票需要估量其价值计算到总收益中 #使用昨天的收盘价作为剩余股票的单价 last_monry = 200*new_df['close'][-1]rolling
rolling方法是处理时间序列或顺序数据时进行滑动窗口计算的核心工具。它通过定义固定长度或时间窗口,对窗口内的数据执行统计计算(如均值、标准差等),广泛应用于数据平滑、趋势分析和特征工程。
pythonma5 = df['close'].rolling(5).mean() ma30 = df['close'].rolling(30).mean()& 操作符
pythons1 = ma5 < ma30 s2 = ma5 > ma30 death_ex = s1 & s2.shift(1) #判定死叉的条件 ma5<ma30 并且 前一个 ma5>ma30 df.loc[death_ex] #死叉对应的行数据 death_date = df.loc[death_ex].indexsort_index
排序
agg
# 数据的重新取样,按每周五取数据
# 按列指定不同函数
# agg 是对分组/重采样后的每个时间段按列应用不同聚合函数。这里是把日 K 线按周五分组,然后对每一列用不同规则汇总成周 K。具体:开盘取该周第一天、最高取该周最高、最低取该周最低、收盘取该周最后一天、成交量求和。
weekly = df.resample('W-FRI').agg({
'open': 'first',
'high': 'max',
'low': 'min',
'close': 'last',
'volume': 'sum'
}).dropna()处理丢失数据
有两种丢失数据:
- None
- np.nan(NaN)
TIP
为什么在数据分析中需要用到的是浮点类型的空而不是对象类型?
- 数据分析中会常常使用某些形式的运算来处理原始数据,如果原数数据中的空值为NAN的形式,则不会干扰或者中断运算。
- NAN可以参与运算的
- None是不可以参与运算