import numpy as np
np.array([1,2,3,4,5])
np.array([[1,1.2,3],[4,5,‘six‘])
import matplotlib.pyplot as plt
img_arr = plt.imread(‘./cat.jpg‘)
print(plt.imshow(img_arr))
plt.imshow(img_arr - 150) # 变化后的图像
1. np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) # 等差数列
np.linspace(1,100,num=10) # 成等差数列分成10份
2. np.arange([start, ]stop, [step, ]dtype=None)
np.arange(0,100,2) # 每个数字之间间隔为2
3. np.random.randint(low, high=None, size=None, dtype=‘l‘)
# - 随机原理
# - 随机因子:表示的是一个无时无刻都在变化的数值
np.random.seed(10) # 里面值是随机因子,当里面的值固定的化参数的数字不会变了
np.random.randint(0,100,size=(4,5)) # 生成4行5列的二维数组
4. np.random.random(size=None)
# 生成0到1的随机数,左闭右开 np.random.seed(3)
np.random.random(size=(5,3)) # 生成5行3列的数组,元素范围为0到1
ndim:维度
shape:形状(各维度的长度)
size:总长度
dtype:元素类型
img_arr.ndim # 维度
img_arr.shape # 返回的形状
img_arr.size # 总长度
img_arr.dtype
type(img_arr)
arr = np.random.randint(60,120,size=(6,8)) # 随机生成60到120的整数,矩阵的大小为6*8
print(arr)
# 根据索引修改数据
arr[1] # 取第一行的数据
arr[1][2]
arr同上
# 获取二维数组前两行
arr[0:2]
# 获取二维数组前两列
arr[:,0:2] # 应用了逗号的机制,逗号左边为第一个维度行,右边为第二个维度列
# 将数据反转,例如[1,2,3]---->[3,2,1]
# ::进行切片
#将数组的行倒序
arr[::-1]
#列倒序
arr[:,::-1]
#全部倒序
arr[::-1,::-1]
print(arr.shape) # 返回的形状
arr.reshape((24, 2)) # 里面元素的个数应该一致,否则会报错
arr.reshape((-1,4)) # 为4列,行自动补齐
axis=1横向
+++++++++++
+ + +
+++++++++++
axis=0纵向
+++++++
+ +
+++++++
+ +
+++++++
np.concatenate()
# 1.一维,二维,多维数组的级联,实际操作中级联多为二维数组
np.concatenate((arr,arr),axis=1) # axis=0列 axis=1行
# 2.合并两张照片
arr_3 = np.concatenate((img_arr,img_arr,img_arr),axis=1)
arr_9 = np.concatenate((arr_3,arr_3,arr_3),axis=0)
plt.imshow(arr_9)
arr.sum(axis=1) # axis=0每一列的和axis=1求每一行的和
Function Name NaN-safe Version Description
np.sum np.nansum Compute sum of elements
np.prod np.nanprod Compute product of elements
np.mean np.nanmean Compute mean of elements
np.std np.nanstd Compute standard deviation
np.var np.nanvar Compute variance
np.min np.nanmin Find minimum value
np.max np.nanmax Find maximum value
np.argmin np.nanargmin Find index of minimum value
np.argmax np.nanargmax Find index of maximum value
np.median np.nanmedian Compute median of elements
np.percentile np.nanpercentile Compute rank-based statistics of elements
np.any N/A Evaluate whether any elements are true
np.all N/A Evaluate whether all elements are true
np.power 幂运算
np.sort()与ndarray.sort()都可以,但有区别:
- np.sort()不改变输入
- ndarray.sort()本地处理,不占用空间,但改变输入
arr.sort(axis=1)
print(arr)
# 裁剪
plt.imshow(img_arr)
plt.imshow(img_arr[50:400,100:330,:])
import pandas as pd
from pandas import Series,DataFrame
import numpy as np
1. #使用列表创建Series
Series(data=[1,2,3,4,5]) # 只能是一维数组
2. # 使用numpy数组创建
Series(data=np.random.randint(0,100,size=(10,)))
3. 还可以通过设置index参数指定索引
Series(data=[1,2,3],index=[‘a‘,‘b‘,‘c‘]) #显式索引
- 使用index中的元素作为索引值
- 使用s.loc[](推荐):注意,loc中括号中放置的一定是显示索引
注意,此时是闭区间
s = Series([1,2,3,4,5],index=[‘a‘,‘b‘,‘c‘,‘d‘,‘e‘])
print(s)
print(s[1])
print(s[‘a‘])
print(s.a) # 只能是显示索引可以点出来
- 使用整数作为索引值
- 使用.iloc[](推荐):iloc中的中括号中必须放置隐式索引
注意,此时是半开区间
s[1:3]
# s[‘a‘:‘d‘]
可以使用s.head(),tail()分别查看前n个和后n个值
s.head(3)
对Series元素进行去重
s = Series([1,1,2,2,3,4,5,56,6,7,78,8,89])
s.unique()
当索引没有对应的值时,可能出现缺失数据显示NaN(not a number)的情况
使得两个Series进行相加
s1 = Series([1,2,3],index=[‘a‘,‘b‘,‘c‘])
s2 = Series([1,2,3],index=[‘a‘,‘d‘,‘c‘])
s = s1 + s2 # 索引对齐的进行算术算法
print(s)
a 2.0
b NaN
c 6.0
d NaN
dtype: float64
可以使用pd.isnull(),pd.notnull(),或s.isnull(),notnull()函数检测缺失数据
# 取值
s[[1,2]]
s[[‘a‘,‘b‘]]
s[[True,False,True,False]]
a 2.0
b NaN
c 6.0
dtype: float64
s.isnull()
a False
b True
c False
d True
dtype: bool
s.notnull()
a True
b False
c True
d False
dtype: bool
s[s.notnull()]
a 2.0
c 6.0
dtype: float64
Series之间的运算
- 在运算中自动对齐不同索引的数据
- 如果索引不对应,则补NaN
df = DataFrame(data=np.random.randint(0,100,size=(3,4)),index=[‘a‘,‘b‘,‘c‘],columns=[‘A‘,‘B‘,‘C‘,‘D‘])
print(df)
df.values # 值
df.columns # 列索引
df.index # 行索引
df.shape # 形状
# 使用ndarray创建DataFrame:创建一个表格用于展示张三,李四的成绩
dic = {
‘张三‘:[150,150,150,150], # 字典的key作为列
‘李四‘:[0,0,0,0]
}
df = DataFrame(data=dic,index=[‘语文‘,‘数学‘,‘英语‘,‘理综‘]) # columns参数将不可被使用
print(df)
#修改列索引
df[‘张三‘]
#获取前两列
df[[‘李四‘,‘张三‘]]
同样返回一个Series,index为原来的columns。
df.loc[‘语文‘] # 显示索引
df.iloc[0] # 用作行的提取,隐式索引
df.iloc[[0,1]]
df
df[‘张三‘][‘英语‘] # 使用列索引,列在前
df.loc[‘英语‘,‘张三‘] # 使用行索引,有逗号,左边是行,右边是列,行在前
df.loc[[‘数学‘,‘理综‘],‘张三‘]
【注意】
直接用中括号时:
df
df[0:2] # 切行不需要夹loc或iloc,
在loc和iloc中使用切片(切列) : df.loc[‘B‘:‘C‘,‘丙‘:‘丁‘]
df.iloc[:,0:1] # 切列需要夹loc或iloc
- 索引
- df[列索引]:取一列
- df[[col1,col2]]:取出两列
- df.loc[显示的行索引]:取行
- df.loc[行,列]:取元素
- 切片:
- df[index1:index3]:切行
- df.loc[col1:col3]:切列
固定搭配:
判断函数
df.dropna()可以选择过滤的是行还是列(默认为行):axis中0表示行1表示列
df.dropna(axis=0)
pandas使用pd.concat函数,与np.concatenate函数类似,只是多了一些参数:
objs
axis=0
keys
join=‘outer‘ / ‘inner‘:表示的是级联的方式,outer会将所有的项进行级联(忽略匹配和不匹配),而inner只会将匹配的项级联到一起,不匹配的不级联
ignore_index=False
import pandas as pd
from pandas import Series,DataFrame
import numpy as np
df1 = DataFrame(data=np.random.randint(0,100,size=(3,4)),index=[‘a‘,‘b‘,‘c‘])
df2 = DataFrame(data=np.random.randint(0,100,size=(3,3)),index=[‘a‘,‘d‘,‘c‘])
pd.concat((df1,df1),axis=0) # 0是行
不匹配指的是级联的维度的索引不一致。例如纵向级联时列索引不一致,横向级联时行索引不一致
有2种连接方式:
- 外连接:补NaN(默认模式)
- 内连接:只连接匹配的项
pd.concat((df1,df2),axis=0,join=‘inner‘) # join=‘inner‘只连接匹配的项有nan就删除
merge与concat的区别在于,merge需要依据某一共同的列来进行合并
使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并。
注意每一列元素的顺序不要求一致
参数:
df1 = DataFrame({‘employee‘:[‘Bob‘,‘Jake‘,‘Lisa‘],
‘group‘:[‘Accounting‘,‘Engineering‘,‘Engineering‘],
})
df1
df2 = DataFrame({‘employee‘:[‘Lisa‘,‘Bob‘,‘Jake‘],
‘hire_date‘:[2004,2008,2012],
})
df2
pd.merge(df1,df2,on=‘employee‘) # 不写默认是连表相同的
df3 = DataFrame({
‘employee‘:[‘Lisa‘,‘Jake‘],
‘group‘:[‘Accounting‘,‘Engineering‘],
‘hire_date‘:[2004,2016]})
df3
df4 = DataFrame({‘group‘:[‘Accounting‘,‘Engineering‘,‘Engineering‘],
‘supervisor‘:[‘Carly‘,‘Guido‘,‘Steve‘]
})
df4
df1 = DataFrame({‘employee‘:[‘Bob‘,‘Jake‘,‘Lisa‘],
‘group‘:[‘Accounting‘,‘Engineering‘,‘Engineering‘]})
df1
df5 = DataFrame({‘group‘:[‘Engineering‘,‘Engineering‘,‘HR‘],
‘supervisor‘:[‘Carly‘,‘Guido‘,‘Steve‘]
})
df5
pd.merge(df1,df5,how=‘outer‘) # how合并的方式,out保证数据不丢失,能合并的合并不能合并的补充0
df1 = DataFrame({‘employee‘:[‘Jack‘,"Summer","Steve"],
‘group‘:[‘Accounting‘,‘Finance‘,‘Marketing‘]})
df1
df2 = DataFrame({‘employee‘:[‘Jack‘,‘Bob‘,"Jake"],
‘hire_date‘:[2003,2009,2012],
‘group‘:[‘Accounting‘,‘sell‘,‘ceo‘]})
df2
pd.merge(df1,df2,on=‘group‘,how=‘outer‘)
df1 = DataFrame({‘employee‘:[‘Bobs‘,‘Linda‘,‘Bill‘],
‘group‘:[‘Accounting‘,‘Product‘,‘Marketing‘],
‘hire_date‘:[1998,2017,2018]})
df1
df5 = DataFrame({‘name‘:[‘Lisa‘,‘Bobs‘,‘Bill‘],
‘hire_dates‘:[1998,2016,2007]})
df5
pd.merge(df1,df5,left_on=‘employee‘,right_on=‘name‘,how=‘outer‘)
df6 = DataFrame({‘name‘:[‘Peter‘,‘Paul‘,‘Mary‘],
‘food‘:[‘fish‘,‘beans‘,‘bread‘]}
)
df7 = DataFrame({‘name‘:[‘Mary‘,‘Joseph‘],
‘drink‘:[‘wine‘,‘beer‘]})
使用duplicated()函数检测重复的行,返回元素为布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为True
import pandas as pd
from pandas import Series,DataFrame
import numpy as np
#创建一个df
df = DataFrame(data=np.random.randint(0,100,size=(10,6)))
df
#手动将df的某几行设置成相同的内容(为了测试后面的删除重复行)
df.iloc[1] = [1,1,1,1,1,1]
df.iloc[3] = [1,1,1,1,1,1]
df.iloc[7] = [1,1,1,1,1,1]
df
使用replace()函数,对values进行映射操作
df.replace(to_replace={3:1},value=‘one‘)
注意:DataFrame中,无法使用method和limit参数
map()可以映射新一列数据
map()中可以使用lambd表达式
map()中可以使用方法,可以是自定义的方法
eg:map({to_replace:value})
注意 map()中不能使用sum之类的函数,for循环
新增一列:给df中,添加一列,该列的值为中文名对应的英文名
dic = {
‘name‘:[‘周杰伦‘,‘张三‘,‘周杰伦‘],
‘salary‘:[20000,12000,20000]
}
df = DataFrame(data=dic)
df
dic = {
‘周杰伦‘:‘jay‘,
‘张三‘:‘tom‘
}
df[‘e_name‘] = df[‘name‘].map(dic)
df
##################
name salary e_name
0 周杰伦 20000 jay
1 张三 12000 tom
2 周杰伦 20000 jay
###################
df[‘after_sal‘] = df[‘salary‘].map(after_sal)
df
df[‘after_sal‘] = df[‘salary‘].map(after_sal)
df
###################
name salary e_name after_sal
0 周杰伦 20000 jay 11500.0
1 张三 12000 tom 7500.0
2 周杰伦 20000 jay 11500.0
############################
df[‘salary‘].apply(after_sal) # 与map运算类似但是比map运算更快
使用df.std()函数可以求得DataFrame对象每一列的标准差
df = DataFrame(data=np.random.random(size=(1000,3)),columns=[‘A‘,‘B‘,‘C‘])
df
对df应用筛选条件,去除标准差太大的数据:假设过滤条件为 C列数据大于两倍的C列标准差
std_twice = df[‘C‘].std() * 2
df[‘C‘] > std_twice
df.loc[df[‘C‘] > std_twice]
indexs = df.loc[df[‘C‘] > std_twice].index
indexs
df.drop(labels=indexs,axis=0,inplace=True)
df
- take()函数接受一个索引列表,用数字表示,使得df根据列表中索引的顺序进行排序
- eg:df.take([1,3,4,2,5])
可以借助np.random.permutation()函数随机排序
可以借助np.random.permutation()函数随机排序
np.random.permutation(3)
df.take(np.random.permutation(3),axis=1).take(np.random.permutation(100),axis=0)[0:10]
np.random.permutation(x)可以生成x个从0-(x-1)的随机数列
当DataFrame规模足够大时,直接使用np.random.permutation(x)函数,就配合take()函数实现随机抽样
数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值。
数据分类处理:
数据分类处理的核心:
- groupby()函数
- groups属性查看分组情况
- eg: df.groupby(by=‘item‘).groups
from pandas import DataFrame,Series
df = DataFrame({‘item‘:[‘Apple‘,‘Banana‘,‘Orange‘,‘Banana‘,‘Orange‘,‘Apple‘],
‘price‘:[4,3,3,2.5,4,2],
‘color‘:[‘red‘,‘yellow‘,‘yellow‘,‘green‘,‘green‘,‘green‘],
‘weight‘:[12,20,50,30,20,44]})
df
df.groupby(by=‘item‘,axis=0)
使用groups查看分组情况
#该函数可以进行数据的分组,但是不显示分组情况
df.groupby(by=‘item‘,axis=0).groups
#给df创建一个新列,内容为各个水果的平均价格
df.groupby(by=‘item‘,axis=0).mean()[‘price‘]
s = df.groupby(by=‘item‘,axis=0)[‘price‘].mean()
s.to_dict()
df[‘item‘].map(s.to_dict()) # 做映射(转换成字典)
df[‘mean_price‘] = df[‘item‘].map(s.to_dict())
df
def myMean(s):#必须要有一个参数
sum = 0
for i in s:
sum += i
return sum/len(s)
#################
item
Apple 3.00
Banana 2.75
Orange 3.50
Name: price, dtype: float64
##################
###################
0 3.00
1 2.75
2 3.50
3 2.75
4 3.50
5 3.00
Name: price, dtype: float64
###################
导入模块
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams[‘font.sans-serif‘] = [‘FangSong‘] # 指定默认字体
mpl.rcParams[‘axes.unicode_minus‘] = False # 解决保存图像是负号‘-‘显示为方块的问题
导入数据各个海滨城市数据
ferrara1 = pd.read_csv(‘./ferrara_150715.csv‘)
ferrara2 = pd.read_csv(‘./ferrara_250715.csv‘)
ferrara3 = pd.read_csv(‘./ferrara_270615.csv‘)
ferrara=pd.concat([ferrara1,ferrara1,ferrara1],ignore_index=True)
torino1 = pd.read_csv(‘./torino_150715.csv‘)
torino2 = pd.read_csv(‘./torino_250715.csv‘)
torino3 = pd.read_csv(‘./torino_270615.csv‘)
torino = pd.concat([torino1,torino2,torino3],ignore_index=True)
mantova1 = pd.read_csv(‘./mantova_150715.csv‘)
mantova2 = pd.read_csv(‘./mantova_250715.csv‘)
mantova3 = pd.read_csv(‘./mantova_270615.csv‘)
mantova = pd.concat([mantova1,mantova2,mantova3],ignore_index=True)
milano1 = pd.read_csv(‘./milano_150715.csv‘)
milano2 = pd.read_csv(‘./milano_250715.csv‘)
milano3 = pd.read_csv(‘./milano_270615.csv‘)
milano = pd.concat([milano1,milano2,milano3],ignore_index=True)
ravenna1 = pd.read_csv(‘./ravenna_150715.csv‘)
ravenna2 = pd.read_csv(‘./ravenna_250715.csv‘)
ravenna3 = pd.read_csv(‘./ravenna_270615.csv‘)
ravenna = pd.concat([ravenna1,ravenna2,ravenna3],ignore_index=True)
asti1 = pd.read_csv(‘./asti_150715.csv‘)
asti2 = pd.read_csv(‘./asti_250715.csv‘)
asti3 = pd.read_csv(‘./asti_270615.csv‘)
asti = pd.concat([asti1,asti2,asti3],ignore_index=True)
bologna1 = pd.read_csv(‘./bologna_150715.csv‘)
bologna2 = pd.read_csv(‘./bologna_250715.csv‘)
bologna3 = pd.read_csv(‘./bologna_270615.csv‘)
bologna = pd.concat([bologna1,bologna2,bologna3],ignore_index=True)
piacenza1 = pd.read_csv(‘./piacenza_150715.csv‘)
piacenza2 = pd.read_csv(‘./piacenza_250715.csv‘)
piacenza3 = pd.read_csv(‘./piacenza_270615.csv‘)
piacenza = pd.concat([piacenza1,piacenza2,piacenza3],ignore_index=True)
cesena1 = pd.read_csv(‘./cesena_150715.csv‘)
cesena2 = pd.read_csv(‘./cesena_250715.csv‘)
cesena3 = pd.read_csv(‘./cesena_270615.csv‘)
cesena = pd.concat([cesena1,cesena2,cesena3],ignore_index=True)
faenza1 = pd.read_csv(‘./faenza_150715.csv‘)
faenza2 = pd.read_csv(‘./faenza_250715.csv‘)
faenza3 = pd.read_csv(‘./faenza_270615.csv‘)
faenza = pd.concat([faenza1,faenza2,faenza3],ignore_index=True)
city_list = [ferrara,torino,mantova,milano,ravenna,asti,bologna,piacenza,cesena,faenza]
for city in city_list:
city.drop(labels=‘Unnamed: 0‘,axis=1,inplace=True)
max_temp = []
city_dist = []
for city in city_list:
temp = city[‘temp‘].max()
max_temp.append(temp)
dist = city[‘dist‘].max()
city_dist.append(dist)
city_dist
plt.scatter(city_dist,max_temp)
plt.xlabel(‘距离‘)
plt.ylabel(‘温度‘)
plt.title(‘海滨城市最高温度和离还远近之间的关系‘)
需求:需要对当前的数据建立一个算法模型,然后可以让模型实现预测的功能(根据距离预测最高温度)。
人工智能和机器学习之间的关系是什么?
算法模型
样本数据:numpy,DataFrame
模型的分类:
sklearn模块:大概封装了10多种算法模型对象。
from sklearn.linear_model import LinearRegression
linner = LinearRegression()
feature = np.array(city_dist)
feature = feature.reshape(-1, 1)
target = np.array(max_temp)
linner.fit(feature,target) #X:二维形式的特征数据,y:目标数据
linner.predict(255) #y = 3x + 5
linner.score(feature,target)
print(‘模型预测的温度:‘,linner.predict(feature))
print(‘真实温度:‘,target)
x = np.linspace(0,350,100).reshape(-1,1)
y = linner.predict(x)
plt.scatter(city_dist,max_temp)
plt.scatter(x,y)
plt.xlabel(‘距离‘)
plt.ylabel(‘温度‘)
plt.title(‘海滨城市最高温度和离还远近之间的关系‘)
原文:https://www.cnblogs.com/zranguai/p/14279942.html