对于一个学校项目,我预测了与气候变化相关的推特情绪和推特数量的"绿色"ETF价格走势。
我的预测滞后1,所以周一的预测是用周日的数据做出的。周日的数据包括周日的推特数据(成交量和情绪(和与周五交易数据相等的市场数据,因为周末没有交易。然而,为了准确预测,我需要推特周日的数据和周五的交易数据。
我的问题是:如何在最后一个可用交易日获得非交易日的推特数据(交易量和情绪(?这样我就可以删除周末/假期的条目了。
因此,我的新手想法是:我需要一个公式,在df[‘adjusted close’]列中查找NaN。如果下一个值是NaN:查看下一个数值:如果下一值不是NaN:选择与该日期的NaN相对应的"情绪"值。并使用它来替换与NaN 之前的日期相对应的"情绪"中的值
import datetime
import pandas as pd
date = pd.date_range(start="2021-01-01",end="2021-01-20")
df = pd.DataFrame({'date': date,
'tweet_volume': range(20),
'sentiment': range(20),
'adjusted close': [0,'NaN',2,3,4,5,6,7,'NaN','NaN',10,11,12,13,'NaN','NaN','NaN',17,18,19]},
columns = ['date', 'tweet_volume', 'sentiment', 'adjusted close'])
df = df.set_index('date')
gives:
tweet_volume sentiment adjusted close
date
2021-01-01 0 0 0
2021-01-02 1 1 NaN
2021-01-03 2 2 2
2021-01-04 3 3 3
2021-01-05 4 4 4
2021-01-06 5 5 5
2021-01-07 6 6 6
2021-01-08 7 7 7
2021-01-09 8 8 NaN
2021-01-10 9 9 NaN
2021-01-11 10 10 10
2021-01-12 11 11 11
2021-01-13 12 12 12
2021-01-14 13 13 13
2021-01-15 14 14 NaN
2021-01-16 15 15 NaN
2021-01-17 16 16 NaN
2021-01-18 17 17 17
2021-01-19 18 18 18
2021-01-20 19 19 19
and i want:
tweet_volume sentiment adjusted close
date
2021-01-01 *1* *1* 0
2021-01-02 1 1 NaN
2021-01-03 2 2 2
2021-01-04 3 3 3
2021-01-05 4 4 4
2021-01-06 5 5 5
2021-01-07 6 6 6
2021-01-08 *9* *9* 7
2021-01-09 8 8 NaN
2021-01-10 9 9 NaN
2021-01-11 10 10 10
2021-01-12 11 11 11
2021-01-13 12 12 12
2021-01-14 *16* *16* 13
2021-01-15 14 14 NaN
2021-01-16 15 15 NaN
2021-01-17 16 16 NaN
2021-01-18 17 17 17
2021-01-19 18 18 18
2021-01-20 19 19 19
So I can then drop the rows with NaN's
这是有效的:
date = pd.date_range(start="2021-01-01",end="2021-01-20")
df = pd.DataFrame({'date': date,
'tweet_volume': range(20),
'sentiment': range(20),
'adjusted close': [0,'NaN',2,3,4,5,6,7,'NaN','NaN',10,11,12,13,'NaN','NaN','NaN',17,18,19]},
columns = ['date', 'tweet_volume', 'sentiment', 'adjusted close'])
df = df.replace('NaN', np.nan)
df = df.set_index('date')
df[['tweet_volume','sentiment']] = df.groupby((df['adjusted close'].diff(0).notnull()).astype('int').cumsum()).transform('last')[['tweet_volume','sentiment']]
df = df.dropna()
print(df)
输出:
tweet_volume sentiment adjusted close
date
2021-01-01 1 1 0.0
2021-01-03 2 2 2.0
2021-01-04 3 3 3.0
2021-01-05 4 4 4.0
2021-01-06 5 5 5.0
2021-01-07 6 6 6.0
2021-01-08 9 9 7.0
2021-01-11 10 10 10.0
2021-01-12 11 11 11.0
2021-01-13 12 12 12.0
2021-01-14 16 16 13.0
2021-01-18 17 17 17.0
2021-01-19 18 18 18.0
2021-01-20 19 19 19.0