创建特定的 365 天年份来比较数据

问题描述 投票:0回答:1

我的练习看起来应该是一个微不足道的练习,但我似乎无法破解它。我有以下数据框:

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 日开始的累积总和,但不知道如何使用自定义开始日期来完成此操作。我的目标是得到一个看起来像这样的图表:

有什么建议吗?预先感谢!

python pandas time-series plotly line-plot
1个回答
0
投票

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('蒲式耳')

© www.soinside.com 2019 - 2024. All rights reserved.