Pandas:从返回数据创建索引时间序列 [从 100 开始]
Posted
技术标签:
【中文标题】Pandas:从返回数据创建索引时间序列 [从 100 开始]【英文标题】:Pandas: creating an indexed time series [starting from 100] from returns data 【发布时间】:2016-07-09 07:32:02 【问题描述】:我有 Pandas DataFrame 中变量的对数返回数据。我想将这些收益转换为从 100(或任意数字)开始的索引时间序列。这种操作非常常见,例如在创建通货膨胀指数或比较两个不同幅度的序列时:
因此,例如,2000 年 1 月 1 日的第一个值设置为 100,2000 年 1 月 2 日的下一个值等于 100 * exp(return_2000_01_02),依此类推。下面的例子:
我知道我可以使用 .iteritems() 遍历 Pandas DataFrame 中的行,如这个 SO 问题中所述: iterating row by row through a pandas dataframe
我还知道我可以将 DataFrame 转换为 numpy 数组,遍历该数组中的值并将 numpy 数组转换回 Pandas DataFrame。 .as_matrix() 方法在这里解释: http://pandas.pydata.org/pandas-docs/version/0.13.1/generated/pandas.Series.html
更简单的方法是使用 Python 和 numpy 索引运算符 [] 来迭代行,如 Pandas 索引中所述: http://pandas.pydata.org/pandas-docs/stable/indexing.html
问题在于,所有这些解决方案(除了 iteritems)都在 Pandas 的“外部”工作,并且根据我所读到的内容,效率低下。
有没有办法使用纯 Pandas 创建索引时间序列?如果没有,请您提出最有效的方法。找到解决方案非常困难,因为索引和索引在 Pandas 中具有特定的含义,这次我不会。
【问题讨论】:
base 1 问题的解决方案是(1 + df.return).cumprod()
,其中df
是您的数据框
【参考方案1】:
您可以使用矢量化方法而不是循环/迭代:
import pandas as pd
import numpy as np
df = pd.DataFrame('return':np.array([np.nan, 0.01, -0.02, 0.05, 0.07, 0.01, -0.01]))
df['series'] = 100*np.exp(np.nan_to_num(df['return'].cumsum()))
#In [29]: df
#Out[29]:
# return series
#0 NaN 100.000000
#1 0.01 101.005017
#2 -0.02 99.004983
#3 0.05 104.081077
#4 0.07 111.627807
#5 0.01 112.749685
#6 -0.01 111.627807
【讨论】:
谢谢!完美运行。我不得不对其进行一些修改,因为我的数据是从最新到最旧的。它很简单:df["series"] = 100 * np.exp(df[::-1].cumsum())[::-1]。另外,我不需要 np.nan_to_num,因为我之前做过 .dropna()。 太棒了!在 pandas/numpy 中,矢量化方法是可行的方法——如果可能的话。 您知道如何更改代码以使#6 等于 100 并向后工作吗?【参考方案2】:@Crebit
我已经创建了一个框架来快速索引 pandas 中的价格!
在我的 github 上查看文件: https://github.com/meinerst/JupyterWorkflow
它展示了如何从 yahoo Finance 中获取价格,或展示如何使用现有的数据框。
我无法在此处显示数据框表。如果您想查看它们,请点击 github 链接。
为金融时间序列编制索引(熊猫)
此示例使用从 yahoo Finance 中提取的数据。如果您有来自其他地方的数据框,请转到第 2 部分。
第 1 部分(提取数据)
为此,请确保已安装 yfinance 软件包。
#pip install yfinance
import pandas as pd
import numpy as np
import yfinance as yf
import matplotlib.pyplot as plt
import datetime as dt
将雅虎金融代码插入变量“代码”。您可以选择任意数量。
tickers =['TSLA','AAPL','NFLX','MSFT']
选择时间范围。
start=dt.datetime(2019,1,1)
end= dt.datetime.now()
在本例中,选择了“Adj Close”列。
assets=yf.download(tickers,start,end)['Adj Close']
第 2 部分(索引)
要绘制可比较的价格发展图,需要对资产数据框进行索引。为此目的添加了新列。 首先确定索引行。在这种情况下是初始价格。
assets_indexrow=assets[:1]
新的列被添加到原始数据框中,并带有索引的价格发展。
在下方插入所需的索引值。在本例中为 100。
for ticker in tickers:
assets[ticker+'_indexed']=(assets[ticker]/ assets_indexrow[ticker][0])*100
然后删除原始的价格列
assets.drop(columns =tickers, inplace=True)
绘制结果。
plt.figure(figsize=(14, 7))
for c in assets.columns.values:
plt.plot(assets.index, assets[c], lw=3, alpha=0.8,label=c)
plt.legend(loc='upper left', fontsize=12)
plt.ylabel('Value Change')
由于信誉点有限,我无法插入图表,但请参见此处: Indexed Graph
【讨论】:
以上是关于Pandas:从返回数据创建索引时间序列 [从 100 开始]的主要内容,如果未能解决你的问题,请参考以下文章
在 Python pandas 中,从 1 而不是 0 开始行索引而不创建额外的列