juliaでExcelをDataFrameとして読む

juliaはMIT発の高水準言語です。

juliaの特徴やその言語の思想はこちらのサイトにとても詳しく書かれています。
なかでも「Pythonの禅 vs. Juliaの貪欲」の項に記載されている「Juliaの貪欲」は読んでいて、juliaがどれほど強力な言語なのだろうかとワクワクしてくるほどです。

pythonに比べるとライブラリの数はまだまだ少ないのですが、PyCallを使うことでpythonのライブラリを使用することもできます。

このjuliaを使って、ExcelファイルのシートをDataFrameとして読み込むサンプルを試してみました。

読み込むExcelはこんな感じです。

読み込むExcelファイル(df.xlsx)

プログラムは以下です。

using DataFrames, XLSX
df = DataFrame(XLSX.readtable("df.xlsx", "Sheet1"))
df = XLSX.openxlsx("df.xlsx") do xf
        DataFrame(XLSX.gettable(xf["Sheet1"])...)
    end
println(df)

実行結果は以下です。

julia ex.jl
 4×6 DataFrame
 │ Row │ No  │ word  │ ver  │ DATE       │ TIME     │ DATETIME            │
 │     │ Any │ Any   │ Any  │ Any        │ Any      │ Any                 │
 ├─────┼─────┼───────┼──────┼────────────┼──────────┼─────────────────────┤
 │ 1   │ 1   │ Hey   │ 10.2 │ 2018-02-20 │ 19:10:00 │ 2018-05-20T19:10:00 │
 │ 2   │ 2   │ You   │ 20.3 │ 2018-02-21 │ 19:20:00 │ 2018-05-20T19:20:00 │
 │ 3   │ 3   │ Out   │ 30.4 │ 2018-02-22 │ 19:30:00 │ 2018-05-20T19:30:00 │
 │ 4   │ 4   │ There │ 40.5 │ 2018-02-23 │ 19:40:00 │ 2018-05-20T19:40:00 │

Plotlyで加速度時刻歴の値と時刻をアニメートでトレースする

画像をクリックするとインタラクティブに操作できるページに移動します。

Plotlyでブラウザ上にインタラクティブなグラフを表示する」のプログラムに加速度値と時刻をアニメーションでトレースする機能を追加してみました。

同様の方法で、時刻歴だけでなく非線形部材のループ挙動やオービットなどもトレースできます。

import plotly.offline as offline
import plotly.graph_objs as go

import numpy as np

load_data = np.loadtxt('EL_CENTRO_NS.csv', delimiter=',', skiprows=1)

x = load_data[:, 0]
y = load_data[:, 1]

#y=np.arange(100)     
fig=go.Figure(data=[
    go.Scatter(x=x, y=y, mode='lines', line=dict(width=1, color="blue")),
    go.Scatter(x=x, y=y, mode='lines', line=dict(width=1, color="blue"))
])
fig.update_layout(title="EL_CENTRO_NS Animation",
                  title_x=0.5,
                  width=1200, height=600, 
                  xaxis_title='Time(sec)', 
                  yaxis_title='Acceleration(m/s/s)',
                  yaxis_range=(-4,4),
                  xaxis_range=(0,25), 
                  
                  updatemenus=[dict(buttons = [
                                               dict(
                                               args = [None, {"frame": {"duration": 2, 
                                                                        "redraw": False},
                                                              "fromcurrent": True, 
                                                              "transition": {"duration": 0}}],
                                               label = "START",
                                               method = "animate"),
                                               dict(
                                               args = [[None], {"frame": {"duration": 0, 
                                                                        "redraw": False},
                                                              "mode": "immediate", 
                                                              "transition": {"duration": 0}}],
                                               label = "STOP",
                                               method = "animate")
                                               ],
                                type='buttons',
                                showactive=False,
                                y=1.05,
                                x=0.0,
                                xanchor='left',
                                yanchor='bottom')])
                                          
                    
frames= [go.Frame(data=[go.Scatter(x=[x[i]], y=[y[i]], mode="markers", marker=dict(color="red", size=10) )]) for i in range(0, len(x))]
fig.update_xaxes(rangeslider={"visible":True})
fig.update(frames=frames)
fig.show()
fig.write_html("el_centro_ns_Animation.html")

参考にしたサイトはPlotlyのアニメーション機能の説明サイトPlotlyのコミュニティサイトです。

PlotlyでSTLファイルを3D表示する

3Dプリンタでも利用されるSTLファイルです。

その3Dプリンタの普及もあってか、フリーの3Dモデルファイルを提供するサイトも増えているようです。

画像をクリックするとインタラクティブに操作できるページに移動します。
import numpy as np
from stl import mesh
import plotly.figure_factory as ff

def stl2create_trisurf(stl_mesh):
    p, q, r = stl_mesh.vectors.shape
    vertices, ixr = np.unique(stl_mesh.vectors.reshape(p*q, r), return_inverse=True, axis=0)
    simplices = ixr.reshape([-1, 3])
    return vertices, simplices

my_mesh = mesh.Mesh.from_file('DOLPHIN.stl')

vertices, simplices = stl2create_trisurf(my_mesh)
x, y, z = vertices.T
title = "DOLPHIN"
fig = ff.create_trisurf(x=x, y=y, z=z,
                         simplices=simplices,
                         width=500,
                         height=500,
                         title="DOLPHIN",
                         aspectratio=dict(x=1, y=1, z=1)
                         )
#fig.show()
fig.write_html("DOLPHIN.html")

STLファイルからcreate_trisurfの為のデータを取得する部分は、こちらのサイトの関数を少し変更しました。

Plotlyでブラウザ上にインタラクティブなグラフを表示する

Plotlyはブラウザ上にデータを可視化するツールです。

JavaScriptを利用し、ブラウザ上でインタラクティブに操作できるなグラフや、構造データの可視化が可能です。

画像をクリックするとインタラクティブに操作できるページに移動します。
import plotly.graph_objects as go

import numpy as np
import pandas as pd

wave = pd.read_csv('EL_CENTRO_NS.csv', header=None)
x = wave[0]
y = wave[1]

# Create figure
fig = go.Figure(
    data=[go.Scatter(x=x, y=y,
                     mode="lines",
                     line=dict(width=1, color="blue"))
    ]
)
fig.update_layout(template="ggplot2")
fig.update_layout(title="EL_CENTRO_NS",title_x=0.5)
fig.update_xaxes(title="Time(sec)")
fig.update_yaxes(title="Acceleration(m/s/s)")
fig.update_xaxes(range=(0,25))
fig.update_yaxes(range=(-4,4))
fig.update_xaxes(rangeslider={"visible":True})
#fig.show()
fig.write_html("el_centro_ns.html")

ライブラリも豊富で、様々なデータを可視化できます。

新型コロナウイルスの挙動を予測

ちょっとした調べ物をしていて見つけたサイトです。

SEIRモデルで新型コロナウイルスの挙動を予測してみた」

感染症の流行は微分方程式で現すことができて、振動解析でも馴染み深いRungeKutta法で解くことができるのですね。

感染者の数の時間変化モデルと考えれば微分方程式になるということでしょうか。

GO言語でWebAssemblyを試す

WebAssembly(wasm)とはブラウザ上で高速にプログラムを実行する新しい仕様のことです。こちらの説明がとてもわかりやすいものでした。

さて、WikiにあるGetting Startedのとおりに進めます。

ブラウザ上で、RUNボタンを押すとコンソールに「Hello, wasm!」の文字が表示されます。

この程度のことはJavaScriptや他の方法でも容易に実現できますが、WebAssemblyの良いところは実行されるプログラムはコンパイル済みのネイティブコードであり、起動や実行が高速であるということ。

そして、C/C++などの資産をWebアプリケーション化できるというところにあると思います。

各種のサンプルをみると、Canvasを使ったアプリケーションや、中にはGameBoyのエミュレータを公開している方もいます。

その他、ブラウザ上にコンソールを表示してDBMSへ接続するデモもあります。

pygubuでpythonのGUIアプリを作る

pythonで手間なくGUIアプリを作ろうと思ったら、標準でインストールされているtkinterを使うことが良いかもしれません。

先に投稿した、Femapに独自開発の簡単なアプリを埋め込む際もtkinterを利用すれば良いと思います。

簡単なアプリなら、GUIのデザイナーツールを使うまでもないですが、機能を並べながらインタフェースを設計していくならpygubuのようなツールを使うと便利です。

応答解析の結果をFemapで分析する支援ツールとして、こんな機能のアプリはどうでしょうか。

pygubuインタフェース

Femap API の feOutput が廃止になる?

Femap API の WinWrap Basic では動作するのに、Pyfemap.py では動作しないメソッドがあり、SIEMENSのコミュニティに質問を投稿していたところ、SIEMENSの社員の方から回答をいただき、無事にプログラムを完成することができました。

その時に、feOutput は 2020.1 のリリースから非推奨になる旨のコメントもいただきました。
API開発者は feResults のみを使用するように移行を開始する必要があるとのことです。

Femap API はマニュアルにもいくつか「廃止予定」と書かれた機能があり、開発したプログラムも継続的にメンテナンスが必要だろうと思います。

2021/1/7追記
代替となるfeResultsオブジェクトの簡単な使用方法はこちら

Femapのウィンドウ内に別のアプリを埋め込むAPI

以下は、Femapの「モデル情報」ウィンドウの下方にWindowsのメモアプリを埋め込む例です。

import sys
import subprocess
import ctypes
import time
import pythoncom
import Pyfemap
from Pyfemap import constants

existObj = pythoncom.connect(Pyfemap.model.CLSID)
app = Pyfemap.model(existObj)

subprocess.Popen("notepad.exe")
time.sleep(2)
    
handle = ctypes.windll.user32.FindWindowW(0, "無題 - メモ帳")
app.feAppRegisterAddInPaneWithFrame(True, int(handle), int(handle), False, True, 4, 2)

Femapのウィンドウ内にメモアプリを表示しても無意味ですし、モデル情報ウィンドウの下方はスペースも狭いので、ここに埋め込んで有益なアプリは限られます。

しかし、自社開発のプログラムへの引き渡しのインタフェースや、ビューに表示されている解析結果を分析するようなアプリを埋め込むことは便利なカスタマイズと思います。