欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python数据分析之pandas实例解析

程序员文章站 2022-04-15 19:28:11
python数据分析之pandas实例解析 #coding:utf-8 import scrapy import xlwt, lxml import re, json import ma...

python数据分析之pandas实例解析

#coding:utf-8
import scrapy
import xlwt, lxml
import re, json
import matplotlib.pyplot as plt
import numpy as np
import pylab
from scipy import linalg
from pandas import dataframe,series,multiindex
import pandas as pd
'''
基本功能 函数应用和映射
 numpy的ufuncs(元素级数组方法)
 dataframe的apply方法
 对象的applymap方法(因为series有一个应用于元素级的map方法)
'''

'''
#函数
df=dataframe(np.random.randn(4,3),columns=list('bde'),index=['utah', 'ohio', 'texas', 'oregon'])
print(df)
print(np.abs(df))#求绝对值

#lambda【匿名函数】以及应用
f=lambda x:x.max()-x.min()
# def f(x):
#  return series([x.min(),x.max()],index=['min','max'])
print(df.apply(f))#执行函数f[列(axis=0) 最大值-最小值]
print(df.apply(f,axis=1))#按照轴1执行

#applymap 和 map
_format=lambda x:'%.2f'%x
print(df.applymap(_format))#格式化每一个元素
print(df.e.map(_format))#格式化指定索引或列(相当于series)中的元素

#排序和排位

#根据索引排序,对于dataframe可以指定轴
obj=series(range(4),index=['d', 'a', 'b', 'c'])
print(obj.sort_index())

df1=dataframe(np.arange(8).reshape(2,4),index=['three','one'],columns=list('dabc'))
print(df1.sort_index())
print(df1.sort_index(axis=1,ascending=false))#按列降序

#根据值排序
obj1=series([4,7,-3,2])
print(obj.sort_values())
#dataframe指定列排序
df2= dataframe({'b':[4, 7, -3, 2], 'a':[0, 1, 0, 1]})
print(df2)
print(df2.sort_values(by='b'))
print(df2.sort_values(by=['a','b']))


#rank,求排名的平均位置(从1开始)
obj2 = series([7, -5, 7, 4, 2, 0, 4])
print(obj2.rank(method='first'))#去第一次出现,不求平均值。
print(obj2.rank())#默认method='average'
print(obj2.rank(ascending=false,method='max'))#逆序,并取最大值。所以-5的rank是7
df3=dataframe({'b':[4.3, 7, -3, 2],
'a':[0, 1, 0, 1],
'c':[-2, 5, 8, -2.5]})
print(df3.rank(axis=1))#按列排位

'''

#基本功能 重复索引
 #对于重复索引,返回series,对应单个值的索引则返回标量
'''
obj = series(range(5), index = ['a', 'a', 'b', 'b', 'c'])
print (obj.index.is_unique) # 判断是非有重复索引
print ( obj.a[:1])#若有重复索引则通过将该索引切片取值
df = dataframe(np.random.randn(4, 3), index = ['a', 'a', 'b', 'b'])
print (df)
# # print (df.ix['b'].ix[0])
print (df.ix['b'].ix[0])
print (df.ix['b'].ix[1])
'''
#汇总和计算描述统计
 # 常用方法选项
'''
axis 指定轴,dataframe行用0,列用1
 skipna 排除缺失值,默认值为true
 level 如果轴是层次化索引(即multiindex),则根据level选取分组
 count 非na值的数量
 describe 汇总
 min,max
 argmin,argmax 计算能够获取到最小值和最大值的索引位置(整数)
 idxmin,idxmax 计算能够获取到最小值和最大值的索引值
 sum,mean,median,mad 总和,均值,中位数,平均绝对离差
 var,std,skew,kurt,cumsum,cummin,cummax,cumprod 样本值的方差、标准差、偏度(三阶矩)、偏度(四阶矩)、累计和、累计最大值、累计最小值、累计积
 diff 计算一阶差分
 pct_change 计算百分数变化
 
 na值被自动排查,除非通过skipna选项
 
 
'''


#dataframe csv文件读写以及pandas_datareader 的使用
import pandas_datareader.data as web
from pandas import panel
import datetime
start=datetime.datetime(2017,7,25)
end=datetime.date.today()
# all_data={}
# #datareader(name,data_source,start,end)
# # for ticker in ['aapl', 'ibm', 'msft', 'goog']:
# all_data['aapl'] = web.datareader('aapl','iex',start,end)
# pdata=panel(all_data)
# print(pdata)
# price = dataframe({tic: data['close'] for tic, data in all_data.items()})#将从all_data中将股票名为tic 的data['close']按日期索引取出并转化成dataframe结构
# volume = dataframe({tic: data['volume'] for tic, data in all_data.items()})#******************
#  # print('**********************')
#  # print(price)
# price.to_csv('close.csv')
# returns = price.pct_change()
# print(returns.tail())
# print(returns.msft.corr(returns.ibm))
# print(returns.corr())
# print(returns.cov())
# print(returns.corrwith(returns.ibm))
# print(returns.corrwith(returns.volume))
# appl=web.datareader('aapl','iex',start,end)
# print(appl)
#
# data=all_data['aapl']

# df=dataframe({'open':data.open,'high':data.high,'low':data.low,'close':data.close,
#'volume':data.volume})
# print(df.index)
# print(df)
# df.to_csv('apple.csv')
name=['date','open','high','low','close','volume']
raw=pd.read_csv('apple.csv')

df2=raw.set_index(raw.date)
df3=df2.reindex(['open','high','low','close','volume'],axis=1,)
print(df3)

# print(raw.open-raw.close)
# print(raw)

# new_index=raw.ix['date',:]
# raw.set_axis(new_index,axis=1,inplace=true)

# print(s1-s2)



# print(df.index)


'''
如果报以下错误:
#from pandas.core.common import is_list_like
# importerror: cannot import name 'is_list_like'
修改(点击run信息框中的文件地址链接亦可)...set_packages/pandas_datareader/fred.py文件中的from pandas.core.common import 
is_like_list 
为from pandas.api.types import is_like_list【通常在文件第一行】
另外,data_source='yahoo' 会immediatedeprecationerror,
data_source='google' 因谷歌在中国不可用也会报错
具体可看.../set_packages/pandas_datareader/data.py中的相关描述
'''

'''
#唯一值以及成员资格
#is_in计算一个表示“series各值是否包含于传入的值序列中”的布尔型数组
# unique 计算series中的唯一值数组,按发现的顺序返回
#value_counts 返回一个serie,其索引为唯一值,其值为频率,按计数值降序排列
#去重
obj = series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])
print (obj.unique())
print (obj.value_counts())


#判断元素存在
mask = obj.isin(['b', 'c'])
print (mask)
print (obj[mask]) #只打印元素b和c
data = dataframe({'qu1':[1, 3, 4, 3, 4],
'qu2':[2, 3, 1, 2, 3],
'qu3':[1, 5, 2, 4, 4]})
print (data)
print (data.apply(pd.value_counts).fillna(0))
print (data.apply(pd.value_counts, axis = 1).fillna(0))
'''

'''
处理缺失数据
 na处理方法
  dropna 根据各标签的值中是否存在缺少数据对轴
  fillba 样本值的标准差
  isnull 样本值的偏度(三阶矩)
  notnull
 nan(not a number)表示浮点数和非浮点数组中的缺失数据
 none也被当作na处理
 
'''

'''
string_data = series(['aardvark', 'artichoke', np.nan, 'avocado'])
print(string_data.isnull())
string_data[0]=none
print(string_data.isnull())

print(string_data.dropna())

#'dataframe对丢弃na的处理'
from numpy import nan as na

data = dataframe([[1., 6.5, 3.], [1., na, na],
[na, na, na], [na, 6.5, 3.]])
print (data.dropna()) # 默认只要某行有na就全部删除
print (data.dropna(how = 'all'))  # 某行全部为na才删除
data[4] = na  # 新增一列
print (data.dropna(axis = 1, how = 'all'))#某列全部为na才删除
data = dataframe(np.random.randn(7, 3))
data.ix[:4, 1] = na#第0-4行的 1 列为na
data.ix[:2, 2] = na
print (data)
print (data.dropna(thresh = 2)) # 行大于等于2个非na元素会被删除
#how参数控制行为,axis参数选择轴,thresh参数控制留下的数量

#填充缺失数据
# fillna
# inplace参数控制返回新对象还是就地更改
df = dataframe(np.random.randn(7, 3))
df.ix[:4, 1] = na
df.ix[:2, 2] = na
# print (df.fillna(0))
# df.fillna(0, inplace = true)
#'不同行列填充不同的值'
print(df.fillna({1:0.5,3:-1}))#指定某列填充某值,列不存在则该列不填充

#指定不同的填充方式method参数,limit参数
# 还可用统计数据填充
'''

'''
层次化索引
 使你能在一个轴上拥有多个(两个以上)索引级别。抽象地说,它使你能以低纬度形式处理高维度数据
 通过stack与unstack变换dataframe
'''

'''
#series 的层次索引
data = series(np.random.randn(10),
  index = [['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd', 'd'],[1, 2, 3, 1, 2, 3, 1, 2, 2, 3]])
print(data)
print(data.index)
print(data.b)
print(data['b':'c'])
print(data.unstack())#转化成dataframe结构
print(data.unstack().stack())#转化成series结构,将变成多级索引

#dataframe的层次索引
df = dataframe(np.arange(12).reshape((4, 3)),
index = [['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
columns = [['ohio', 'ohio', 'colorado'], ['green', 'red', 'green']])

print(df)
df.index.names=['key1','key2']
df.columns.names=['states','color']
print(df)
print(df.ix['a',1])#取索引a对应第一行
print(df.ix['a','ohio'])#取索引a对应ohio列
print(df.ix['a',2]['colorado'])#取索引a对应第二行colorado列的元素
print(df.ix['a',2]['ohio']['red'])#取索引a对应第二行ohio列索引对应red列的元素

#直接用multiindex创建层次索引结构
print (multiindex.from_arrays([['ohio', 'ohio', 'colorado'], ['gree', 'red', 'green']],
  names = ['state', 'color']))

#重新分级顺序
frame = dataframe(np.arange(12).reshape((4, 3)),
index = [['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
columns = [['ohio', 'ohio', 'colorado'], ['green', 'red', 'green']])
frame.index.names = ['key1', 'key2']
frame_swapped = frame.swaplevel('key1', 'key2')
print (frame_swapped)
print (frame_swapped.swaplevel(0, 1))#层级转换此代码意为将一级索引转换为二级索引


#'根据索引排序'
print (frame.sort_index(level='key2'))
print (frame.swaplevel(0, 1).sort_index(level=0))

#根据级别汇总统计
print(frame.sum(level='key2'))

#使用列生成层次索引
df6=dataframe({'a':range(7),
'b':range(7,0,-1),
'c':['one','one','one','two','two','two','two'],
'd':[0,1,2,0,1,2,3],
})
print(df6)
print(df6.set_index(['c','d']))#将c,d作为行索引(二级索引)
print(df6.set_index(['c','d'],drop=false))#列依然保留
df7=df6.set_index(['c','d'])
print(df7.reset_index())#索引重置

#避免索引产生歧义使用整数索引(按序).iloc[row,col]

'''

'''
#面板(pannel)数据
 通过三维ndarray创建pannel对象
 通过ix[]选取需要的数据
 访问顺序:item->major->minor
 通过stack展现面板数据
 
  
'''