python - 重新采样数据框会产生意想不到的结果
问题描述
长问题短,什么是适当的重采样频率/规则?有时我得到一个主要充满 NaN 的数据框,有时它工作得很好。我以为我掌握了它。
下面是一个例子,
我正在处理大量数据并且正在更改我的重采样频率,并注意到由于某些重采样规则在每行中仅产生一个元素具有值,其余元素具有 NaN。
例如,
df = pd.DataFrame()
df['date']=pd.date_range(start='1/1/2018', end='5/08/2018')
创建一些示例数据,
df['data1']=np.random.randint(1, 10, df.shape[0])
df['data2']=np.random.randint(1, 10, df.shape[0])
df['data3'] = np.arange(len(df))
数据看起来像,
print(df.head())
print(df.shape)
data1 data2 data3
date
2018-01-01 7 7 0
2018-01-02 8 8 1
2018-01-03 2 7 2
2018-01-04 2 2 3
2018-01-05 2 5 4
(128, 3)
当我使用偏移别名重新采样数据时,我得到了意想不到的结果。
下面我每 3 分钟重新采样一次数据。
resampled=df.resample('3T').mean()
print(resampled.head())
print(resampled.shape)
data1 data2 data3
date
2018-01-01 00:00:00 4.0 5.0 0.0
2018-01-01 00:03:00 NaN NaN NaN
2018-01-01 00:06:00 NaN NaN NaN
2018-01-01 00:09:00 NaN NaN NaN
2018-01-01 00:12:00 NaN NaN NaN
除了第一行之外,大多数行都用 NaN 填充。我相信这是因为我的重采样规则没有索引。它是否正确?'24H' 是此数据的最小间隔,但任何少的东西都会使 NaN 保持连续。
可以对数据帧重新采样小于日期时间分辨率的增量吗?
过去我在尝试重新采样跨越一年的大型数据集时遇到了麻烦,日期时间索引格式为 %Y:%j:%H:%M:%S (year:day #: hour: minute:second,注意:足够接近而不是冗长)。尝试每 15 或 30 天重新采样一次也产生了与 NaN 非常相似的结果。我认为这是由于没有月份的奇怪日期格式,但 df.head() 显示了正确日期的索引。
解决方案
当您重新采样降低频率(下采样)时,计算结果的可能选项之一就是mean()。它实际上意味着:
- 源 DataFrame 包含过于详细的数据。
- 您希望将采样频率更改为较低的频率,并计算例如当前采样周期的一些源行中每列的平均值。
但是当您增加采样频率(上采样)时,则:
- 你的源数据太笼统了。
- 您想将频率更改为更高的频率。
- 计算结果的可能选项之一是例如 在已知源值之间进行插值。
请注意,当您将每日数据上采样到 3 分钟频率时:
- 第一行将包含2018-01-01 00:00:00和 2018-01-01 00:03:00之间的数据。
- 下一行将包含2018-01-01 00:03:00和 2018-01-01 00:06:00之间的数据。
- 等等。
因此,根据您的源数据:
- 第一行包含2018年 1月 1 日(午夜尖锐)的数据。
- 由于00:03:00和00:06:00之间的时间范围(在2018-01-01 )没有可用的源数据 ,因此第二行仅包含NaN值。
- 这同样适用于更多行,直到2018-01-01 23:57:00 (这些时间片没有源数据)。
- 下一行,对于2018-01-02 00:00:00可以填充源数据。
- 等等。
这种行为没有什么奇怪的。重采样就是这样工作的。当您实际对源数据进行上采样时,也许您应该插入 缺失值?
推荐阅读
- python - 为什么我在 file.close() 上收到 [Errno 9] Bad file descriptor - 错误处理
- elasticsearch - 构建一个搜索特定类型内容的搜索引擎?
- visual-studio-code - 在VScode中使用Vim时如何切换j和k
- typescript - 在运行时检测可选属性
- python - 结合 pd.read_csv 和 pd.read_excel
- jsonschema - json 模式使用其动态键验证属性值
- android - 当我向服务器发送 Base64 字符串时出现 onFailure
- c++ - 如何仅使用标准库存储不同类型和可变参数的函数
- c - C: 问题 printf 和 scanf
- c# - Entity Framework Core,自定义更改并防止它们被覆盖