我有一个带有 <?php
if (isset($_POST['name']) && $_POST['name'] != "") {
$to = "sobanr4@gmail.com";
$subject = "Website Order Request";
$headers = "From: <".$_POST['email'].">\r\n";
$headers .= "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
$body = "<html>
<head>
<title>Order Request - ".$_POST['name']."</title>
</head>
<body>
<p>NAME: ".$_POST['name']."</p>
<p>EMAIL: ".$_POST['email']."</p>
<p>NUMBER: ".$_POST['number']."</p>
<p>USERNAME: ".$_POST['username']."</p>
<p>COUNTRY: ".$_POST['country']."</p>
<p>COMPANY NAME: ".$_POST['cname']."</p>
<p>TYPE: ".$_POST['ctype']."</p>
<p>THEME: ".$_POST['ctheme']."</p>
<p>DOMAIN NAME: ".$_POST['domainname']."</p>
<p>WEB HOSTING: ".$_POST['webhosting']."</p>
<p>SEO: ".$_POST['seo']."</p>
<p>GOOGLE ADVERTISING: ".$_POST['gadvertising']."</p>
<p>CONTENT MARKETING: ".$_POST['cmarketing']."</p>
<p>PERMANENT TECHNICIAN: ".$_POST['ptech']."</p>
<br><br><br>
<p>DETAILS: ".$_POST['details']."</p>
<br><br><br>
<p>DESCRIPTION: ".$_POST['description']."</p>
</body>
</html>";
if (mail($to,$subject,$$body,$headers)) {
echo 1;
} else {
echo 0;
};
}
?>
观测值的数据集,其中所有观测都有n
个时间步长。我还有一个m
数组,其中包含每个给定观察的每个时间步的标签。
我正在对此数据集进行特征工程,以根据我拥有的标签在数据中查找有意义的特征。是否有任何Python包来促进这个过程?
我遇到n*m
(https://github.com/blue-yonder/tsfresh),虽然看起来它只是在我们有一个标签来分类每个观察时使用,而不是用于分类的标签每个时间步,就像我的情况一样。
答案 0 :(得分:4)
您可以尝试Featuretools。它是一个开源的自动化功能工程库,明确地处理时间,以确保您不会引入标签泄漏。
对于您的数据,您可以创建两个实体:"observations"
和"timesteps"
,然后应用featuretools.dfs
(Deep Feature Synthesis)为每个时间步长生成要素。您可以将实体视为与关系数据库中的表相同。
对于您的问题,特别有用的是Featuretools中的累积原语,这些操作使用按时间排序的许多实例来计算单个值。在您的情况下,如果有多个时间步长的观察值,每个时间步长都有一定值,您可以使用CumMean primitive计算前一个时间步长的平均值。
以下是一个例子:
from featuretools.primitives import Day, Weekend, Percentile, CumMean, CumSum
import featuretools as ft
import pandas as pd
import numpy as np
timesteps = pd.DataFrame({'ts_id': range(12),
'timestamp': pd.DatetimeIndex(start='1/1/2018', freq='1d', periods=12),
'attr1': np.random.random(12),
'obs_id': [1, 2, 3] * 4})
print(timesteps)
attr1 obs_id timestamp ts_id
0 0.663216 1 2018-01-01 0
1 0.455353 2 2018-01-02 1
2 0.800848 3 2018-01-03 2
3 0.938645 1 2018-01-04 3
4 0.442037 2 2018-01-05 4
5 0.724044 3 2018-01-06 5
6 0.304241 1 2018-01-07 6
7 0.134359 2 2018-01-08 7
8 0.275078 3 2018-01-09 8
9 0.499343 1 2018-01-10 9
10 0.608565 2 2018-01-11 10
11 0.340991 3 2018-01-12 11
entityset = ft.EntitySet("timeseries")
entityset.entity_from_dataframe("timesteps",
timesteps,
index='ts_id',
time_index='timestamp')
entityset.normalize_entity(base_entity_id='timesteps',
new_entity_id='observations',
index='obs_id',
make_time_index=True)
# per timestep
cutoffs = timesteps[['ts_id', 'timestamp']]
feature_matrix, feature_list = ft.dfs(entityset=entityset,
target_entity='timesteps',
cutoff_time=cutoffs,
trans_primitives=[Day, Weekend, Percentile, CumMean, CumSum],
agg_primitives=[])
print(feature_matrix.iloc[:, -6:])
CUMMEAN(attr1 by obs_id) CUMSUM(attr1 by obs_id) CUMMEAN(PERCENTILE(attr1) by obs_id) CUMSUM(CUMMEAN(attr1 by obs_id) by obs_id) CUMSUM(PERCENTILE(attr1) by obs_id) observations.DAY(first_timesteps_time)
ts_id
0 0.100711 0.100711 1.000000 0.100711 1.000000 1
1 0.811898 0.811898 1.000000 0.811898 1.000000 2
2 0.989166 0.989166 1.000000 0.989166 1.000000 3
3 0.442035 0.442035 0.500000 0.442035 0.500000 1
4 0.910106 0.910106 0.800000 0.910106 0.800000 2
5 0.427610 0.427610 0.333333 0.427610 0.333333 3
6 0.832516 0.832516 0.714286 0.832516 0.714286 1
7 0.035121 0.035121 0.125000 0.035121 0.125000 2
8 0.178202 0.178202 0.333333 0.178202 0.333333 3
9 0.085608 0.085608 0.200000 0.085608 0.200000 1
10 0.891033 0.891033 0.818182 0.891033 0.818182 2
11 0.044010 0.044010 0.166667 0.044010 0.166667 3
此示例还使用“截止时间”来告诉特征计算引擎仅在指定时间之前为每个“ts_id”或“obs_id”使用数据。您可以在文档中阅读this page上有关截止时间的更多信息。
Featuretools允许你做的另一个很酷的事情是在“观察”表中构建每个观察的特征,而不是每个时间步。为此,请更改“target_entity”参数。在下面的示例中,我们使用每个观察的最后一个时间戳作为截止时间,这将确保在该时间之后没有使用任何数据(例如,来自2018-01-11的obs_id = 2的数据将不包括在obs_id = 1的Percentile()计算,截止时间为2018-01-10)。
# per observation
ocutoffs = timesteps[['obs_id', 'timestamp']].drop_duplicates(['obs_id'], keep='last')
ofeature_matrix, ofeature_list = ft.dfs(entityset=entityset,
target_entity='observations',
cutoff_time=ocutoffs,
trans_primitives=[Day, Weekend, Percentile, CumMean, CumSum])
print(ofeature_matrix.iloc[:, -6:])
PERCENTILE(STD(timesteps.attr1)) PERCENTILE(MAX(timesteps.attr1)) PERCENTILE(SKEW(timesteps.attr1)) PERCENTILE(MIN(timesteps.attr1)) PERCENTILE(MEAN(timesteps.attr1)) PERCENTILE(COUNT(timesteps))
obs_id
1 0.666667 1.000000 0.666667 0.666667 0.666667 1.000000
2 0.333333 0.666667 0.666667 0.666667 0.333333 0.833333
3 1.000000 1.000000 0.333333 0.333333 1.000000 0.666667
最后,实际上可以将tsfresh与Featuretools结合使用作为&#34;自定义原语&#34;。这是一项高级功能,但如果您有兴趣,我可以解释一下。
答案 1 :(得分:-1)
如果您向我提供有关该问题的更多详细信息,我可以详细回答。但是,根据我的理解,您希望使用您拥有的时间序列数据来预测某些内容。
Python中有一个名为keras
的包用于机器学习。您可以做的是,您可以使用LSTM来训练您的模型。在keras
中对LSTM的支持非常好。