如何解决将多个时间序列从单个列中分离到每个序列中的单独列中?
我正在Mac OS 10.11.06(el capitan)上使用Python 3。
我有一个.csv数据集,包含约3700个时间序列集(长度不等)。数据当前的格式如下:
当前格式
Trade_date price_usd ticker
0 2016-01-01 434.33000 BTC
1 2016-01-02 433.44000 BTC
2 2016-01-03 430.01000 BTC
3 2016-01-04 433.09000 BTC
4 2016-01-05 431.96000 BTC
... ... ... ...
2347227 2020-10-19 74.13000 BRAIN
2347228 2020-10-20 71.97000 BRAIN
2347229 2020-10-21 76.64000 BRAIN
2347230 2020-10-22 80.90000 BRAIN
2347231 2020-10-19 0.15004 DAOFI
暂时忽略默认的数字索引,请注意,datetime列Trade_date
使得值序列与每个新的股票行情指示器重复。我的目标是对数据进行转换,以使每个报价器名称都成为列标题,在该列标题下,其相应的每日价格会以正确的顺序列出,并带有记录其的日期时间值(即,日期时间索引不会重复,并且代码是行):
目标格式
Trade_date ticker1 ticker2 ... tickerN
day1 t1p1 t2p1 ... tNp1
day2 t1p2 t2p2 ... etc...
.
.
.
dayK
到目前为止,我已经尝试了各种方法,包括使用各种方法进行的实验,例如stack()/ unstack(),groupby()等,以及尝试迭代这些值以将其分配给新DF的自定义函数,在该DF中,我创建了一个结构化的框架,可以将这些值放入其中,但是无济于事(请参阅下面的失败尝试)。
新的空目标数据框,其股票代码为col,Trade_date范围为索引:
BTC ETH XRP MKR LTC USDT BCH XLM EOS BNB ... MTLX INDEX WOA HAUT THRM YFED NMT DOKI BRAIN DAOFI
2016-01-01 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2016-01-02 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2016-01-03 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2016-01-04 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2016-01-05 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
尝试填充以上内容失败...
for element in crypto_df['ticker']:
if element == new_df.column and crypto['Trade_date'] == new_df.index:
df['ticker'] = element
new_df.head()
我的最终目标是使用FBProphet生成多序列时间序列预测,因为它能够在“单个”模型中处理多个时间序列预测。
我刚刚想到的最后一个想法是,可以为每个股票代码创建单独的数据帧,然后沿着日期时间索引重新加入,并在新DF中创建单独的列,但这似乎有点不合时宜。大约(例如,我刚刚对具有股票数据的数千个.csv文件执行了此操作)...但是,如果有解决方案,我仍然想找到一个更直接的解决方案?当然,将来这种情况还会再次发生!
感谢您的任何想法...
解决方法
您可以set_index
和unstack
:
print(df.set_index(["trade_date","ticker"]).unstack("ticker"))
price_usd
ticker BRAIN BTC DAOFI
trade_date
2016-01-01 NaN 434.33 NaN
2016-01-02 NaN 433.44 NaN
2016-01-03 NaN 430.01 NaN
2016-01-04 NaN 433.09 NaN
2016-01-05 NaN 431.96 NaN
2020-10-19 74.13 NaN 0.15004
2020-10-20 71.97 NaN NaN
2020-10-21 76.64 NaN NaN
2020-10-22 80.90 NaN NaN
,
首先使用.groupby(),然后使用.unstack():
import pandas as pd
from io import StringIO
text = """
trade_date price_usd ticker
2016-01-01 434.33000 BTC
2016-01-02 433.44000 BTC
2016-01-02 430.01000 Google
2016-01-03 433.09000 BTC
2016-01-03 431.96000 Google
"""
df = pd.read_csv(StringIO(text),sep='\s+',header=0)
df.groupby(['trade_date','ticker'])['price_usd'].mean().unstack()
结果数据框:
trade_date ticker BTC Google
2016-01-01 434.33 NaN
2016-01-02 433.44 430.01
2016-01-03 433.09 431.96
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。