数据科学包:numpy&pandas
1.有什么用
- 快,pandas是numpy的升级版本,因为是用c语言写的。
2.numpy
- numpy的使用:
import numpy as np
array = np.array([[1,2,3],[4,5,6]])
print(array)
print("number of dim",array.ndim) # 几维数组
print("shape",array.shape) # 几行几列
print("size",array.size) # 总共多少个元素
- numpy创建array:
import numpy as np
a = np.array([2,3,45],dtype = np.int) # 创建列表,可以定义它的type
print(a.dtype)
b = np.ones((3,4)) # zeros也可以,empty也可,shape的几行几列需要再用括号括住
print(b)
c = np.arange(12).reshape((3,4)) # 和python中的range差不多
print(c)
d = np.linspace(1,10,6).reshape((2,3)) # 生成了一个6段的数列
print(d)
- numpy基础运算
列表:
import numpy as np
a = np.array([10,20,30,40])
b = np.array([1,2,3,4])
print(a,b)
c = a-b # 简单的加法减乘除法
print(c)
c = b ** 2 # 双※号代表次方
print(c)
c = 10*np.sin(a) # 简单的三角函数的运算
print(c)
print(c < 0) # 显示出一个对应的列表
矩阵:
import numpy as np
a = np.array([[1,0],[0,1]])
b = np.arange(4).reshape((2,2))
c = a*b # 简单的逐个相乘
c_dot = np.dot(a,b) # 这个是矩阵的乘法
c_dot_2 = a.dot(b) # 这个是矩阵的乘法
print(c)
print(c_dot)
d = np.random.random((2,4)) # 一切随机,从0到1之间的数字
print(d)
print(np.sum(d,axis = 0)) # 0是列;1是行
print(np.min(d)) #求最小值
print(np.max(d)) #求最大值
矩阵:
import numpy as np
A = np.arange(14,2,-1).reshape((3,4))
print(A)
print(np.argmin(A)) # 计算最小值的索引
print(np.argmax(A)) # 计算最大值的索引
print(np.mean(A)) # 计算出平均值
print(A.mean())
print(np.median(A)) # 计算中位数
print(np.cumsum(A)) # 逐步累加起来,返回的是一个列表
print(np.diff(A)) # 累差,返回的是矩阵
print(np.nonzero(A)) # 返回的是两个数列,然后一一对应,前一个行后一个列
print(np.sort(A)) # 逐行逐行的排序
print(np.transpose(A)) # 等于print(A.T)
print((A.T).dot(A)) # 转置后相乘
print(np.clip(A,5,9)) # 大于9变成9,小于5变成5
print(np.mean(A,axis = 0)) # 0对于列,1对应于行
- numpy的索引:
import numpy as np
A = np.arange(3,15).reshape((3,4))
print(A[2]) # 索引
print(A[2][1]) # 索引
print(A[2,1]) # 索引
print("-----------------")
print(A[2,:]) # 用冒号代替所有的数
print(A[2,:].shape)
print("-----------------")
print(A[1,1:3]) # 第一行的从1到3的值,包头不包尾
print("-----------------")
for column in A.T: #for循环(默认迭代行)
print(column)
print("-----------------")
for row in A: # for循环(默认迭代行)
print(row)
print("-----------------")
print(A.flatten()) #这个转换成了列表
for row in A.flat: # 迭代器,迭代每一项
print(row,end = " ")
- array的合并
import numpy as np
A = np.array([1,1,1])
B = np.array([2,2,2])
print(np.vstack((A,B)))
C = np.vstack((A,B)) # 上下合并 vertical stack
D = np.hstack((A,B)) # 左右合并 horizontal stack
print(D) # 因为是两个序列合并的就还是序列
print(C.shape)
print("-----------------")
# 不能用T把一个横向的数列变成一个纵向的
print(A.T)
print(A)
print("-----------------")
print(A) # 那可怎么办,如何把一个横向的变成纵向的呢
print(A.shape)
print(A[np.newaxis,:]) # 在行上面加了一个维度
print(A[np.newaxis,:].shape)
print(A[:,np.newaxis])
print(A[:,np.newaxis].shape)
print("-----------------")
A = A[:,np.newaxis]
B = B[:,np.newaxis]
D = np.hstack((A,B))
print(D)
print("-----------------")
C = np.concatenate((A,B,B,A),axis = 0) # 多个array的合并
print(C)
C = np.concatenate((A,B,B,A),axis = 1) # 横向合并1,纵向合并是0
print(C)
A = np.array([1,1,1])[:,np.newaxis] :这个是三行一列
B = np.array([2,2,2])[np.newaxis,:] :这个是一行三列
- array的分割
import numpy as np
A = np.arange(12).reshape((3,4))
print(A)
print(np.split(A,2,axis = 1)) # 分割成两块,1代表纵向的分割,0代表横向分割
print(np.array_split(A,3,axis = 1)) # 不等的分割
print("----------------------------")
print(np.vsplit(A,3)) #按行分割
print(np.hsplit(A,2)) #按列分割
7.copy,deep copy
import numpy as np
b = a = c = d = np.arange(4)
a[0] = 11
print(a)
# 注意他们四个一起变了
# 不想让他们一起变就
# 这个是个deep copy
b = a.copy()
a[1:3] = [55,66]
print(a)
print(c)
print(b)
3.pandas学习
- Pandas 适用于处理以下类型的数据:
- 与 SQL 或 Excel 表类似的,含异构列的表格数据;
- 有序和无序(非固定频率)的时间序列数据;
- 带行列标签的矩阵数据,包括同构或异构型数据;
- 任意其它形式的观测、统计数据集, 数据转入 Pandas 数据结构时不必事先标记。
- ipython notebook的优点: 1.web上的ipython 2.显示内联图片 3.导出数据和分析过程
- Pandas 和 NumPy 的本质区别:NumPy 数组只有一种数据类型,DataFrame 每列的数据类型各不相同。
- 快速入门:
- 生成对象:见下方代码块1
- 查看数据:df.head() df.tail(3)
显示索引与列表名:df.index df.columns df.describe()
转置数据:df.T
按轴排序:df.sort_index(axis=1, ascending=False)
按值排序:df.sort_values(by=‘B’) - 选择:.at、.iat、.loc 和 .iloc
- 获取数据:选择单列,产生 Series,与 df.A 等效:df[‘A’]
用 [ ] 切片行: df[0:3] df[‘20130102’:‘20130104’] - 按标签选择:
一行 df.loc[dates[0]]
多列:df.loc[:, [‘A’, ‘B’]]
行和列:df.loc[‘20130102’:‘20130104’, [‘A’, ‘B’]]
提取标量值:df.loc[dates[0], ‘A’]
快速访问(同上): df.at[dates[0], ‘A’] - 按位置选择:就是用整数操作
df.iloc[3]
df.iloc[3:5, 0:2]
df.iloc[[1, 2, 4], [0, 2]] - 布尔索引:
df[df.A > 0]
df[df > 0]
df2[df2[‘E’].isin([‘two’, ‘four’])]
- 获取数据:选择单列,产生 Series,与 df.A 等效:df[‘A’]
- 缺失值:
df1.dropna(how=‘any’)
df1.fillna(value=5)
pd.isna(df1) - 统计:
df.mean()在列上执行
df.mean(1)在行上执行 - Apply函数:
df.apply(np.cumsum)
df.apply(lambda x: x.max() - x.min()) - 统计出现次数:
s.value_counts()
s = pd.Series([1, 3, 5, np.nan, 6, 8])
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
df2 = pd.DataFrame({'A': 1.,
...: 'B': pd.Timestamp('20130102'),
...: 'C': pd.Series(1, index=list(range(4)), dtype='float32'),
...: 'D': np.array([3] * 4, dtype='int32'),
...: 'E': pd.Categorical(["test", "train", "test", "train"]),
...: 'F': 'foo'})
- 快速入门2:
- 合并(Merge):
pieces = [df[:3], df[3:7], df[7:]]
用于连接pandas对象:pd.concat(pieces)
SQL风格的合并:pd.merge(left, right, on=‘key’) - 追加(Append):
df.append(s, ignore_index=True) - 分组(Grouping):
df.groupby(‘A’).sum()
df.groupby([‘A’, ‘B’]).sum() - 重塑(Reshaping):
stacked = df2.stack()
stacked.unstack()
- 合并(Merge):
- 快速入门3:
- 数据透视表:
pd.pivot_table(df, values=‘D’, index=[‘A’, ‘B’], columns=[‘C’]) - 可视化:
ts.plot() - 数据输入\输出:
df.to_csv(‘foo.csv’)
pd.read_csv(‘foo.csv’)
df.to_excel(‘foo.xlsx’, sheet_name=‘Sheet1’)
pd.read_excel(‘foo.xlsx’, ‘Sheet1’, index_col=None, na_values=[‘NA’])
- 数据透视表:
- 核心数据结构:
- Series 是一维的带标签的数组,数组里可以放任意数据:
s = pd.Series(data, index=index)
index是一个列表,用来作为数据的标签。data可以是:字典、ndarray对象、标量值
类ndarray对象、类dict对象、标签对齐(s1+s2) - DataFrame:二维带行标签和列标签的数组。
df = pd.DataFrame(data, index=index, columns=columns)
data可以是字典、列表构成(相同长度)、Series创建 - panel:三维数据判断(不常用)
- Series 是一维的带标签的数组,数组里可以放任意数据:
- 电影分析代码中遇到的不同:
- hot_movies_rating.sort_values(by=‘rating’,ascending=False).head(10)
- mean_ratings.loc[top_20_score.index]
- 索引:
- index和column都有.name属性
- 重复索引:重复的返回一个series,不重复的返回一个值。.is_unique判断是否是重复索引。
数据清洗:s.groupby(s.index).sum() .mean() .first() - 多级索引:
a = [[‘a’,‘a’,‘b’,‘c’],[1,2,2,3]]
t = list(zip(*a))
结果:[(‘a’,1),(‘a’,2),(‘b’,2),(‘c’,3)]
index = pd.MultiIndex.from.tuples(t,names = [‘level1’,‘level2’])
- 分组计算:
拆分---->应用---->合并
分组:1.列表 2.字典 3.函数 4.多级索引
按列分组加上(axis = 1) - 聚合运算:
拆分---->应用---->合并
mean min max describe count :内置的
自定义的:grouped.agg(函数名)
多个:grouped.agg(【‘mean’,‘min’,‘max’,(‘range’,函数名)】)
d = {‘data1’:‘mean’,‘data2’:‘sum’}
高级操作:
1.分组运算会改变其原始形状。
k1_mean = df.groupby(‘key1’).transform(np.mean).add_prefix(‘mean_’)
df[k1_mean_columns] = k1_mean
data.groupby(group_key).apply(lambda g: g.fillna(g.mean())) - 数据导入导出:
1.构造索引indexs和columns
2.数据转换、类型转换
3.日期解析
4.迭代:文件一次读一部分(面对大数据量)
pd.read_csv(,header = None,name = [,],index_col = [])
pd.read_table(’’,sep = ‘’)
pd.read_table(’’,sep = ‘正则表达式’,na_values = [’’:[’’,’’,’’],)
方块读取:chunksize = 1000
数据保存:df.to_csv(’’,index = False,header = None,sep = ‘’)
二进制的数据;pickle 还有其他格式的数据 - 时间日期:
python中的datetime模块:from datetime import datetime; from datetime import timedelta
时间序列:时期及算术运算
重采样resample(‘W-FRI’,how = ‘sum’):1.to_period()和to_timestamp() - 数据可视化:%matplotlib inline
df.plot(title =’’,style = ‘’,figsize(,),subplots = True,shary = True)
df.ploy.bar(stacked = True)
df.ploy.barh(stacked = True)
df[‘a’].plot.hist(bins = 20)
df[‘a’].plot.kde(bins = 20) 概率密度函数
df.plot.scatter(x = ‘a’,y = ‘b’)
df.plot.pie()
# 股票分析
data = pd.read_csv('',index_col = "Data",parse_dates = True)
# 时间事件日志
def _parse_date(dsstr):
return pd.Timestamp(dsstr).date()
data = pd.read_csv('',header = 3,index_col = '',parse_dates = True,date _parser = _parse_date)
- 小结
ipython—>快速入门(实际上很慢)—>MovieLen电影分析—>核心数据结构、索引、分组与聚合、IO操作、时间序列、数据可视化—>