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 开始]的主要内容,如果未能解决你的问题,请参考以下文章

根据 Pandas 中另一列中的索引从列中获取数据

从多个 OHLCV 数据帧创建单个 pandas 数据帧

在 Python pandas 中,从 1 而不是 0 开始行索引而不创建额外的列

求教pandas的dataframe索引值只有一行,用loc如何不返回series

Pandas之:深入理解Pandas的数据结构

从 Pandas 的索引中检索列的名称