pandas 将日数据转换为会计年度数据

yhxst69z  于 2023-05-05  发布在  其他
关注(0)|答案(1)|浏览(170)

我正在尝试训练一个机器学习模型来预测尼泊尔每个地区的农作物产量。输入特征将是各种天气相关数据,诸如温度、风速等。并且基于这些数据来预测作物产量。为了训练模型,我找到了以下数据:

我最终想要的是一个数据集,我可以用它来训练一个机器学习模型,以气候数据为特征,以作物产量为输出。数据集应包含以下列:
年份、地区、温度、最大温度、最小温度...其他气候数据...产量。
在最后一个数据集中,我想要每个地区每年的气候数据和产量。
为了实现这一点,我需要将作物数据从财政年度转换为正常年度,或者将气候数据从正常年度转换为财政年度。
我假设不可能将作物数据从财政年度转换为正常年度,因为我只有作物产量的年度数据,为了将其转换为正常年度数据,我们需要将财政年度的作物产量区分为7月16日之前的产量和7月15日之后的产量。如果我错了,请纠正我。
因此,下一个选择是将每日气候数据转换为财政年度数据。如何将每日气候数据转换为财政年度数据。请注意,每日气候数据中有不同类型的特征需要转换为财政年度数据。例如,有两个特征,即一天的平均温度和一天的最高温度。要把每天的平均温度转换成年平均温度,我们必须求出所有日平均温度。但是要将日最高气温转换为年最高气温,我们必须找到一年中所有日最高气温的最大值。再说一次,我可能错了。请随时纠正我。
所以,现在,我想知道的是,我如何将每日气候数据转换为财政年度气候数据?
此外,如果你认为这种方法或数据集不适合这种项目,那么也请告诉我,因为这是我第一次自己做机器学习项目。
此外,我很可能不会使用气候数据集中的所有特征来训练机器学习模型。但是如果可能的话,转换所有的气候数据仍然是有益的,这样我就可以在这个项目的后期阶段试验不同的功能。

omqzjyyz

omqzjyyz1#

计算每个财政年度(7月16日至次年7月15日)和地区每列的最小值、最大值和平均值。* (然后您可以选择要使用的列。)*

df = pd.read_csv('climate_data.csv').drop(columns=['LON', 'LAT'])
df.DATE = pd.to_datetime(df.DATE)
df['year'] = df.DATE.dt.year
df.loc[(df.DATE.dt.month > 7) | ((df.DATE.dt.month == 7) & (df.DATE.dt.day > 15)), 'year'] += 1
df.year = df.DATE.dt.year.astype(str) + '/' + (df.DATE.dt.year + 1).astype(str)
df = (
    df.drop(columns='DATE')
    .set_index(['year', 'DISTRICT'])
    .groupby(['year', 'DISTRICT'])
    .agg(['mean', 'min', 'max'])
)
df.columns = ['_'.join(col).strip() for col in df.columns.values]  # flatten multicolumns

加载产量数据并将其格式化以匹配气候数据:

df2 = pd.read_csv('NepalAgriStats_Cereal.csv').drop(columns='DISTRICT_CODE').rename(columns={'DISTRICT_NAME': 'year'}).set_index('year').T
df2['product'] = df2.index.map(get_product)
df2['stats_type'] = df2.index.map(get_stats_type)
df2.index = df2.index.map(get_year)
df2 = (
    df2.reset_index()
    .rename(columns={'index': 'year'})
    # get each district, yearm product and stats_type in seperate rows
    .melt(id_vars=['year', 'product', 'stats_type'], var_name='DISTRICT', value_name='yield')
    # pivot to get stats_type as columns
    .pivot_table(index=['year', 'DISTRICT', 'product'], columns='stats_type', values='yield')
    .reset_index('product')
)
df2.columns = df2.columns.values  # flatten multicolumns

上面的代码使用了以下函数:

def get_product(col):
    return {
        'PD': 'Paddy',
        'WT': 'Wheat',
        'MZ': 'Maize',
        'ML': 'Millet',
        'BL': 'Barley',
        'BW': 'BW'
    }[col.split('_')[0]]

def get_stats_type(col):
    return {
        'P': 'Production',
        'A': 'Area',
        'Y': 'Yield',
    }[col.split('_')[1]]

def get_year(col):
    year = col.split('_')[2][:4]
    return f'{year}/{int(year) + 1}'

最后,将气候数据与产量数据结合起来:

dataset = df.join(df2, how='inner').set_index('product', append=True)
  • 最终数据集包含每个***财政年度***、地区***和 * 产品 * 的目标变量***面积产量***和***产量,以及***气候变量***的***平均值***、最小值***和***最大值

你可能并不需要所有的气候变量,所以只要放弃那些你不想要的。
你也可能只关心***一个特定的产品***。
例如,如果您只对***小麦***感兴趣,您可以通过以下方式删除其他***产品***:

dataset = dataset.loc[pd.IndexSlice[:, :, 'Wheat'], :]

或者你可能只关心***所有产品的总和***。如果是,请在与***气候数据***合并之前添加此行

df2 = df2.groupby(['year', 'DISTRICT']).sum(numeric_only=True)

并删除/注解掉以下内容:

dataset = df.join(df2, how='inner')#.set_index('product', append=True)
  • 如果您正在预测产量,您将需要分离数据集,以便训练集和验证/测试集在时间上不会重叠。
  • 你还需要规范化你的变量。
  • 对于您的预测变量 (来自气候数据),是否需要这将取决于您选择的模型,即对于基于树的模型,您可能不需要它,但这并没有什么坏处。
  • 对于您的目标变量,您需要根据训练集中的数据对每个地区的变量进行归一化。我的意思是,对于每个地区,您计算训练集的平均收益率,并将训练集和验证/测试集上的目标变量除以这个/那些数字。然后,当您使用模型进行推理时,您将输出乘以相同的数字。* (这是一般来说,可能有一些不需要的方法,但这是你通常想要的。

相关问题