Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么';将时间序列数据转换为横截面数据的最有效方法是什么?_Python_Pandas_Dataframe_Data Cleaning - Fatal编程技术网

Python 什么';将时间序列数据转换为横截面数据的最有效方法是什么?

Python 什么';将时间序列数据转换为横截面数据的最有效方法是什么?,python,pandas,dataframe,data-cleaning,Python,Pandas,Dataframe,Data Cleaning,事情是这样的,我有下面的数据集,其中日期是索引: date value 2020-01-01 100 2020-02-01 140 2020-03-01 156 2020-04-01 161 2020-05-01 170 . . . 我想在另一个数据集中转换它: value_t0 value_t1 value_t2 value_t3 value_t4 ... 100 NaN

事情是这样的,我有下面的数据集,其中日期是索引:

date            value
2020-01-01      100
2020-02-01      140
2020-03-01      156
2020-04-01      161
2020-05-01      170
.
.
.
我想在另一个数据集中转换它:

value_t0    value_t1    value_t2    value_t3    value_t4 ...
100         NaN         NaN         NaN         NaN      ...
140         100         NaN         NaN         NaN      ...
156         140         100         NaN         NaN      ...
161         156         140         100         NaN      ...
170         161         156         140         100      ...
首先,我考虑使用pandas.pivot_表来做一些事情,但这只会提供一个由某个列分组的不同布局,这并不是我想要的。后来,我考虑使用pandasql并应用“case-when”,但这不起作用,因为我必须键入几十行代码。所以我被困在这里。

试试这个:

new_df = pd.DataFrame({f"value_t{i}": df['value'].shift(i) for i in range(len(df))})
series
.shift(n)
方法可以通过向下移动所有内容并填充上面的NaN来获得所需输出的一列。因此,我们正在构建一个新的数据框架,通过使用字典理解来迭代原始数据框架,为它提供一个形式为
{column name:column data,…}
的字典。

尝试以下方法:

new_df = pd.DataFrame({f"value_t{i}": df['value'].shift(i) for i in range(len(df))})

series
.shift(n)
方法可以通过向下移动所有内容并填充上面的NaN来获得所需输出的一列。因此,我们正在构建一个新的数据框架,通过使用字典理解来迭代原始数据框架,为它提供一个形式为
{column name:column data,…}
的字典。

我认为最好的方法是使用
numpy

values = np.asarray(df['value'].astype(float))
new_values = np.tril(np.repeat([values], values.shape[0], axis=0).T)
new_values[np.triu_indices(new_values.shape[0], 1)] = np.nan
new_df = pd.DataFrame(new_values).add_prefix('value_t')
5000行的时间

%%timeit
values = np.asarray(df['value'].astype(float))
new_values = np.tril(np.repeat([values], values.shape[0], axis=0).T)
new_values[np.triu_indices(new_values.shape[0],1)] = np.nan
new_df = pd.DataFrame(new_values).add_prefix('value_t')
556 ms ± 35.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
new_df = pd.DataFrame({f"value_t{i}": df['value'].shift(i) for i in range(len(df))})
1.31 s ± 36.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
不带
添加前缀的时间

%%timeit
values = np.asarray(df['value'].astype(float))
new_values = np.tril(np.repeat([values], values.shape[0], axis=0).T)
new_values[np.triu_indices(new_values.shape[0],1)] = np.nan
new_df = pd.DataFrame(new_values)

357 ms ± 8.09 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

我认为最好的方法是使用
numpy

values = np.asarray(df['value'].astype(float))
new_values = np.tril(np.repeat([values], values.shape[0], axis=0).T)
new_values[np.triu_indices(new_values.shape[0], 1)] = np.nan
new_df = pd.DataFrame(new_values).add_prefix('value_t')
5000行的时间

%%timeit
values = np.asarray(df['value'].astype(float))
new_values = np.tril(np.repeat([values], values.shape[0], axis=0).T)
new_values[np.triu_indices(new_values.shape[0],1)] = np.nan
new_df = pd.DataFrame(new_values).add_prefix('value_t')
556 ms ± 35.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
new_df = pd.DataFrame({f"value_t{i}": df['value'].shift(i) for i in range(len(df))})
1.31 s ± 36.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
不带
添加前缀的时间

%%timeit
values = np.asarray(df['value'].astype(float))
new_values = np.tril(np.repeat([values], values.shape[0], axis=0).T)
new_values[np.triu_indices(new_values.shape[0],1)] = np.nan
new_df = pd.DataFrame(new_values)

357 ms ± 8.09 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)