【问题标题】:formatting data for fixed-effect regression (paneldata) in python?python中固定效应回归(面板数据)的格式化数据?
【发布时间】:2019-11-24 22:21:15
【问题描述】:

我有一个大型数据集,需要对其进行时间序列分析。数据目前在excel中,格式如下:

+----+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+
| ID | Q1 09 variable X | Q2 09 variable X | Q3 09 variable X | Q4 09 variable X | Q1 10 variable X | Q2 10 variable X | Q3 10 variable X | Q4 10 variable X | Q1 09 variable Y | Q2 09 variable Y | Q3 09 variable Y | Q4 09 variable Y | Q1 10 variable Y | Q2 10 variable Y | Q3 10 variable Y | Q4 10 variable Y |
+----+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+
|  1 | X                | X                | X                | X                | X                | X                | X                | X                | Y                | Y                | Y                | Y                | Y                | Y                | Y                | Y                |
|  2 | X                | X                | X                | X                | X                | X                | X                | X                | Y                | Y                | Y                | Y                | Y                | Y                | Y                | Y                |
|  3 | X                | X                | X                | X                | X                | X                | X                | X                | Y                | Y                | Y                | Y                | Y                | Y                | Y                | Y                |
|  4 | X                | X                | X                | X                | X                | X                | X                | X                | Y                | Y                | Y                | Y                | Y                | Y                | Y                | Y                |
|  5 | X                | X                | X                | X                | X                | X                | X                | X                | Y                | Y                | Y                | Y                | Y                | Y                | Y                | Y                |
|  6 | X                | X                | X                | X                | X                | X                | X                | X                | Y                | Y                | Y                | Y                | Y                | Y                | Y                | Y                |
|  7 | X                | X                | X                | X                | X                | X                | X                | X                | Y                | Y                | Y                | Y                | Y                | Y                | Y                | Y                |
|  8 | X                | X                | X                | X                | X                | X                | X                | X                | Y                | Y                | Y                | Y                | Y                | Y                | Y                | Y                |
|  9 | X                | X                | X                | X                | X                | X                | X                | X                | Y                | Y                | Y                | Y                | Y                | Y                | Y                | Y                |
+----+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+

上表是一个例子。数据集包含截至 2019 年第一季度的所有季度数据。我需要数据如下所示:

+----+-------+------------+------------+
| ID |   T   | Variable X | Variable Y |
+----+-------+------------+------------+
|  1 | Q1 09 | X          | Y          |
|  1 | Q2 09 | X          | Y          |
|  1 | Q3 09 | X          | Y          |
|  1 | Q4 09 | X          | Y          |
|  1 | Q1 10 | X          | Y          |
|  1 | Q2 10 | X          | Y          |
|  1 | Q3 10 | X          | Y          |
|  1 | Q4 10 | X          | Y          |
|  2 | Q1 09 | X          | Y          |
|  2 | Q2 09 | X          | Y          |
|  2 | Q3 09 | X          | Y          |
|  2 | Q4 09 | X          | Y          |
|  2 | Q1 10 | X          | Y          |
|  2 | Q2 10 | X          | Y          |
|  2 | Q3 10 | X          | Y          |
|  2 | Q4 10 | X          | Y          |
|  3 | Q1 09 | X          | Y          |
|  3 | Q2 09 | X          | Y          |
|  3 | Q3 09 | X          | Y          |
|  3 | Q4 09 | X          | Y          |
|  3 | Q1 10 | X          | Y          |
|  3 | Q2 10 | X          | Y          |
|  3 | Q3 10 | X          | Y          |
|  3 | Q4 10 | X          | Y          |
|  4 | Q1 09 | X          | Y          |
|  4 | Q2 09 | X          | Y          |
|  4 | Q3 09 | X          | Y          |
|  4 | Q4 09 | X          | Y          |
|  4 | Q1 10 | X          | Y          |
|  4 | Q2 10 | X          | Y          |
|  4 | Q3 10 | X          | Y          |
|  4 | Q4 10 | X          | Y          |
|  5 | Q1 09 | X          | Y          |
|  5 | Q2 09 | X          | Y          |
|  5 | Q3 09 | X          | Y          |
|  5 | Q4 09 | X          | Y          |
|  5 | Q1 10 | X          | Y          |
|  5 | Q2 10 | X          | Y          |
|  5 | Q3 10 | X          | Y          |
|  5 | Q4 10 | X          | Y          |
|  6 | Q1 09 | X          | Y          |
|  6 | Q2 09 | X          | Y          |
|  6 | Q3 09 | X          | Y          |
|  6 | Q4 09 | X          | Y          |
|  6 | Q1 10 | X          | Y          |
|  6 | Q2 10 | X          | Y          |
|  6 | Q3 10 | X          | Y          |
|  6 | Q4 10 | X          | Y          |
|  7 | Q1 09 | X          | Y          |
|  7 | Q2 09 | X          | Y          |
|  7 | Q3 09 | X          | Y          |
|  7 | Q4 09 | X          | Y          |
|  7 | Q1 10 | X          | Y          |
|  7 | Q2 10 | X          | Y          |
|  7 | Q3 10 | X          | Y          |
|  7 | Q4 10 | X          | Y          |
|  8 | Q1 09 | X          | Y          |
|  8 | Q2 09 | X          | Y          |
|  8 | Q3 09 | X          | Y          |
|  8 | Q4 09 | X          | Y          |
|  8 | Q1 10 | X          | Y          |
|  8 | Q2 10 | X          | Y          |
|  8 | Q3 10 | X          | Y          |
|  8 | Q4 10 | X          | Y          |
|  9 | Q1 09 | X          | Y          |
|  9 | Q2 09 | X          | Y          |
|  9 | Q3 09 | X          | Y          |
|  9 | Q4 09 | X          | Y          |
|  9 | Q1 10 | X          | Y          |
|  9 | Q2 10 | X          | Y          |
|  9 | Q3 10 | X          | Y          |
|  9 | Q4 10 | X          | Y          |
+----+-------+------------+------------+

数据集非常大,总共有几千个数据点。

我以前就这个问题发过帖子,但我想我没有正确地提出这个问题。我尝试了下面的代码,但它遗漏了 Y 列。

df.columns = [
    df.columns.to_series().groupby(level=0).cumcount().map({0: 'X', 1: 'Y'}),
    df.columns
]

df.stack().rename_axis(['ID', 'T']).reset_index()

【问题讨论】:

  • 旁注:这绝对是pd.wide_to_long 的用例,只是无法使用stubnames 参数。

标签: python pandas time-series panel-data


【解决方案1】:

由所有带有变量的列创建MultiIndex,因此可能由DataFrame.stack 重塑 - 两个T 列连接在一起:

df = df.set_index('ID')
df.columns = df.columns.str.split(n=2, expand=True)
df = df.stack([0,1]).rename_axis(('ID','T','T1')).reset_index()
df['T'] = df['T'] + ' ' + df.pop('T1')
print (df.head(10))
   ID      T variable X variable Y
0   1  Q1 09          X          Y
1   1  Q1 10          X          Y
2   1  Q2 09          X          Y
3   1  Q2 10          X          Y
4   1  Q3 09          X          Y
5   1  Q3 10          X          Y
6   1  Q4 09          X          Y
7   1  Q4 10          X          Y
8   2  Q1 09          X          Y
9   2  Q1 10          X          Y

或者如果可能的话,通过前 5 个值和其他列值创建 MultiIndex

df = df.set_index('ID')
df.columns = pd.MultiIndex.from_tuples(zip(df.columns.str[:5], df.columns.str[5:]))
df = df.stack(0).rename_axis(('ID','T')).reset_index()

如果顺序很重要,请创建具有有序 categorical 和最后排序值的列:

df = df.set_index('ID')
c = df.columns.str[:5]
df.columns = pd.MultiIndex.from_tuples(zip(c, df.columns.str[5:]))
df1 = df.stack(0).rename_axis(('ID','T')).reset_index()
df1['T'] = pd.CategoricalIndex(df1['T'], ordered=True, categories=c.unique())
df1 = df1.sort_values(['ID','T'])
print (df1.head(10))
    ID      T  variable X  variable Y
0    1  Q1 09           X           Y
2    1  Q2 09           X           Y
4    1  Q3 09           X           Y
6    1  Q4 09           X           Y
1    1  Q1 10           X           Y
3    1  Q2 10           X           Y
5    1  Q3 10           X           Y
7    1  Q4 10           X           Y
8    2  Q1 09           X           Y
10   2  Q2 09           X           Y

【讨论】:

    【解决方案2】:

    我们可以使用 df.filter 按变量 (X, Y) 拆分您的数据框。然后我们使用.melt 将您的列融合为行。最后我们用pd.concat将分离的数据再次连接在一起。

    最后一行是清理T 列,方法是删除所有具有格式的内容: variable X

    X = df[['ID']].join(df.filter(regex='X$')).melt(id_vars='ID', var_name='T', value_name='Variable X')
    Y = df[['ID']].join(df.filter(regex='Y$')).melt(id_vars='ID', var_name='T', value_name='Variable Y')
    
    df = pd.concat([X, Y[['Variable Y']]], axis=1).sort_values(['ID', 'T']).reset_index(drop=True)
    
    df['T'] = df['T'].str.replace('\svariable\s[A-Za-z]', '')
    

    输出

        ID      T Variable X Variable Y
    0    1  Q1 09          X          Y
    1    1  Q1 10          X          Y
    2    1  Q2 09          X          Y
    3    1  Q2 10          X          Y
    4    1  Q3 09          X          Y
    5    1  Q3 10          X          Y
    6    1  Q4 09          X          Y
    7    1  Q4 10          X          Y
    8    2  Q1 09          X          Y
    9    2  Q1 10          X          Y
    10   2  Q2 09          X          Y
    11   2  Q2 10          X          Y
    12   2  Q3 09          X          Y
    13   2  Q3 10          X          Y
    14   2  Q4 09          X          Y
    15   2  Q4 10          X          Y
    16   3  Q1 09          X          Y
    17   3  Q1 10          X          Y
    18   3  Q2 09          X          Y
    19   3  Q2 10          X          Y
    20   3  Q3 09          X          Y
    21   3  Q3 10          X          Y
    22   3  Q4 09          X          Y
    23   3  Q4 10          X          Y
    24   4  Q1 09          X          Y
    25   4  Q1 10          X          Y
    26   4  Q2 09          X          Y
    27   4  Q2 10          X          Y
    28   4  Q3 09          X          Y
    29   4  Q3 10          X          Y
    ..  ..    ...        ...        ...
    42   6  Q2 09          X          Y
    43   6  Q2 10          X          Y
    44   6  Q3 09          X          Y
    45   6  Q3 10          X          Y
    46   6  Q4 09          X          Y
    47   6  Q4 10          X          Y
    48   7  Q1 09          X          Y
    49   7  Q1 10          X          Y
    50   7  Q2 09          X          Y
    51   7  Q2 10          X          Y
    52   7  Q3 09          X          Y
    53   7  Q3 10          X          Y
    54   7  Q4 09          X          Y
    55   7  Q4 10          X          Y
    56   8  Q1 09          X          Y
    57   8  Q1 10          X          Y
    58   8  Q2 09          X          Y
    59   8  Q2 10          X          Y
    60   8  Q3 09          X          Y
    61   8  Q3 10          X          Y
    62   8  Q4 09          X          Y
    63   8  Q4 10          X          Y
    64   9  Q1 09          X          Y
    65   9  Q1 10          X          Y
    66   9  Q2 09          X          Y
    67   9  Q2 10          X          Y
    68   9  Q3 09          X          Y
    69   9  Q3 10          X          Y
    70   9  Q4 09          X          Y
    71   9  Q4 10          X          Y
    
    [72 rows x 4 columns]
    

    【讨论】:

    • 请假设“X”和“Y”变量是数字
    • 您可以将 df.filter(regex='X$') 更改为您的数据所代表的任何内容,'X$' 表示以 X 结尾。因此您可以将 X 更改为两个变量号。 @MadsAndersen
    • 所有观察中的数字都会不同,所以不能只插入数字
    • 那么你如何区分这些变量呢?您显示 X,Y 代表列中的两个不同变量。 @MadsAndersen
    • 否,数据当前的格式是第一列包含跨季度的第一个变量“X”的数据。接下来的列包含有关季度中另一个变量“Y”的数据。因此变量会根据列的名称来区分。
    猜你喜欢
    • 2017-05-10
    • 2021-09-05
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 2021-08-05
    • 2020-03-20
    • 2021-10-26
    • 2019-11-24
    相关资源
    最近更新 更多