<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />这与JMP博客中的这篇文章的版本非常相似...只是交叉发布以防万一您错过了它!
在更早的时候博客文章 ,我介绍了2014年JMP Discovery Summit电子海报的主题,标题为“ 使用JMP分析个人饮食和健身数据” 并分享了我对量化自我(QS)分析项目的兴趣。对于我的海报项目,我通过以下方式从基于Web的Activity Manager软件中导出了两种不同类型的数据文件: BodyMedia® 并编写了JMP脚本语言(JSL)脚本来导入,格式化和清除我的数据,以便在JMP中进行进一步的分析和可视化。希望您能与我一起在Cary的会议上听到更多信息,但是如果没有,您可以查看我的电子海报的PDF 在2014年探索峰会部分。
今天,我将分享我如何使用JSL导入和合并一组包含工作量和卡路里摘要信息的多工作表Excel文件。Activity Manager软件还导出PDF Food Log文件,我将在下一篇博客文章中介绍该文件。顺便说一句,我上传了一个加入 JMP文件交换,可用于将自己的BodyMedia®活动摘要和食物日志文件导入JMP。它还包括一个奖金插件,用于导入CSV文件,您可以使用Chrome扩展程序从流行的MyFitnessPal食物记录网站下载CSV文件。
对于此用户社区博客文章,我想添加一个有关测试我的加载项的注释,该注释未出现在此博客的公开版本中。 我为自己编写了许多脚本,但这是我第一次体验,将用户界面置于脚本之上,并担心其他人在使用外接程序时可能遇到的错误。 在此过程中,我严重依赖两位JMP测试人员和脚本编写专家Melanie Drake和Audrey Shull。 Melanie共享了一个适合我的情况的简单对话框的代码。 奥黛丽(Audrey)为我进行了第一轮外接程序测试,并建议我将脚本分解成几个部分,以便可以更好地验证用户输入并在脚本中添加更多错误检查选项。 其中包括对目录和文件存在的验证以及对用户是否要覆盖现有文件的检查。
在佛罗里达州一个家庭度假回家途中的汽车中,我为我的笔记本电脑中的对话和脚本制定了以下测试方案。 后来,当我回到电脑前时,我创建了以下PowerPoint,其中包括该加载项对话框的屏幕快照以及用户可以执行的一些可能的操作。我发现找出我在测试中遇到的错误以及错误所在(在红色框中)非常有帮助。 当我通过脚本修复解决它们时,将它们标记为满意。 我非常简单的插件具有大量的可能的测试路径,这再次使开发和测试复杂软件面临的挑战再多了。 这项练习使我更加感谢我们的JMP开发人员和测试人员每天所做的所有工作!

回到我创建外接程序之前。 8月初,在准备“发现”海报时,我导出了将近50个活动摘要和50个食物日志文件,涵盖了从12/20/10到7/28/14的时间段。BodyMedia®活动摘要数据保存在包含六个不同工作表的Excel工作簿中,但是我只想从前五个中导入数据:摘要,活动,膳食,睡眠和体重。您可以在下面查看其他工作表内容的详细信息我的电子海报 。

我的大多数活动摘要Excel文件都包含四个星期的数据,尽管有些文件所占的星期更少。尽管第五个选项卡上的行数(权重)有所不同,但所有文件的第5行都具有列标题,并且大多数文件的前四个选项卡具有28行数据。2013年之前,我在“活动管理器”中手动输入了体重测量值。2013年1月,我开始使用 Withings智能人体分析仪秤,将体重测量值无线上传到自己的基于Web的软件中,并通过与Activity Manager的第三方集成自动共享。
我决定以交互方式两次导入数据文件(大约一年)之后,对导入过程进行脚本编写。第二次交互式导入比较耗时,因为我有更多的文件和工作表可以使用。由于我每天都在积累新数据,因此我的文件数将一直随着时间增长。第二次导入后,我格式化了列并向合并的数据表中添加了公式,只是将其与第一次导入时的表进行了比较,并意识到我已经忘记了几个重要步骤。
当我回溯以完成我错过的步骤时,我开始考虑脚本编写如何使重新处理所有文件变得更加简单和快捷。如果导入过程更容易,我会更频繁地查看新数据。幸运的是,我发现即使像我这样的新手脚本编写者也可以编写JSL来导入和合并我的文件。我从源脚本(在交互式导入过程中自动添加到JMP数据表)和在线文档和论坛中的JSL示例开始。我使用在文本文件导入示例中塞苏格 JMP开发人员Michael Hecht撰写的论文。作为JMP的长期Mac专家,Michael以其所有语言的高质量和优雅代码而闻名,那么为什么不向大师学习呢?
在将数据组合到一个统一表中时遇到了一些麻烦。在导入之前,我必须处理的一个问题是,“睡眠”选项卡上的“日期”列包含一个隔夜范围,而不是像其他所有工作表一样的一天,这使我无法在没有预处理步骤的情况下直接合并它。例如,值12/20 / 2012-12 / 21/2012表示从12/20/14开始的睡眠之夜,直到12/21/14早晨结束。我使用JMP公式编辑器和JMP Word字符模式函数解析了第二天的日期。

在交互式创建公式之后,我在脚本中添加了代码,以使这些步骤在JSL的帮助下易于重复获取脚本命令。运行命令我的名字 <<获取脚本; 在“睡眠”选项卡的“日期”列上,在JMP的日志上打印了一个JSL的关键代码段,我将其添加到脚本中以自动执行此步骤。 在我的最终表中,“睡眠”列中显示的hr:m值表示我在那天早上醒来之前睡了多少时间。
输入文件中还有其他我不想包含在最终JMP表中的信息。卡路里的总计,平均值和目标总结在我所有工作表的底部(上表图片中的36-39行)。我在脚本中添加了一些步骤,以过滤掉这些摘要,列标题上方的信息行以及空白行。总体而言,我用于Discovery Summit海报的活动数据表的版本包含每日1,316行有关食用和燃烧的卡路里,活动量度,睡眠和体重测量的数据。
我的数据表尚未完全分析就绪。我表中的数字列包含在导入时未正确设置格式的持续时间和百分比。我以交互方式添加格式,缺少值代码和建模类型作为列属性。我使用“日期”列上的“转换”列功能将新的“日期时间”变量(如“年”,“月”,“周”和“天”)快速添加到表中,然后将其添加到脚本中以自动执行这些步骤。我还在表中添加了一个新的公式列(“消耗的卡路里”),以表示给定一天的热量不足/过量。
如果您有以Excel格式保存的BodyMedia®活动摘要文件,则可以下载我的加入从File Exchange进行点击式导入,即可将您自己的文件导入JMP。此加载项支持我刚才描述的“活动摘要”文件类型,保存为文本的BodyMedia®食物日志文件,以及可以在Chrome扩展程序的帮助下从流行(免费)MyFitnessPal中导出的食物日志文本文件。
特别感谢JMP测试经理Audrey Shull和技术作家Melanie Drake的脚本建议和附加测试!请继续关注我的下一篇博客文章,我将在其中描述如何使用JSL自动导入BodyMedia®食物日志文件。