我的练习看起来应该是一个微不足道的练习,但我似乎无法破解它。我有以下数据框:
import pandas as pd
import numpy as np
np.random.seed(5)
size = 1000
d = {'Farmer':np.random.choice( ['Bob','Suyzn','John'], size),
'Commodity': np.random.choice( ['Corn','Wheat','Soy'], size),
'Date':np.random.choice( pd.date_range('1/1/2018','12/12/2022', freq='D'), size),
'Bushels': np.random.randint(20,100, size=(size))
}
df = pd.DataFrame(d)
我用熊猫来观察不同的农民以及他们交付的不同商品的数量。我希望能够查看自定义年份,在其中我可以提供 start_month 和 start_day 来创建一个名为“Interval”的新列,该列根据我选择的内容显示数据。这是适用于此的功能:
def calculate_intervals(df, start_month, start_day):
"""Adds column called Interval to df. It
Args:
df (dataframe): Dataframe to pass that's been filtered to what you want.
start_month (int): Month to start.
start_day (int): Day to start.
Returns:
dataframe: Dataframe with 'Interval' added
"""
# Filter the DataFrame
filtered_df = df
filtered_df['Year'] = filtered_df['Date'].dt.year
# Define the date ranges for each interval
intervals = []
for year in filtered_df['Year'].unique():
start_date = pd.to_datetime(f"{year}-{start_month}-{start_day}")
end_date = pd.to_datetime(f"{year+1}-{start_month}-{start_day}") - pd.DateOffset(days=1)
intervals.append((start_date, end_date))
# Create a function to assign the interval label to each row
def assign_interval(row):
for c, (start_date, end_date) in enumerate(intervals):
if start_date <= row['Date'] <= end_date:
return f"{start_date.date()} - {end_date.date()}"
return None # Return None if the row's date is not within any interval
# Apply the interval assignment function to each row
filtered_df['Interval'] = filtered_df.apply(assign_interval, axis=1)
return filtered_df
calculate_intervals(df, start_month=7, start_day=6)
我的目标是更进一步。我想创建一个图表,它采用 start_month 和 start_day 并将其用作 y 轴上的位置 0。 X 轴将显示接下来的 365 天,一直到结束。在此示例中,x 轴将从 7 月 6 日开始,到次年 7 月 5 日。 Y 轴是从 7 月 6 日到次年 7 月 5 日期间销售的蒲式耳的累计总和。每个自定义年份都将是图表上自己的线。
我已经做了类似的练习来绘制同年 1 月 1 日至 12 月 31 日开始的累积总和,但不知道如何使用自定义开始日期来完成此操作。我的目标是得到一个看起来像这样的图表:
有什么建议吗?预先感谢!
START_DAY、START_MONTH = 23、8 df['_y'] = np.where( df['日期'] < df['Date'].dt.year.apply(lambda y: pd.Timestamp(y, START_MONTH, START_DAY)), df['Date'].dt.year - 1, df['Date'].dt.year)
df['_dt'] = df['日期'] - df['_y'].apply(lambda y: pd.Timestamp(y, START_MONTH, START_DAY)) grouped = df.groupby(['商品', '_y', '_dt'])['Bushels'].sum().groupby(level=[0, 1]).cumsum()
将 matplotlib.pyplot 导入为 plt
f, a = plt.subplots(figsize=(8, 8))
plot_data = grouped.unstack(level=1).reset_index()
.groupby('商品').resample(on='_dt',rule='7D').mean()
.groupby('商品').apply(lambda _d: _d.interpolate(limit_area='内部'))
.loc['玉米']
图数据索引=图数据索引天数
plot_data.plot(ax=a)
a.set_xlabel('自开始以来的天数') a.set_ylabel('蒲式耳')