我有关于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中具有特定含义,我不会在此之后。
答案 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