python數據分析(十五)

# -*- coding: utf-8 -*-

from __future__ import division

from pandas import Series, DataFrame

import pandas as pd

from numpy.random import randn

import numpy as np

pd.options.display.max_rows = 12

np.set_printoptions(precision=4, suppress=True)

import matplotlib.pyplot as plt

plt.rc('figure', figsize=(12, 4))

#

from datetime import datetime

now = datetime.now()

now

now.year, now.month, now.day

delta = datetime(2011, 1, 7) - datetime(2008, 6, 24, 8, 15)

delta

delta.days

delta.seconds

from datetime import timedelta

start = datetime(2011, 1, 7)

start + timedelta(12)

start - 2 * timedelta(12)

#字符串轉日期

stamp = datetime(2011, 1, 3)

str(stamp)

stamp.strftime('%Y-%m-%d')

value = '2011-01-03'

datetime.strptime(value, '%Y-%m-%d')

datestrs = ['7/6/2011', '8/6/2011']

[datetime.strptime(x, '%m/%d/%Y') for x in datestrs]

from dateutil.parser import parse

parse('2011-01-03')

parse('Jan 31, 1997 10:45 PM')

parse('6/12/2011', dayfirst=True)

datestrs

pd.to_datetime(datestrs)

idx = pd.to_datetime(datestrs + [None])

idx

idx[2]

pd.isnull(idx)

#pands中的時間序列

from datetime import datetime

dates = [datetime(2011, 1, 2), datetime(2011, 1, 5), datetime(2011, 1, 7),

datetime(2011, 1, 8), datetime(2011, 1, 10), datetime(2011, 1, 12)]

ts = Series(np.random.randn(6), index=dates)

ts

type(ts)

ts.index

ts + ts[::2]

ts.index.dtype

stamp = ts.index[0]

stamp

#索引、選取與子集構造

stamp = ts.index[2]

ts[stamp]

ts['1/10/2011']

ts['20110110']

longer_ts = Series(np.random.randn(1000),

index=pd.date_range('1/1/2000', periods=1000))

longer_ts

longer_ts['2001']

longer_ts['2001-05']

ts[datetime(2011, 1, 7):]

ts

ts['1/6/2011':'1/11/2011']

ts.truncate(after='1/9/2011')

dates = pd.date_range('1/1/2000', periods=100, freq='W-WED')

long_df = DataFrame(np.random.randn(100, 4),

index=dates,

columns=['Colorado', 'Texas', 'New York', 'Ohio'])

long_df.ix['5-2001']

#

dates = pd.DatetimeIndex(['1/1/2000', '1/2/2000', '1/2/2000', '1/2/2000',

'1/3/2000'])

dup_ts = Series(np.arange(5), index=dates)

dup_ts

dup_ts.index.is_unique

dup_ts['1/3/2000']

dup_ts['1/2/2000']

grouped = dup_ts.groupby(level=0)

grouped.mean()

grouped.count()

#日期范圍、頻率與移動

ts

ts.resample('D').mean()

index = pd.date_range('4/1/2012', '6/1/2012')

index

pd.date_range(start='4/1/2012', periods=20)

pd.date_range(end='6/1/2012', periods=20)

pd.date_range('1/1/2000', '12/1/2000', freq='BM')

pd.date_range('5/2/2012 12:56:31', periods=5)

pd.date_range('5/2/2012 12:56:31', periods=5, normalize=True)

from pandas.tseries.offsets import Hour, Minute

hour = Hour()

hour

four_hours = Hour(4)

four_hours

pd.date_range('1/1/2000', '1/3/2000 23:59', freq='4h')

Hour(2) + Minute(30)

pd.date_range('1/1/2000', periods=10, freq='1h30min')

rng = pd.date_range('1/1/2012', '9/1/2012', freq='WOM-3FRI')

list(rng)

ts = Series(np.random.randn(4),

index=pd.date_range('1/1/2000', periods=4, freq='M'))

ts

ts.shift(2)

ts.shift(-2)

ts / ts.shift(1) - 1

ts.shift(2, freq='M')

ts.shift(3, freq='D')

ts.shift(1, freq='3D')

ts.shift(1, freq='90T')

from pandas.tseries.offsets import Day, MonthEnd

now = datetime(2011, 11, 17)

now + 3 * Day()

now + MonthEnd()

now + MonthEnd(2)

offset = MonthEnd()

offset.rollforward(now)

offset.rollback(now)

ts = Series(np.random.randn(20),

index=pd.date_range('1/15/2000', periods=20, freq='4d'))

ts.groupby(offset.rollforward).mean()

ts.resample('M', how='mean')

##時間序列可視化

close_px_all = pd.read_csv('d:/data/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').ffill()

close_px.info()

close_px['AAPL'].plot()

close_px.ix['2009'].plot()

close_px['AAPL'].ix['01-2011':'03-2011'].plot()

appl_q = close_px['AAPL'].resample('Q-DEC', fill_method='ffill').ffill()

appl_q.ix['2009':].plot()

close_px = close_px.asfreq('B').fillna(method='ffill').ffill()

close_px.AAPL.plot()

pd.rolling_mean(close_px.AAPL, 250).plot()

plt.figure()

appl_std250 = pd.rolling_std(close_px.AAPL, 250, min_periods=10)

appl_std250[5:12]

appl_std250.plot()

expanding_mean = lambda x: rolling_mean(x, len(x), min_periods=1)

pd.rolling_mean(close_px, 60).plot(logy=True)

plt.close('all')

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')

close_px

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()

corr = pd.rolling_corr(returns, spx_rets, 125, min_periods=100)

corr.plot()

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()

####時序案例分析####

#參數初始化

discfile = 'd:/data/arima_data.xls'

forecastnum = 5

#讀取數據,指定日期列為指標,Pandas自動將“日期”列識別為Datetime格式

data = pd.read_excel(discfile, index_col = u'日期')

data = pd.DataFrame(data,dtype=np.float64)

data

#時序圖

plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標簽

plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號

data.plot()

plt.show()

#自相關圖

from statsmodels.graphics.tsaplots import plot_acf

plot_acf(data).show()

#平穩性檢測

from statsmodels.tsa.stattools import adfuller as ADF

print( ADF(data[u'銷量']))

#返回值依次為adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore

#差分后的結果

D_data = data.diff().dropna()

D_data.columns = [u'銷量差分']

D_data.plot() #時序圖

plt.show()

plot_acf(D_data).show() #自相關圖

from statsmodels.graphics.tsaplots import plot_pacf

plot_pacf(D_data).show() #偏自相關圖

ADF(D_data[u'銷量差分'])#平穩性檢測

#白噪聲檢驗

from statsmodels.stats.diagnostic import acorr_ljungbox

acorr_ljungbox(D_data, lags=1) #返回統計量和p值

from statsmodels.tsa.arima_model import ARIMA

#定階

pmax = int(len(D_data)/10) #一般階數不超過length/10

qmax = int(len(D_data)/10) #一般階數不超過length/10

bic_matrix = [] #bic矩陣

for p in range(pmax+1):

tmp = []

for q in range(qmax+1):

try: #存在部分報錯,所以用try來跳過報錯。

tmp.append(ARIMA(data, (p,1,q)).fit().bic)

except:

tmp.append(None)

bic_matrix.append(tmp)

bic_matrix = pd.DataFrame(bic_matrix) #從中可以找出最小值

p,q = bic_matrix.stack().idxmin() #先用stack展平,然后用idxmin找出最小值位置。

print(u'BIC最小的p值和q值為:%s、%s' %(p,q))

model = ARIMA(data, (0,1,1)).fit() #建立ARIMA(0, 1, 1)模型

model.summary() #給出一份模型報告

model.forecast(5) #作為期5天的預測,返回預測結果、標準誤差、置信區間。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容