【问题标题】:Time series analysis For loop Python时间序列分析For循环Python
【发布时间】:2021-01-31 21:47:07
【问题描述】:

我正在尝试自动化预测 (1) 每个州的总需求和 (2) 每个州每个客户的需求的过程。应用的统计方法是移动平均线。预测时间提前 1 个月。数据是从具有 5 列的 Excel 表导入的:客户、状态、产品、数量、订单日期。 excel文件可以通过链接https://drive.google.com/file/d/1JlIqWl8bfyJ3Io01Zx088GIAC6rRuCa8/view?usp=sharing找到

一个客户可以与不同的州相关联,例如,Aaron Bergman 可以从华盛顿、德克萨斯和俄克拉荷马的商店购买椅子、艺术品、电话。其他客户具有相同的购买行为。对于 (1) 我尝试使用 For 循环,但它不起作用。错误是 Order_Date 不在索引中

df = pd.read_excel("Sales_data.xlsx")
State_Name = df.State.unique()
Customer_Name = df.Customer.unique()

for x in State_Name:
   df = df[['Order_Date', 'Quantity']]
   df['Order_Date'].min(), df['Order_Date'].max()
   df.isnull().sum()

   df.Timestamp = pd.to_datetime(df.Order_Date, format= '%D-%M-%Y %H:%m')
   df.index = df.Timestamp
   df = df.resample('MS').sum()

   rolling_mean = df.Quantity.rolling(window=10).mean()


【问题讨论】:

  • 请修正缩进;这是 Python 中对与错的问题。您似乎没有在循环中的任何地方使用x。这是故意的吗?
  • 另外,您一直在尝试更新df。所以在第二遍时,df 与 csv 数据不同。

标签: python pandas time-series prediction forecasting


【解决方案1】:

考虑将for 循环行转换为定义的方法,并使用groupby 调用它以返回时间序列。另外,请注意pandas 中的最佳实践:

def rollmean_func(df):
   # BETTER COLUMN SUBSET
   df = df.reindex(['Order_Date', 'Quantity'], axis='columns')  

   # BETTER COLUMN ASSIGNMENT
   df['Timestamp'] = pd.to_datetime(df['Order_Date'], format= '%D-%M-%Y %H:%m')  
   df.index = df['Timestamp']

   df = df.resample('MS').sum()
   rolling_mean = df['Quantity'].rolling(window=10).mean()
  
   return rolling_mean

州级

state_rollmeans = df.groupby(['State']).apply(rollmean_func)
state_rollmeans
# State      Timestamp 
# Alabama    2014-04-01     NaN
#            2014-05-01     NaN
#            2014-06-01     NaN
#            2014-07-01     NaN
#            2014-08-01     NaN
# ...
# Wisconsin  2017-09-01    10.6
#            2017-10-01     7.5
#            2017-11-01     9.7
#            2017-12-01    12.3
# Wyoming    2016-11-01     NaN
# Name: Quantity, Length: 2070, dtype: float64

客户级别

customer_rollmeans = df.groupby(['Customer_Name']).apply(rollmean_func)
customer_rollmeans
# Customer_Name       Timestamp 
# Aaron Bergman       2014-02-01    NaN
#                     2014-03-01    NaN
#                     2014-04-01    NaN
#                     2014-05-01    NaN
#                     2014-06-01    NaN
# ...
# Zuschuss Donatelli  2017-02-01    1.2
#                     2017-03-01    0.7
#                     2017-04-01    0.7
#                     2017-05-01    0.0
#                     2017-06-01    0.3
# Name: Quantity, Length: 26818, dtype: float64

【讨论】:

  • 如果window 有不同的值for x in range (2,10),那么rolling_mean = df['Quantity'].rolling(window=x).mean()。它应该给出 8 个不同的结果,但是,state_rollmeans = df.groupby(['State']).apply(rollmean_func) 将给出 8 个结果的平均值。有解决办法吗?
  • 客户层面,以Aaron Bergman为例,对应的州包括Washington、Texas和Oklahoma。所以Aaron Bergman这个名字应该有3个预测,而不是这3个州的总需求亚伦伯格曼
  • 所以您需要状态和客户分组?如果是这样,请将两者都添加到groupby。是的,这个解决方案一次返回一个窗口。您需要在函数中调整窗口并为每个窗口调用groupby().apply()。由于窗口大小不同,合并会产生许多 NaN。
  • 顺便说一句,这个解决方案只是用现有代码解决了您的错误。您没有发布想要的结果或结构。我假设没有其他方法只是展示了一种保存迭代结果并避免for 循环的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
  • 2012-10-08
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
相关资源
最近更新 更多