创建DatetimeIndex
date_range
daily_index = pd.date_range("2020-02-28", periods=4, freq="D")
weekly_index = pd.date_range("2020-01-01", "2020-01-31", freq="W-SUN")
pd.DataFrame(data=[21, 15, 33, 34],
columns=["visitors"], index=weekly_index)
将数据类型修改为datatime
to_datatime()
msft.loc[:, "Date"] = pd.to_datetime(msft["Date"])
parse_dates 参数
msft = pd.read_csv("csv/MSFT.csv",
index_col="Date", parse_dates=["Date"])
#index_col 表示:date列为索引
#parse_dates 表示: date列包含时间戳
其他数据类型的转换
astype()
msft.loc[:, "Volume"] = msft["Volume"].astype("float")
msft["Volume"].dtype
dtype={"Volume": float}
msft = pd.read_csv("csv/MSFT.csv",dtype={"Volume": float})
访问DatetimeIndex的部分属性
date,year,month,day
访问列时,使用dt属性。df["column_name"].dt.date
msft.index.date
筛选
msft.loc["2019", "Adj Close"]
msft.loc["2019-06":"2020-05", "Adj Close"].plot()
用鼠标在图上画矩形可以缩放,
双击返回默认视图
时区
msft_close = msft.loc[:, ["Adj Close"]].copy()
msft_close.index = msft_close.index + pd.DateOffset(hours=16)
msft_close.head(2)
msft_close = msft_close.tz_localize("America/New_York")
msft_close.head(2)
换为UTC时区
msft_close = msft_close.tz_convert("UTC")
msft_close.loc["2020-01-02", "Adj Close"]
变化率
returns = np.log(msft_close / msft_close.shift(1))
returns = returns.rename(columns={"Adj Close": "returns"})
returns.head()
#shift(), 正数表示上移对应行,负数表示下移对应行
#对数收益率:当前股价与之前股价之比的对数
returns.plot.hist()
#直方图
简单收益率:相对于前一行数据的百分比变化率
pct_change()
simple_rets = msft_close.pct_change()
simple_rets = simple_rets.rename(columns={"Adj Close": "simple rets"})
simple_rets.head()
合并多个csv文件
parts = []
for ticker in ["AAPL", "AMZN", "GOOGL", "MSFT"]:
#usecols只读取date列和adj close列
adj_close = pd.read_csv(f"csv/{ticker}.csv",
index_col="Date", parse_dates=["Date"],
usecols=["Date", "Adj Close"])
adj_close = adj_close.rename(columns={"Adj Close": ticker})
parts.append(adj_close)
adj_close = pd.concat(parts, axis=1)
adj_close
adj_close = adj_close.dropna()
adj_close.info()
使时序从100开始
使第一行的所有数据都为0,其余行按比率发生变化
adj_close_sample = adj_close.loc["2019-06":"2020-05", :]
rebased_prices = adj_close_sample / adj_close_sample.iloc[0, :] * 100
rebased_prices.head(2)
计算相关性
corr()
returns = np.log(adj_close / adj_close.shift(1))
returns.corr()
相关性热点图
fig = px.imshow(returns.corr(),
x=adj_close.columns,
y=adj_close.columns,
color_continuous_scale=list(
reversed(px.colors.sequential.RdBu)),
zmin=-1, zmax=1)
fig.show()
重新采样
向下采样:将时序频率降低;
向上采样:将时序频率提高;
resample()
M 日历月底
BM 经营月底
end_of_month = adj_close.resample("M").last()
end_of_month.head()
sum,mean,ohlc
ohlc,开盘价、最高价、最低价和收盘价
向上采样
end_of_month.resample("D").asfreq().head()
#asfreq 没有转换
nd_of_month.resample("W-FRI").ffill().head()
#ffill 向上填充
滚动窗口,移动平均值
count、sum、median、min、max、std(标准差)和var(方差)
rolling()
msft19 = msft.loc["2019", ["Adj Close"]].copy()
msft19.loc[:, "25day average"] = msft19["Adj Close"].rolling(25).mean()
msft19.plot()