这个学期起初的时候对一些东西有所了解过,就跳过很多东西吧,把一些自己认为重要的做出笔记,看了昨天的那东西,截图搞得自己现在都犯糊涂,以后有机会再把主要的原理和知识点搞出来吧,毕竟现在我也不是很懂。 今天弄pandas, 字数不多,但好长。
pd.set_option('display.notebook_repr_html', False)
pd.set_option('display.max_columns', 10)
pd.set_option('display.max_rows', 10)
不弄也没事,有些数据反而不好显示,但知道有这么个设置吧
import pandas as pd
s3 = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
pd.Series(np.arange(0, 9)) 基本形式就是这样
pd.Series(np.linspace(0, 9, 10)) 等步长 以10为底 Series注意大写,自带索引
s6 = pd.Series({'a': 1, 'b': 2, 'c': 3, 'd': 4}) 字典创建
size, shape, uniqueness, and counts of values 以s.sise方式调用
# count() returns the number of non-Na N values s.count()返回非空数组
# all unique values s.unique() 以及啥s.value_counts()
Peeking at data with heads, tails, and take s.head(n = 3) s.tail(n = 3)
其中s.take([0, 3, 9]) take返回特定的行,用行索引值
s5.loc[12] 按标签找值 s5.loc[[12, 10]] 多个标签找值
s5.iloc[1] 按索引找值 s5.iloc[[0, 2]]
ix两个都可以 如s3.ix[['a', 'c']] s3.ix[[1, 2]]
但两个pandas相加会以索引相同的相加
nda = np.array([1, 2, 3, 4, np.Na N]) nda.mean() 会得到空值,pandas会忽略空值计算均值
s.mean(skipna=False)
学表达式 logical Results = s > 5 s[logical Results]
或者更短 s[s > 5]
s[s > 5 and s < 8] 是错误的语法
s[(s > 5) & (s < 8)] 才是正确的,不用and/or 用 &/ | 否则会错 s[s < 2].any()
Reindexing a Series
s = pd.Series(np.random.randn(5))
s.index = ['a', 'b', 'c', 'd', 'e']
combined = pd.concat([s1, s2]) 索引类型必须一直,否则出现空值
s2.index = s2.index.values.astype(int) 换数据类型
s2.reindex(['a', 'f'], fill_value=0)
s3.reindex(np.arange(0,7), method='ffill')
切片操作: s[0:6:2] 意思是 查找位置 索引 0, 2, 4的值
相当于 s.iloc[[0, 2, 4]]
还有 s[:5:2] s[4::2] 4开始步长为2 s[::-1] 反转。 s[4::-2] 倒数第四个起
s[-3:] 最后三个 s[-4:-1] equivalent to s.tail(4).head(3)
以上是Series的,接下来时DataFrame
The pandas Data Frame Object
import numpy as np
import pandas as pd
pd.DataFrame(np.array([[10, 11], [20, 21]])) 自带索引 列名 若无指定
"{0}, {1}".format(df.columns[0], df.columns[1])
df.columns = ['c1', 'c2'] 重命名列
create a Data Frame with named columns and rows
df = pd.Data Frame(np.array([[0, 1], [2, 3]]),columns=['c1', 'c2'],index=['r1', 'r2'])
sp500 = pd.read_csv("data/sp500.csv",index_col='Symbol',usecols=[0, 2, 3, 7])指定索引列,并制定只选取哪些列
Selecting columns of a DataFrame 选取某些列
sp500[[1, 2]].head() 1,2列的头部(前5行)
get price column by name sp500['Price'] sp500[['Price', 'Sector']]
选行:
sp500[:5] 前5行 sp500['ABT':'ACN'] sp500.loc['MMM'] sp500.loc[['MMM', 'MSFT']]
sp500.iloc[[0, 2]] sp500.ix[['MSFT', 'ZTS']] sp500.ix[[10, 200, 450]]
sp500.at['MMM', 'Price'] 坐标值
sp500[sp500.Price < 100]
r = sp500[(sp500.Price < 10) &(sp500.Price > 0)] [['Price']] 条件下只选择显示price列
Renaming columns 重命名列
df = sp500.rename(columns={'Book Value': 'Book Value'})
sp500.rename(columns={'Book Value': 'Book Value'},inplace=True) 参数的作用是在原始列中重命名实现
增加插入列
copy['Twice Price'] = sp500.Price * 2 新列
copy.insert(1, 'Twice Price', sp500.Price * 2) 插入位置,名字,值
rcopy = sp500[0:3][['Price']].copy()
置换列的内容:copy.Price = sp500.Price * 2 不增加新列
del copy['Book Value'] 删某列
popped = copy.pop('Sector')
afterdrop = copy.drop(['Sector'], axis = 1) 1指列
apending rows with .append() 增加行用这个函数
appended = df1.append(df2)
df1.append(df3, ignore_index=True) 参数不加会引起索引的不连续 ,即各自索引拼接而已,
pd.concat([df1, df2]) 也可以这样
df2_2.insert(3, 'Foo', pd.Series(0, index=df2.index)) 插入列
r = pd.concat([df1, df2_2], keys=['df1', 'df2'])
效果:
pd.concat([df3, df4], axis=1) 按列拼接
df4_2.insert(1, 'Sector', pd.Series(1, index=df4_2.index))
df6 = sp500[2:5][[0,1]] 显示2到5行 1,2列
pd.concat([df5, df6], join='inner', axis=1) 注意join参数,还有几个
afterdrop = ss.drop(['ABT', 'ACN']) 把行里面的选定标签给去掉了
subset.loc['MMM', 'Price'] = 10
subset.loc['ABBV', 'Price'] = 20 改变值
subframe = df[1:4][['B', 'C']]
Resetting and reindexing
reset_sp500 = sp500.reset_index() 把原本的索引列变为普通列
reset_sp500.set_index('Symbol') 将普通列设置为索引列
reindexed = subset.reindex(index=['MMM', 'ABBV', 'FOO']) 重新设置行索引的位置和内容
subset.reindex(columns=['Price','Book Value','New Col']) 可以用于列的索引标签
Hierarchical indexing 叫层次化索引吧,英语不好
reindexed = sp500.reset_index() 先将源索引贬职,
multi_fi = reindexed.set_index(['Sector', 'Symbol']) 在设置多个索引,按顺序的这是
one_mon_hist.mean() 默认为列的均值
one_mon_hist.mean(axis=1) 计算为行的均值
one_mon_hist[['MSFT', 'AAPL']].min()
pd.Series([1, 2, 3, 4]).cumprod() 连乘
pd.Series([1, 2, 3, 4]).cumsum() 累加
one_mon_hist.describe()
s.unique()
s.value_counts() 每一个唯一值得个数。
pd.read_csv() function:这个函数用于读取数据
msft = pd.read_csv("data/msft.csv", index_col=0) 指定索引
msft.dtypes 查看数据类型之后
msft = pd.read_csv("data/msft.csv",dtype = { 'Volume' : np.float64}) 改变数据类型
df = pd.read_csv("data/msft.csv",header=0,names=['open', 'high', 'low','close', 'volume', 'adjclose']) 修饰列名,header=0 表示跳过首行,必须有,不然以后会出问题 可能
df2 = pd.read_csv("data/msft.csv",usecols=['Date', 'Close'],index_col=['Date']) 指定列,索引
df2.to_csv("data/msft_modified.csv", index_label='date') 存储数据
df = pd.read_table("data/msft.csv", sep=',') 分隔符为,的文件
df.to_csv("data/msft_piped.txt", sep='|')
df = pd.read_csv("data/msft2.csv", skiprows=[0, 2, 3]) 跳过那几行
df = pd.read_csv("data/msft_with_footer.csv",skip_footer=2,engine = 'python') 跳过最后两行
pd.read_csv("data/msft.csv", nrows=3) 只读取前3行
pd.read_csv("data/msft.csv", skiprows=100, nrows=5,header=0,names=['open', 'high', 'low', 'close', 'vol','adjclose']) 以上的整合,就不写意思了
df = pd.read_excel("data/stocks.xlsx")
aapl = pd.read_excel("data/stocks.xlsx", sheetname='aapl') 读取指定表
df.to_excel("data/stocks2.xls") 存储
df.to_excel("data/stocks_msft.xls", sheet_name='MSFT')
from pandas import Excel Writer
with Excel Writer("data/all_stocks.xls") as writer:
aapl.to_excel(writer, sheet_name='AAPL')
df.to_excel(writer, sheet_name='MSFT') 多个表的操作
df_from_json = pd.read_json("data/stocks.json")
从web读取html 数据
url = "http://www.fdic.gov/bank/individual/failed/banklist.html"
banks = pd.read_html(url)
首先import Html5Lib
df = pd.Data Frame(np.random.randn(8, 3),index=pd.date_range('1/1/2000', periods=8),columns=['A', 'B', 'C'])
这是从web读取
df = pd.read_csv("http://ichart.yahoo.com/table.csv?s=MSFT&" +"a=5&b=1&c=2014&" +"d=5&e=30&f=2014&" +"g=d&ignore=.csv") 反正没弄成,在编译器上报网址错误
但要记住这个方法,,或记住有这个方法
Reading and writing from/to SQL databases 这一站等过几天学习生sql的时候在回过来 看吧
从远程数据服务器上读取数据
import pandas.io.data as web 改了,,会报错
start = datetime.datetime(2012, 1, 1)
end = datetime.datetime(2014, 1, 27)
yahoo = web.Data Reader('MSFT', 'yahoo', start, end)
goog = web.Data Reader("MSFT", 'google', start, end)
aapl = pd.io.data.Options('AAPL', 'yahoo') 函数
data = aapl.get_all_data() 不知道能成不
data.loc[(80, slice(None), 'put'), :].iloc[0:5, 0:4] 能理解意思上面的基础操作就没有白学习
msft_calls = pd.io.data.Options('MSFT', 'yahoo').get_call_data(expiry=expiry)
expiry = datetime.date(2015, 1, 17)
aapl_calls = aapl.get_call_data(expiry=expiry)
gdp = web.Data Reader("GDP", "fred",datetime.date(2012, 1, 1),datetime.date(2014, 1, 27))
还可以下载数据:
Tidying Up Your Data 清洗脏数据