我正在编写一个程序,其中包括从 Pandas DataFrame 中选择行的子集。 DataFrame 对新闻标题和日期有情感。 它有一行“日期”,根据新闻标题定义日期,这
这是我感兴趣的代码的一部分。
def simulation_trading(data, period_days = 1):
dates_unique = data["Date"].unique()
previous = 0
for index in range(period_days - 1, len(data), period_days):
dates_unique_chunk = dates_unique[previous:index+1]
if not list(dates_unique_chunk):
continue
after_start_date = data["Date"] >= dates_unique_chunk[0]
before_end_date = data["Date"] <= dates_unique_chunk[-1]
between_two_dates = after_start_date & before_end_date
data_chunk = data.loc[between_two_dates]
print(dates_unique_chunk[-1], dates_unique_chunk[0])
print(data_chunk["Date"])
sentiments_chunk = data_chunk["Labels"]
break
我首先得到一个唯一日期的列表。然后我得到特定时期的一系列日期。
dates_unique = data["Date"].unique()
dates_unique_chunk = dates_unique[previous:index+1]
这里展示了一部分代码,我使用一种方法来制作掩码并将其应用于感兴趣的数据帧。
我已经尝试了我在这里找到的所有方法:使用 . Between() 函数、isin() 和dates_range() 等。它们都不起作用,所以这并不是不起作用的方法。它不返回指定的范围。 生成下一个示例的代码:
print(simulation_trading(sentiments_data, 2))
[在顶行中,我根据索引 [-1] 和 [0] 回显了日期,这里是我从打印 data_chunk["Date]]]()
如果我应用的范围的第一个元素等于第二个元素,问题就会消失。 生成下一个示例的代码:
print(simulation_trading(sentiments_data, 1))
从您的描述和代码片段来看,您似乎正在尝试根据日期范围将数据分区为块,其中每个块涵盖由 period_days 定义的时间段。您的方法涉及过滤 DataFrame 以仅包含属于每个日期范围内的行。
当尝试使用布尔掩码过滤数据以选择两个日期之间的行时,会出现您的问题,但您发现它仅在开始日期和结束日期相同时才按预期工作。这是一个常见问题,通常可以通过确保正确定义日期范围并且 DataFrame 的“日期”列采用正确的格式(即作为日期时间对象)来解决。
这是函数的修订方法,可确保正确处理日期:
将“日期”列转换为日期时间(如果尚未转换)。这样可以保证日期对象之间进行比较,更加可靠。
按“日期”对数据进行排序,以确保其按时间顺序排列。这对于时间序列数据至关重要。
使用pd.to_datetime转换dates_unique,保证所有日期操作一致。
import pandas as pd
def simulation_trading(data, period_days=1):
data['Date'] = pd.to_datetime(data['Date'])
data.sort_values('Date', inplace=True)
dates_unique = pd.to_datetime(data['Date'].unique())
dates_unique.sort()
previous = 0
for index in range(period_days - 1, len(dates_unique), period_days):
dates_unique_chunk = dates_unique[previous:index+1]
if not len(dates_unique_chunk):
continue
after_start_date = data['Date'] >= dates_unique_chunk[0]
before_end_date = data['Date'] <= dates_unique_chunk[-1]
between_two_dates = after_start_date & before_end_date
data_chunk = data.loc[between_two_dates]
print(dates_unique_chunk[-1], dates_unique_chunk[0])
print(data_chunk['Date'])
sentiments_chunk = data_chunk['Labels']
break
此版本的函数应正确过滤您的 DataFrame,以仅包含基于 period_days 的每个计算日期范围内的行。请记住根据您打算如何在循环中处理或输出块来删除或调整break语句。