让我们从一个简单的时间序列输入开始,并尝试构建一个自动编码器,该自动编码器简单地进行傅立叶变换,然后在 keras 中对我们的数据进行反变换。
如果我们尝试这样做:
inputs = Input(shape=(MAXLEN,1), name='main_input')
x = tf.spectral.rfft(inputs)
decoded = Lambda(tf.spectral.irfft)(x)
Run Code Online (Sandbox Code Playgroud)
然后第三行在输入时抛出错误:
>> ValueError: Tensor conversion requested dtype complex64 for Tensor with dtype float32
Run Code Online (Sandbox Code Playgroud)
你看,tf.spectral.irfft 的输出是 float32 但看起来 Lambda 认为它是 complex64??(Complex64 是上一步的输入 x)
我们可以在模型输入时修复该错误:
inputs = Input(shape=(MAXLEN,1), name='main_input')
x = tf.spectral.rfft(inputs)
decoded = Lambda(tf.cast(tf.spectral.irfft(x),dtype=tf.float32)))
Run Code Online (Sandbox Code Playgroud)
这在输入时被接受,但是当我们尝试构建模型时:
autoencoder = Model(inputs, decoded)
Run Code Online (Sandbox Code Playgroud)
它生成错误:
TypeError: Output tensors to a Model must be Keras tensors. Found: <keras.layers.core.Lambda object at 0x7f24f0f7bbe0>
Run Code Online (Sandbox Code Playgroud)
我想这是合理的,也是我不想首先投射它的原因。
主要问题:如何成功包装输出 float32 的 tf.spectral.irfft 函数?
更一般的学习问题:假设我实际上想在 rfft 和 irfft 之间做一些事情,如何在不破坏 keras …
这太奇怪了,我真的想知道我是否只是误解了事情。
我有一些从日期时间值构建多重索引的代码,但生成多重索引后,类型已更改为时间戳。我希望它保留日期时间。我为什么要关心?好吧,代码的另一部分以与相同日期时间略有不同的方式生成多索引,但在这种情况下,它保留 datettime 类型 - 所以我不能在两个 DataFrame 之间使用更新,因为列不被视为相等(是的,我通过直接比较值进行检查)。
下面是最小的代码示例:
import datetime
import pandas as pd
import numpy as np
iterables = [['bar', 'baz', 'foo', 'qux'], [datetime.date(2014, 10, 3)]]
columns = pd.MultiIndex.from_product(iterables)
df = pd.DataFrame(np.random.randn(4, 4),columns = columns)Run Code Online (Sandbox Code Playgroud)
这给出:
>>> df.columns[0]
('bar', Timestamp('2014-10-03 00:00:00'))Run Code Online (Sandbox Code Playgroud)
请注意,日期的类型现在是时间戳,而不是日期时间。在我的代码的另一部分中,它保持 datettime (这是正确的事件链,是吗?),所以现在它们都引用相同的日期,但测试不相等,所以我无法应用 DataFrame.update 从一个推送数据到另一个。不幸的是,这两条路径都有强有力的数据驱动原因,说明为什么它们应该按照现在的方式完成。
有什么解决方法或解决方案吗?或者我是否错过了一些明显的东西,整个前提很愚蠢(我不会以某种方式在这里将其视为一种可能性 - 我很惊讶日期时间测试不等于时间戳)?有没有一种简单的方法可以进入并更改多重索引的第二级类型以将其更改回日期时间?
编辑:差点忘了:pandas 版本 0.15.2
我正在研究一种方法,该方法最终将处理来自大型多索引pandas数据帧的数据切片.我可以生成用于每个索引器的掩码(实际上是用于定义切片的值列表):
df.loc[idx[a_mask,b_mask],idx[c_mask,d_mask]]
Run Code Online (Sandbox Code Playgroud)
这样会很好,但在某些情况下我真的想选择其中一些轴上的所有东西,相当于:
df.loc[idx[a_mask,b_mask],idx[:,d_mask]]
Run Code Online (Sandbox Code Playgroud)
有没有办法让我传递冒号":"替换第二个例子中的c_mask作为变量?理想情况下,我只是将c_mask设置为类似":"的值,但当然这不起作用(并且不应该因为如果我们有一个名为that的列,那该怎么办).但有没有办法通过变量传递一个值,该变量沿着其中一个索引器传递"整个轴"?
我意识到我可以生成一个掩码,通过将所有值沿着适当的轴聚集在一起来选择所有内容,但这非常重要并且添加了大量代码.同样地,我可以将数据帧访问分解为5个场景(每个场景有一个:在其中,一个有四个掩码),但这似乎不符合DRY原则并且仍然很脆弱,因为它无法处理多个方向整个切片选择.
那么,我可以通过一个变量来传递任何东西,它将在索引器中选择整个方向,如:a?或者是否有更优雅的方式来选择整个方向?