2015-04-16-时间序列(2)-时区处理等

来源:互联网 发布:安卓微信虚拟聊天软件 编辑:程序博客网 时间:2024/06/01 20:50
from pandas import DataFrame,Series
import numpy as np
import pandas as pd
-----------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------
-----(四)、时区处理




import pytz
pytz.common_timezones[-5:]


ts=pytz.timezone('US/Eastern')


#-----1.本地化和转换
rng=pd.date_range('3/9/2012 9:30',periods=6,freq='D')
ts=Series(np.random.randn(len(rng)),index=rng)
print(ts.index.tz)


#在生成日期范围的时候还可以加上一个时区集
pd.date_range('3/9/2012 9:30',periods=10,freq='D',tz='UTC')


#本地化
ts_utc=ts.tz_localize('UTC')
ts_utc
ts_utc.index


#转换到别的时区
ts_utc.tz_convert('US/Eastern')


ts_eastern=ts.tz_localize('US/Eastern')
ts_eastern.tz_convert('UTC')
ts_eastern.tz_convert('Europe/Berlin')


#tz_localize和tz_convert也是DatetimeIndex的实例方法
ts.index.tz_localize('Asia/Shanghai')


#-----2.操作时区意识型Timestamp对象
stamp=pd.Timestamp('2011-03-12 04:00')
stamp_utc=stamp.tz_localize('utc')
stamp_utc.tz_convert('US/Eastern')


#在创建Timestamp时,还可以传入一个时区信息
stamp_moscow=pd.Timestamp('2011-03-12 04:00',tz='Europe/Moscow')
stamp_moscow


#时区意识型Timestamp对象在内部保存了一个UTC时间戳值
stamp_utc.value
stamp_utc.tz_convert('US/Eastern').value


#当使用pandas的DateOffset对象执行时间算术运算时,运算过程会自动关注是否存在夏令时转变期
#夏令时转变前30分钟
from pandas.tseries.offsets import Hour
stamp=pd.Timestamp('2012-03-12 01:30',tz='US/Eastern')
stamp
stamp+Hour()
#夏令时转变前90分钟
stamp=pd.Timestamp('2012-11-04 00:59',tz='US/Eastern')
stamp
stamp+Hour()


#-----3.不同时区之间的运算
rng=pd.date_range('3/7/2012 9:30',periods=10,freq='B')
ts=Series(np.random.randn(len(rng)),index=rng)
ts
ts1=ts[:7].tz_localize('Europe/London')
ts2=ts1[2:].tz_convert('Europe/Moscow')
result=ts1+ts2
result.index
-----------------------------------------------------------------------------------------
-----(五)、时期及其算术运算
p=pd.Period(2007,freq='A-DEC')
p
位移
p+5
p-2


pd.Period('2014',freq='A-DEC')-p


#period_range函数
rng=pd.period_range('1/1/2000','6/30/2000',freq='M')


Series(np.random.randn(6),index=rng)


values=['2001Q3','2002Q2','2003Q1']
index=pd.PeriodIndex(values,freq='Q-DEC')
#-----1.时期的频率转换
p=pd.Period('2007',freq='A-DEC')
p.asfreq('M',how='start')
p.asfreq('M',how='end')


p=pd.Period('2007-08','M')
p.asfreq('A-JUN')


rng=pd.period_range('2006','2009',freq='A-DEC')
ts=Series(np.random.randn(len(rng)),index=rng)
ts.asfreq('M',how='start')
ts.asfreq('B',how='end')


#-----2.按季度计算的时期频率
p=pd.Period('2012Q4',freq='Q-JAN')
p
p.asfreq('D','start')
p.asfreq('D','end')


#获取该季度倒数第二个工作日下午4点的时间戳
p4pm=(p.asfreq('B','e')-1).asfreq('T','s')+16*60
p4pm
p4pm.to_timestamp()


#形成季度型范围
rng=pd.period_range('2011Q3','2012Q4',freq='Q-JAN')
ts=Series(np.arange(len(rng)),index=rng)
ts


new_rng=(rng.asfreq('B','e')-1).asfreq('T','s')+16*60
ts.index=new_rng.to_timestamp()
ts


#-----3.将Timestamp转换为Period(及其反向工程)
rng=pd.date_range('1/1/2000',periods=3,freq='M')
ts=Series(np.random.randn(3),index=rng)


pts=ts.to_period()
ts
pts


rng=pd.date_range('1/29/2000',periods=6,freq='D')
ts2=Series(np.random.randn(6),index=rng)
ts2.to_period('M')


pts=ts.to_period()
pts
pts.to_timestamp(how='end')


#-----4.通过数组创建PeriodIndex
cd L:\czz
data=pd.read_csv('ch08\macrodata.csv')
data.year
data.quarter
index=pd.PeriodIndex(year=data.year,quarter=data.quarter,freq='Q-DEC')




data.index=index
data.infl
-----------------------------------------------------------------------------------------
-----(六)、重采样及频率转换
rng=pd.date_range('1/1/2000',periods=100,freq='D')
ts=Series(np.random.randn(len(rng)),index=rng)
ts.resample('M',how='mean')
ts.resample('M',how='mean',kind='period')
#####resample方法的参数
freq              表示重采样频率的字符串或DateOffset,例如'M','5min'或Second(15)
how='mean'        用于产生聚合值的函数名或数组函数,如mean,ohlc,max,min,first,last,median
axis=0            重采样的轴,默认为axis=0
fill_method=None  升采样时如何插值,比如'ffill'或'bfill'.默认不插值
closed='right'    在降采样中,各时间段的哪一端是闭合(即包含)的,right或left
label='right'     在降采样中,如何设置聚合值的标签,right或left(面元的右边界或左边界).
                  例如9:30到9:35之间的这5分钟会被标记为9:30或9:35.默认为'right'
loffset=None      面元标签的时间校正值,比如'-1s'/Second(-1)用于将聚合标签调早1秒
limit=None        在前向或后向填充时,允许填充的最大时期数
kind=None         聚合到时期('period')或时间戳('timestamp'),默认聚合到时间序列的索引类型
convention=None   当重采样时,将低频率转换到高频率所采用的约定('start'或'end')。默认为'end'
#####
#------1.降采样
#在用resample对数据进行降采样时,需要考虑两样东西1.各区间哪边是闭合的 2.如何标记各个聚合面元,用区间的开头还是末尾
rng=pd.date_range('1/1/2000',periods=12,freq='T')
ts=Series(np.arange(12),index=rng)
ts
#通过求和的方式将这些数据聚合到'5分钟'块中
ts.resample('5min',how='sum')


ts.resample('5min',how='sum',closed='right')
ts.resample('5min',how='sum',closed='left')


ts.resample('5min',how='sum',closed='left',label='left')
#对结果索引做一些位移
ts.resample('5min',how='sum',loffset='-1s')
#------2.OHLC重采样
ts.resample('5min',how='ohlc')


#------3.通过groupby进行重采样
rng=pd.date_range('1/1/2000',periods=100,freq='D')
ts=Series(np.arange(100),index=rng)
ts.groupby(lambda x:x.month).mean()
ts.groupby(lambda x:x.weekday).mean()


#------4.升采样和插值
frame=DataFrame(np.random.randn(2,4),index=pd.date_range('1/1/2000',periods=2,freq='W-WED'),
columns=['Colorado','Texas','New York','Ohio']
)
frame
df_daily=frame.resample('D')
df_daily
#填充值
frame.resample('D',fill_method='ffill')
#只填充指定的时期值
frame.resample('D',fill_method='ffill',limit=2)


frame.resample('W-THU',fill_method='ffill')


#------5.通过时期进行重采样
frame=DataFrame(np.random.randn(24,4),index=pd.period_range('1-2000','12-2001',freq='M'),columns=['Colorado','Texas','New York','Ohio'])


annual_frame=frame.resample('A-DEC',how='mean')
annual_frame


#Q-DEC:季度型(每年以12月结束)
annual_frame.resample('Q-DEC',fill_method='ffill')  ???


annual_frame.resample('Q-DEC',fill_method='ffill',convention='start')   ???


annual_frame.resample('Q-MAR',fill_method='ffill')


-----------------------------------------------------------------------------------------
-----(七)、时间序列绘图
cd L:\czz
close_px_all=pd.read_csv(r'ch09\stock_px.csv',parse_dates=True,index_col=0)
close_px=close_px_all[['AAPL','MSFT','XOM']]
close_px=close_px.resample('B',fill_method='ffill')
close_px
#绘图
close_px['AAPL'].plot()
#只绘制2009年的数据
close_px.ix['2009'].plot()
#苹果公司在2011年1月到3月间的每日股价
close_px['AAPL'].ix['01-2011':'03-2011'].plot()
#季度
appl_q=close_px['AAPL'].resample('Q-DEC',fill_method='ffill')
appl_q.ix['2009':].plot()


-----------------------------------------------------------------------------------------
-----(八)、移动窗口函数
close_px.AAPL.plot()
pd.rolling_mean(close_px.AAPL,250).plot() ??


appl_std250=pd.rolling_std(close_px.AAPL,250,min_periods=10) ??
appl_std250[5:12]
appl_std250.plot()


#通过rolling_mean定义扩展平均
expanding_mean=lambda x:rolling_mean(x,len(x),min_periods=1)
pd.rolling_mean(close_px,60).plot(logy=True)


######移动窗口和指数加权函数
rolling_count             返回各窗口非NA观测值的数量
rolling_sum               移动窗口的和
rolling_mean              移动窗口的平均值
rolling_median            移动窗口的中位数
rolling_var,rolling_std   移动窗口的方差和标准差.分母为n-1
rolling_skew,rolling_kurt 移动窗口的偏度(三阶矩)和峰度(四阶矩)
rolling_min,rolling_max   移动窗口的最小值和最大值
rolling_quantile          移动窗口指定百分位数/样本分位数位置的值
rolling_corr,rolling_cov  移动窗口的相关系数和协方差
rolling_apply             对移动窗口应用普通数组函数
ewma                      指数加权移动平均
ewmvar,ewmstd             指数加权移动方差和标准差
ewmcorr,ewmcov            指数加权移动相关系数和协方差
######
#------1.指数加权函数
#简单移动平均和指数加权移动平均
fig,axes=plt.subplots(nrows=2,ncols=1,sharex=True,sharey=True,figsize=(12,7))
aapl_px=close_px.AAPL['2005':'2009']
ma60=pd.rolling_mean(aapl_px,60,min_periods=50)
ewma60=pd.ewma(aapl_px,span=60)


aapl_px.plot(style='k--',ax=axes[0])
ma60.plot(style='k--',ax=axes[0])
aapl_px.plot(style='k--',ax=axes[1])
ewma60.plot(style='k--',ax=axes[1])
axes[0].set_title('Simple MA')
axes[1].set_title('Exponentially-weighted MA')


#-----2.二元移动窗口函数
spx_px=close_px_all['SPX']
spx_rets=spx_px/spx_px.shift(1)-1
returns=close_px.pct_change()
corr=pd.rolling_corr(returns.AAPL,spx_rets,125,min_periods=100)
corr.plot()# AAPL六个月的回报与标准普尔500指数的相关系数


corr=pd.rolling_corr(returns,spx_rets,125,min_periods=100)
corr.plot()#3只股票6个月的回报与标准普尔500指数的相关系数


#-----3.用户定义的移动窗口函数
#AAPL 2%回报率的百分等级(一年窗口期)
from scipy.stats import percentileofscore
score_at_2percent=lambda x:percentileofscore(x,0.02)
result=pd.rolling_apply(returns.AAPL,250,score_at_2percent)
result.plot()


-----------------------------------------------------------------------------------------
-----(九)、性能和内存使用方面的注意事项
rng=pd.date_range('1/1/2000',periods=10000000,freq='10ms')
ts=Series(np.random.randn(len(rng)),index=rng)
ts


ts.resample('15min',how='ohlc')


%timeit ts.resample('15min',how='ohlc')




rng=pd.date_range('1/1/2000',periods=10000000,freq='1s')
ts=Series(np.random.randn(len(rng)),index=rng)
%timeit ts.resample('15s',how='ohlc')







0 0
原创粉丝点击