【问题标题】:Creating a dataframe on Date from two incomplete, not same size dataframes从两个不完整、大小不同的数据帧中创建日期数据帧
【发布时间】:2020-07-23 16:54:25
【问题描述】:

我正在尝试将包含日期、平均情绪得分(来自 Twitter)和收盘价的大数据框放在一起。

这是我目前所拥有的。

#imports
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import re
import urllib3
import requests
import datetime 

#mydates dataframe that just has the dates from my desired range. Shape is 2008 rows x 1 column
date1='2014-01-01'
date2='2019-07-01'
mydates =pd.date_range(date1,date2).tolist()
newdf =pd.DataFrame({'Date':mydates})

#df with the average daily sentiment scores. Large dataset with 500 rows.
#This currently skips dates that didn't have tweets.I want to include those dates but have sentiment equal 0.
Date        Score
2014-01-13  0.01
2014-01-14  0.035
2014-01-15  0.453
2014-01-20  0.06474

#ts dataframe of dates and stock prices. Shape is 1381 rows x 1 column
Date         Adj Close
2014-01-13  44.8
2014-01-14  45.3
2014-01-15  45.8
2014-01-16  46.5
2014-01-17  46.5
2014-01-21  46.7

期望的输出

Date        Score   Close Price
2014-01-13  0.01     44.8
2014-01-14  0.035    45.3
2014-01-15  0.453    45.8
2014-01-16  0.0      46.5
2014-01-17  0.0      46.5
2014-01-18  0.0      46.5
2014-01-19  0.0      46.5
2014-01-20  0.06474  46.5

我的计划是将此数据集保存为 csv。

我遇到的问题: Df 和 ts 的大小不同。我需要通过 ts 使所有周末收盘价与周五相同。我怎么做? 不知道如何编写一个循环,可以将一个数据帧中日期的分数分配给另一个数据帧中的列。

我使用 pandas-3。

【问题讨论】:

  • 你要做的第一件事是merge这两个数据框上的日期值。在网站上搜索“按日期合并数据框”,您会看到很多示例。首先使用 df.info() 检查您的数据框,以确保 dtypes 都是“日期时间”对象以启用合并。使用合并的几个选项来填充缺失值,您应该将数据框与更完整的日期集“合并”。

标签: python-3.x pandas dataframe sentiment-analysis stock


【解决方案1】:

df 的索引设置为Date 并使用DataFrame.asfreq 重新索引数据帧的每日频率,然后使用DataFrame.merge left 将其与ts 合并到列Date,最后使用@ 987654323@ 列Adj Close

df1 = (
    df.set_index('Date').
    asfreq('D', fill_value=0).reset_index().merge(ts, on='Date', how='left')
)
df1['Adj Close'] = df1['Adj Close'].ffill()

结果:

print(df1)
        Date    Score  Adj Close
0 2014-01-13  0.01000       44.8
1 2014-01-14  0.03500       45.3
2 2014-01-15  0.45300       45.8
3 2014-01-16  0.00000       46.5
4 2014-01-17  0.00000       46.5
5 2014-01-18  0.00000       46.5
6 2014-01-19  0.00000       46.5
7 2014-01-20  0.06474       46.5

【讨论】:

  • 感谢您的回答。一个复杂的问题是我使用了 df.groupby(df.Date),所以当我尝试将 df 的索引设置为 Date 时,我收到一条错误消息,指出 Date 不在列中。
  • @NeedyTween 您能否在问题中包含df.groupby(df.Date) 的输出,以便我看到问题?
  • df.index 返回:Float64Index([], dtype='float64', name='Date') 这让我很困惑,因为平均情绪数据类型是浮点数
  • 让我们继续讨论HERE?
【解决方案2】:

要将两个 pandas 数据框合并到一个公共列上,请使用 merge 函数。要指定您希望在 ts 中保留日期行,而不是在 df 中,请使用 how='left' 选项,如下所示:

ts.merge(df, on='Date', how='left', sort=False)

# output:
# Date       Close Score
# 2014-01-13 44.8 0.010
# 2014-01-14 45.3 0.035
# 2014-01-15 45.8 0.453
# 2014-01-16 46.5 NaN
# 2014-01-17 46.5 NaN
# 2014-01-21 46.7 NaN

您还可以使用 .fillna(0) 方法将 NaN 值替换为 0,就像您想要的输出一样。

ts.merge(df, on='Date', how='left', sort=False).fillna(0)

# output:
# Date       Close Score
# 2014-01-13 44.8 0.010
# 2014-01-14 45.3 0.035
# 2014-01-15 45.8 0.453
# 2014-01-16 46.5 0
# 2014-01-17 46.5 0
# 2014-01-21 46.7 0

这是一种称为左连接的常见操作,这就是为什么您必须指定how='left'

左连接将保留第一个表中的所有行,而不管第二个表中是否有匹配的行。最终结果将保留第一个表的所有行,但会省略第二个表中不匹配的行。以下是它的工作原理:

【讨论】:

    【解决方案3】:

    您可以将pd.date_rangedf.reindex 一起使用:

    df['Date'] = pd.to_datetime(df['Date'])
    r = pd.date_range(start=df.Date.min(), end=df.Date.max())
    
    df = df.set_index('Date').reindex(r).fillna(0.0).rename_axis('Date').reset_index()
    
    ts['Date'] = pd.to_datetime(ts['Date'])
    r1 = pd.date_range(start=ts.Date.min(), end=ts.Date.max()) 
    
    ts = ts.set_index('Date').reindex(r1).ffill().rename_axis('Date').reset_index()
    
    result = df.merge(ts, on='Date')
    
    print(result)
    

    输出:

            Date    Score  Adj_Close
    0 2014-01-13  0.01000       44.8
    1 2014-01-14  0.03500       45.3
    2 2014-01-15  0.45300       45.8
    3 2014-01-16  0.00000       46.5
    4 2014-01-17  0.00000       46.5
    5 2014-01-18  0.00000       46.5
    6 2014-01-19  0.00000       46.5
    7 2014-01-20  0.06474       46.5
    

    【讨论】:

      猜你喜欢
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      相关资源
      最近更新 更多