从两个不完整的、大小不同的数据帧创建日期数据帧
Creating a dataframe on Date from two incomplete, not same size dataframes
我正在尝试将包含日期、平均情绪分数(来自 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.
将 df
的索引设置为 Date
并在 Adj Close
列上使用 DataFrame.asfreq
to reindex the dataframe on daily frequency, then using DataFrame.merge
left
merge it with ts
on column Date
, finally use Series.ffill
:
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
要在公共列上合并两个 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
这是一个常见的操作,称为 left join,这就是为什么您必须指定 how='left'
.
左联接将保留第一个 table 中的所有行,而不管第二个 table 中是否有匹配的行。最终结果将保留第一个 table 的所有行,但会忽略第二个 table 中不匹配的行。运作方式如下:
您可以使用 pd.date_range
with df.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
我正在尝试将包含日期、平均情绪分数(来自 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.
将 df
的索引设置为 Date
并在 Adj Close
列上使用 DataFrame.asfreq
to reindex the dataframe on daily frequency, then using DataFrame.merge
left
merge it with ts
on column Date
, finally use Series.ffill
:
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
要在公共列上合并两个 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
这是一个常见的操作,称为 left join,这就是为什么您必须指定 how='left'
.
左联接将保留第一个 table 中的所有行,而不管第二个 table 中是否有匹配的行。最终结果将保留第一个 table 的所有行,但会忽略第二个 table 中不匹配的行。运作方式如下:
您可以使用 pd.date_range
with df.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