Python / Pandas中的数据清理迭代数月组合

时间:2017-10-19 14:36:21

标签: python pandas

我正在做一些数据清理,以便对数据集进行一些机器学习。 基本上我想根据过去12个月预测未来12个月的价值。 我有一个每月价值的数据集(例如下面的例子)。

我想通过迭代到12个月的每个可能组合来训练我的模型。 例如,我想在2014-01至2014-12期间培训他,以填补2015-01至2015-12,并在2014-02至2015-01期间培训他,以填补2015-02至2016-01等。

但我努力填补所有这些可能性。 我在下面显示了我目前在我的代码中的位置以及下面我想要的示例(仅用了6个月而不是12个)。

import pandas as pd
import numpy as np

data = [[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]]
Months=['201401','201402','201403','201404','201405','201406','201407','201408','201409','201410','201411','201412','201501','201502','201503','201504','201505','201506','201507','201508','201509','201510','201511','201512']
df = pd.DataFrame(data,columns=Months)

我无法工作的那部分。

X = np.array([])
Y = np.array([])

for month in Months:
    loc = df.columns.get_loc(month)
    print(month,loc)
    if loc + 11 <= df.shape[1]:
       X = np.append(X,df.iloc[:,loc:loc+5].values,axis=0)
       Y = np.append(Y,df.iloc[:,loc+6:loc+1].values,axis=0)

这是我所期待的(对于前3个迭代)

### RESULTS EXPECTED #### 
X = [[1,2,3,4,5,6],[2,3,4,5,6,7],[3,4,5,6,7,8]] 
Y =  [[7,8,9,10,11,12],[8,9,10,11,12,13],[9,10,11,12,13,14]]

1 个答案:

答案 0 :(得分:1)

要生成日期范围,例如您在解释中描述的日期范围(而不是示例输出中显示的日期范围),您可以像这样使用Pandas功能:

import pandas as pd

months = pd.Series([
'201401','201402','201403','201404','201405','201406',
'201407','201408','201409','201410','201411','201412',
'201501','201502','201503','201504','201505','201506',
'201507','201508','201509','201510','201511','201512'
])

# this function converts strings like "201401"
# to datetime objects, and then uses DateOffset
# and date_range to generate a sequence of months
def date_range(month):
    date = pd.to_datetime(month, format="%Y%m")
    return pd.date_range(date, date + pd.DateOffset(months=11), freq='MS')

# apply function to original Series
# and then apply pd.Series to expand resulting arrays
# into DataFrame columns
month_ranges = months.apply(date_range).apply(pd.Series)

# sample of output:
#            0          1          2          3          4          5   \
# 0  2014-01-01 2014-02-01 2014-03-01 2014-04-01 2014-05-01 2014-06-01   
# 1  2014-02-01 2014-03-01 2014-04-01 2014-05-01 2014-06-01 2014-07-01   
# 2  2014-03-01 2014-04-01 2014-05-01 2014-06-01 2014-07-01 2014-08-01   
# 3  2014-04-01 2014-05-01 2014-06-01 2014-07-01 2014-08-01 2014-09-01