Beinsearch
5/19/2017 - 2:14 PM

python 科学计算

python 科学计算

#numpy.array
#构造 
a = numpy.array([1,2,3,4])
a = np.arange(5)  #array([0, 1, 2, 3, 4])
a = np.ones((2,3), dtype=int) 
a = np.zeros((rows,cols),dtype=int)
b = np.random.random((3,2)) #返回随机浮点数位于半开区间 [0.0, 1.0)
b = np.random.randint(low,high,(rows,cols))  #返回随机整数位于半开区间 [low, high)
b = np.random.randn(rows,cols)  #返回标准正态分布样本
b = np.round(np.random.normal(mu,sigma,N),2)
http://blog.csdn.net/unin88/article/details/50570196

#转换 
a = numpy.array([1,2,3,4])
b = a.astype(np.float32)
a.tolist()

#连接 
np.append(x,y)  #x,y可为数,list或numpy.array类型
#concatenate()效率更高
a=np.array([1,2,3])
b=np.array([11,22,33])
np.concatenate((a,b),axis=0)  # 默认情况下,axis=0可以不写
array([ 1,  2,  3, 11, 22, 33])

a=np.array([[1,2,3],[4,5,6]])
b=np.array([[11,21,31],[7,8,9]])
np.concatenate((a,b),axis=0)
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [11, 21, 31],
       [ 7,  8,  9]])

np.concatenate((a,b),axis=1)  #axis=1表示对应行的数组进行拼接
array([[ 1,  2,  3, 11, 21, 31],
       [ 4,  5,  6,  7,  8,  9]])

y = a**2  #元素平方
y.shape 
y[y>5]  
numpy.dot(a,b)  #矩阵乘法 
numpy.column_stack((a,b))

y.min(),y.max(),y.sum(),y.sort()
numpy.mean(z[0,:])  #均值 
numpy.median(z[0,:])  #中位数
np.percentile(z,95)
numpy.corrcoef(x,y)
numpy.std(x)

Numpy 基本数据
inti	整数,大小由平台决定
int8	整数,大小为一个字节,范围:-128 ~ 127
int16	整数,范围:-32768 ~ 32767 
int32	整数,范围:-2**31 ~ 2*31-1 
int64	整数,范围:-2**63 ~ 2*63-1 
uint8	无符号整数,0 ~ 255
uint16	无符号整数:0 ~ 65535
uint32	无符号整数: 0 ~ 2**32-1
uint64	无符号整数: 0 ~ 2**64-1
float16	 半精度浮点数: 16位 ,正负号1位,指数5位,精度10位
float32	 单精度浮点数:32位,正负号1位,指数8位,精度32位
float64 / float	双精度浮点数: 64位,正负号1位,指数11位,精度52位
random.seed(10)
random.seed()           #省略参数,意味着取当前系统时间

# 随机浮点数
random.random()

# 返回指定范围的一个随机整数,包含上下限
random.randint(a,b)

# 返回[x, y)内的随机实数
random.uniform(x,y)

# 按步长随机在上下限范围内取一个随机数
random.randrange(start,stop,step)

# 随机的选取一个字符
random.choice('abcde./;[fgja13ds2d')

# 随机的选取n个字符
random.sample('abcdefghijk',3)

# 列表洗牌
random.shuffle(list)
import pandas as pd, numpy as np
#打印版本 
pd.__version__ 

#导入、出csv文件
csv_chunks = pd.read_csv('order_products__prior.csv',chunksize = 10000)
prior_orders = pd.concat(chunk for chunk in csv_chunks)

orders = pd.read_csv('../input/orders.csv', engine='c', dtype={'order_id': np.int32, 
                                                           'user_id': np.int32, 
                                                           'eval_set': 'category',
                                                           'order_number': np.int32, 
                                                           'order_dow': np.int8, 
                                                           'order_hour_of_day': np.int8, 
                                                           'days_since_prior_order': np.float16})
print('orders {}: {}'.format(orders.shape, ', '.join(orders.columns)))
orders.to_csv('csvfilename') #可选参数:encoding='utf-8', index=False(不含索引)
#nrows=1000(读前1000行),usecols=[1,3,5](读135列),usecols=['A','B','C'](读ABC列)

#分块读取大文件
reader = pd.read_table('tmp.sv', sep='|', chunksize=4)
for chunk in reader:
    print(chunk)
#或
reader = pd.read_table('tmp.sv', sep='|', iterator=True)
print reader.get_chunk(5)

#DataFrame
print('Total orders: {}'.format(orders.shape[0])) #行数 
print(orders.info())  #字段与占用内存 
print(order_details.dtypes) #字段类型 
df['Category'].unique()
print('Memory consumption: {:.2f} Mb'.format(sum(order_details.memory_usage(index=True,deep=True) / 2**20)))
orders.head() 
df.isnull().any() #判断是否有数据缺失
np.where(df.isnull())   #查找缺失值坐标
df[df.isnull().values==True]  #显示有缺失值的行
df.describe()

# 查看特征分布
df.boxplot(column='Fare', by = 'Pclass') #箱线图
plt.hist(df['Fare'], bins = 10, range =(df['Fare'].min(),df['Fare'].max()))
#如果变量是categorical的,想看distribution,则可以:
df.PdDistrict.value_counts().plot(kind='bar', figsize=(8,10))
# 透视表
pd.pivot_table(df, index='FaultClass', columns='UseDays', margins=True) #margins设置为True可以得到分项总计数据
pd.crosstab(df.FaultClass,df.UseDays, margins=True)


# 格式变换
format = lambda x: '%.2f' % x
frame.applymap(format)
frame['e'].map(format)

#DataFrame每一列是Series 类型,转换为numpy的ndarray: array(df.columns[0])
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
df['E'] = np.where(df['D'] >= 0, '>=0', '<0')
df['F'] = np.random.randint(0, 2, 6)
df = pd.DataFrame({ 'A': ['A0', 'A1', 'A2', 'A3'],  
                     'B': ['B0', 'B1', 'B2', 'B3'],  
                     'C': ['C0', 'C1', 'C2', 'C3'],  
                     'D': ['D0', 'D1', 'D2', 'D3']}) 

#处理异常值 
df = df[df.X.isnull().values==False]
df.fillna({'column1':'0', 'column2':'1'})
sub = df['X'].quantile(0.999)
df.loc[df['X']>sub,'X'] = sub

# 值替换
subdict = {'柴油滤芯':'柴滤', '空气滤芯':'空滤', '机油滤芯':'机滤', '机、滤':'机滤', '更换液压油':'液压油', '起动电机':'起动机'}
df_clean.MaterialName.replace(subdict, inplace=True)
df_clean['MaterialName'] = df_clean['MaterialName'].map(subdict)

loc,基于列label,可选取特定行(根据行index)
iloc,基于行/列的position
ix,为loc与iloc的混合体,既支持label也支持position

df.loc[:,('one','two')] #返回Series 
df.loc[:,df.columns[:2]]
df.iloc[:,:2] #返回Series 
df.ix[:,('one','two')]  #返回DataFrame
df.ix[:,:2]

# 删除行
df = df.drop([rowid1, rowid2])
df.drop(df.index[[rowid1, rowid2]],inplace=True)

# 去重
df.drop_duplicates(['k2'])

#筛选 
df[(df.C>0)&(df.D<0)][['A','B']]
df[df[C].isin([1,3,4,5])]
#排序 
df.sort_values(['A','D'],ascending=False)

# 增加列
df['newCol'] = None
pd.concat([df, pd.DataFrame(columns=list('DE'))])
df.reindex(columns=list('ABCDE'), fill_value=0)
#删除列 
orders.drop(['order_number'], axis=1, inplace=True)
#列改名 
op_train.rename(columns={'reordered': 'label'}, inplace=True)
#改变列的顺序 
b = df.pop('b')
df.insert(0, 'b', b)

#两个df相merge
#两个df的column都一样, index不重复(增加行),列的顺序不影响:
pd.concat([df1,df2])  #result = result.reset_index(drop=True)
#concat([df1,df2]) 等价于 df1.append(df2)
#两个df的index一样, column不同(增加列)
pd.concat([df1,df2], axis = 1)
#concat([df1,df2],axis=1) 等价于 merge(df1,df2,left_index=True,right_index=True,how='outer'),列数是两表并集

#左连接,products表有商品的department_id,需补充具体department
pd.merge(left=products, right=departments, how='left')  
#how指的是左右两个表主键那一列中存在不重合的行时,取结果的方式:inner表示交集,outer 表示并集,left 和right 表示取某一边。

df.apply(func, axis=0,...)  #对象是DataFrame
df['one'].map(sqrt)  #对象是Series 

pd.value_counts(df["E"])  #计数
pd.pivot_table(df,index=['E','F']) #分组汇总
pd.pivot_table(df,index=['E','F'], aggfunc=[np.sum, np.mean])
df.pivot_table(index=['E','F'], aggfunc=[np.sum, np.mean])

df.groupby(['E','F']).mean()
df.groupby(['E','F']).agg(['sum', 'mean'])
df.groupby(['E','F']).agg({'A':['mean','sum'], 'B':'min'})

#分组汇总
df = pd.DataFrame(((random.randint(2012, 2016), random.choice(['tech', 'art', 'office']), \
'%dk-%dk'%(random.randint(2,10), random.randint(10, 20)), '') \
for _ in xrange(10000)), columns=['publish_time', 'classf', 'salary', 'title'])

df.groupby(['publish_time', 'classf', 'salary'])\
.count()['title'].groupby(level=0, group_keys=False).nlargest(10)

#pandas的Index对象具有字典的映射功能
col_index.get_loc('pop')
col_index.get_indexer(['pop','year'])

#MultiIndex多重索引 
user_product_time.columns
#MultiIndex(levels=[[u'order_dow', u'order_hour_of_day'], [u'mean', u'std']],
#           labels=[[0, 0, 1, 1], [0, 1, 0, 1]])
#取内层索引所有'std'列 
user_product_time.loc[:,(slice(None),'std')]

#series转ndarray
foo = ser.as_matrix()
#DataFrame转ndarray
foo = df.as_matrix()
foo = df.values
foo = np.array(df)

#dataframe按行迭代
from numpy.random import randn
df = pd.DataFrame({'a': randn(100000), 'b': randn(100000)})
from itertools import izip
for r in izip(df.index, df['a'], df['b']):
    test_list.append((r[0], r[1], r[2]))

for r in zip(df.index, df['a'], df['b']):
    test_list.append((r[0], r[1], r[2]))
    
for ir in df.itertuples():
    test_list.append((ir[0], ir[1], ir[2]))  

for i, r in enumerate(df.values):
    test_list.append((df.index[i], r[0], r[1]))

# following are too slow
# for i,r in df.iterrows():
#     test_list.append((df.index[i], r['a'], r['b']))
# for r in xrange(len(df)):
#     test_list.append((df.index[r], df.iloc[r,0], df.iloc[r,1]))

# 观察数据分布
import plotly
import plotly.figure_factory as ff
# 为根据生还区分类别 , 字符化survived   1生还,0死亡
data['Survived'] = data['Survived'].astype('str')
fig = ff.create_scatterplotmatrix(data, diag='histogram',index='Survived',colormap=[ '#32CD32', '#00F5FF'],
                                  height=800, width=800)
plotly.offline.plot(fig, filename='p2.html')
#nan的赋值
x = float("nan")
x = numpy.nan

#nan的判断
import math
math.isnan(x)

def isNaN(num):
    return num != num
    
#在dataframe中查找nan
df[df.isnull().values==True]
#第一种方法:
df['value'] = df.groupby('category')['value'].apply(lambda x: x.fillna(x.mean()))

#第二种方法:
df['value'] = df['value'].fillna(df.groupby('category')['value'].transform('mean'))

#第三种方法:
cols = [col for col in df.columns if col not in['indstry']]
# 分组的列
gp_col = 'indstry'
# 查询nan的列
df_na = df[cols].isna()
# 根据分组计算平均值
df_mean = df.groupby(gp_col)[cols].mean()
# 依次处理每一列
for col in cols:
    na_series = df_na[col]
    names = list(df.loc[na_series,gp_col])     
    t = df_mean.loc[names,col]
    t.index = df.loc[na_series,col].index
    # 相同的index进行赋值     
    df.loc[na_series,col] = t
print(df)