#5.1便捷数据获取
步骤:
数据收集、数据整理、数据描述、数据分析
数据获取(本地,网络数据)
#下载nltk语料库
import nltk
nltk.download()
from nltk.corpus import gutenberg
print(gutenmberg)
#5.2 数据准备
数据准备(预处理)过程中常常需要进行数据的处理,例如数据清洗包括缺失值和异常值处理,数据变换如规范化数据,数据规约如属性规约(选择部分有代表性的属性)等,在Python有很多进行数据预处理的快速方法,以数据清洗中的缺失值处理为例,在实际过程中常常会发现有的数据是缺失(NaN)的,这些值是需要特别处理的。缺失值的判断可利用numpy中的isnan()函数,而对于Series或DataFrame,缺失值的判断和处理非常的方便,例如df.dropna()可以删掉含NaN(NA)的行,df.dropna(how='all')只丢弃全为NaN的那些行,也可以进行值的插补,例如用0、均值、中位数或众数等进行填充插补,也可用插值法即基于已知点建立插值函数f(x),通过xi求得f(xi)来近似替代,常用方法有拉格朗日插值法和牛顿插值法NaN。
创建时间序列:
>>>import pandas as pd
>>>dates=pd. date_range(20170520', periods=7)
>>>dates
<class' pandas. tseries. index. Datetimelndex'> 、
[2017-05-20,…,2017-05-26]
Length:7, Freq:D, Timezone: None
>>>import numpy as np
>>>datesdf=pd. DataFrame(np. random. randn(7,3), index=dates, columns=list(ABC))
>>>datesdf
A B C
2017-05-20 1.302600 -1.214708 1.411628
2017-05-21 -0.512343 2.277474 0.403811
2017-05-22 -0.788498 -0.217161 0.173284
2017-05-23 1.042167 -0.453329 -2.107163
2017-05-24 -1.628075 1.663377 0.943582
2017-05-25 -0.091034 0.335884 2.455431
2017-05-26 -0.679055 -0.865973 0.246970
#5.3数据显示
显示方式:
显示行索引
显示列索引
显示数据的值
显示数据描述
>>>list(djidfindex) #行索引[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22, 23,24,25,26,27,28,29]
>>>list(djidf. columns) #列索引
[' code',' name', lasttrade]
>>>dijdf. values #查看值
array([[' MMM','3M',195.8],
…,
[' WMT","Wal-Mart',78.77]], dtype=object)
>>>djidf. describe
<bound method NDFrame. describe of code name lasttrade
0 MM 3M 195.80
…,
29 WMT Wal-Mart 78.77>
a.lasttrade #查看a数据最后一列
#5.4数据选择
选择方式:
·选择行
·选择列
·选择区域
·筛选(条件选择)
a.loc[1:5] #选择1道5列数据
a.loc[:,['code','lasttrade']] #得到两列索引
a.iloc[1:6,[0,2]] #选择1,2,3,4,5行中的第0列和第2列
#5.5 简单统计与处理
简单统计与筛选
a.lasttrade.mean() #求平均值
#排序
按最近一次成交价对30只道指成分股股票进行排序。根据排序结果列出前三甲公司名。
>>>tempdf=djidf. sort_values(by=' lasttrade', ascending=False)
code name lasttrade
12 GS Goldman Sachs 215.39
0 MMM 3M 195.80
3 BA Boeing 180.76
26 UNH UnitedHealth 172.59
...
>>>tempdf[:3].name #前三甲公司
12 Goldman Sachs
0 3M
3 Boeing
Name:name,dtype:object
#计数统计:
统计本年度1月份的股票开盘天数?
>>>t=quotesdf[(quotesdf. index>='2017-01-01)&(quotesdf. index<'2017-02-01)]
>>>len(t)
20
#统计近一年每个月的股票开盘天数?
#strptime():将一个字符串变成time格式
import time
...
listtemp=[]
for i in range(len(quotesdf)):
temp=time. strptime(quotesdf. index[i],"9%Y-%m-%d")
listtemp.append(temp.tm_mon)
tempdf=quotesdf.copy()
tempdf[' month]=listtemp
print(tempdf['month'].value_counts())
Output:
8 23
3 23
6 22
12 21
11 21
10 21
9 21
5 21
7 20
1 20
4 19
2 19
Name:month,
dtype:int64
#5.6 Grouping(分类汇总)
#Q1:统计近一年每个月的股票开盘天数?
>>>x=tempdf.groupby('month’).count()
>>>x.close
#Q2:统计近一年每个月的总成交量?
>>>tempdf.groupby('month).sum().volume
#基于月份进行统计,总量,成交量
#高效方式:对成交量进行求和
>>>tempdf.groupby('month).volume.sum()
#有一个记录了爱吃苏式或广式月饼的用户DataFrame:
>>> mooncakes_df
name gender age taste of mooncake
0 Liuzi M 21 Cantonese-style
1 Huangqi F 32 Su-style
2 Yuanyuan F 35 Su-style
3 Duyue F 14 Cantonese-style
4 Zhangtian M 33 Cantonese-style
若要统计mooncakes_df中分别爱吃两种口味月饼的人数,用如下代码实现:
>>> mooncakes_df.groupby("taste of mooncake").age.count()
taste of mooncake
Cantonese-style 3
Su-style 2
Name: age, dtype: int64
#使用groupby()方法结合一些统计函数在做数据的分组统计时非常有用,另外,值得注意的是,groupby()还常常与apply()函数连用,apply()函数可将函数作用在一个Series对象上默认是DataFrame的列,也可以是行,最后将结果尽可能的聚合后返回。apply()函数的自由度很高,它的最基本形式为“DataFrame.apply(func, axis = 0)”,func是函数,可以自己实现,默认axis为0,表示apply()函数会自动遍历DataFrame的每一列数据(一个Series)按相应函数功能对其进行处理,处理结束后将所有结果组合后返回,若axis设为1则遍历处理DataFrame的每一行数据。例如对一个原始的或用切片等方式处理后的DataFrame对象,要统计该DataFrame每列的最大值可用df.apply(max),每行的最大值可用df.apply(max, axis=1)来快速实现。
#5.7 Merge(合并)
1.append追加:
把公司本年度1月1日至1月5日间的股票交易信息合并到近一年中前两天的股票信息中?
>>>p = quotesdf[:2] #前两天的信息
>>>q=quotesdf['2017-01-01:2017-01-05] #一号到五号的信息
>>>p.append(q) #两部分合并追加
2.concat连接:
将美国运通公司近一年股票数据中的前5个和后5个合并。
>>>pieces=[tempdf[:5],tempdf[len(tempdf)-5:] #先有两个对象
>>>pd.concat(pieces) #把两个对象连接
#Q1:两个不同逻辑结构的对象能否连接?
>>>piece1=quotesdf[:3]#不含月份的数据
>>>piece2=tempdf[:3]#含有月份的数据
>>>pd.concat([piece1,piece2],ignore_index=True)#不使用连接轴上索引值,可以连接
3.join连接(两张表要有共同字段,和数据库表连接相同)
#Q1:将美国运通公司和可口可乐公司近一年中每个月的交易总量表(包含公司代码)与30只道琼斯成分股股票信息合并。
>>>pd.merge(djidf.drop(['lasttrade'],axis =1),AKdfon ='code')