熊猫:从返回数据

时间:2016-03-22 12:04:24

标签: python numpy pandas

我有关于Pandas DataFrame中变量的对数返回的数据。我想将这些返回值转换为从100(或任意数字)开始的索引时间序列。这种操作非常常见,例如在创建通胀指数时或比较两个不同幅度的系列时:

Pic 1: Example of indexing two series

因此,例如2000年1月1日的第一个值设置为100,而2000年1月2日的下一个值等于100 * exp( return_2000_01_02 ),依此类推。示例如下:

Table 1: Example of returns and an indexed time series

我知道我可以使用 .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中具有特定含义,我不会在此之后。

2 个答案:

答案 0 :(得分:4)

您可以使用矢量化方法而不是循环/迭代:

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

答案 1 :(得分:-2)

@Crebit

我已经创建了一个框架来快速索引熊猫的价格!

在我的 github 上查看下面的文件: https://github.com/meinerst/JupyterWorkflow

它展示了如何从 yahoo Finance 中提取价格,或者展示如何使用现有的数据框。

我无法在此处显示数据框表。如果您想查看它们,请访问 github 链接。

索引金融时间序列(熊猫)

此示例使用从雅虎财经中提取的数据。如果您有来自其他地方的数据框,请转到第 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”。您可以随意选择。

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