PowerShell の配列から要素を削除する

PowerShell の配列から要素を削除する方法を考えてみる。 PowerShell の配列では、IndexOf() で要素のインデックス番号を取得できるので、それを使って該当の値を null にし、その上で null 以外の要素を再度元の配列へ代入することにする。

実行例

# 操作対象となる配列の作成
PS > $a = @(10, 20, 30, 40, 50)

# 今回は、30 を削除することを考える。
# 30 のインデックスを取得
PS > $n = $a.IndexOf(30)
PS > $a[$n]
30

# 30 の要素を $null にする
PS > $a[$n] = $null

# $null 以外の要素をもとの配列に格納する
PS > $a = $a -ne $null

# 30が削除されたことを確認する
PS > $a
10
20
40
50
PS>

この処理を関数にしてみる

function delitem() {
param(
    [array]$array, 
    [int]$item
    )

    $array[$array.IndexOf($item)] = $null
    return $array -ne $null
}


$a = @(10, 20, 30, 40, 50)
$b = delitem -array $a -item 40
$b.GetType()
$b

上記を test.ps1 として保存し、実行した。 出力結果は、以下の通りである。

PS > .\test.ps1

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
10
20
30
50


PS >

Windows: ReportingEvents分析: 2日目: PowerShell で考える

ReportintEvents を PowerShell で実行することを考える。

以下のような処理にする。

sls "KB5040527" ReportingEvents.log | sls "AGENT_INSTALLING_SUCCEEDED" -> 合致する場合インストール成功

上記以外の場合、原因を調査する

$log = sls "KB5040527" ReportingEvents.log $log[-1] -> 最終行の出力で状態を判別する。

Windows: ReportingEvents.log 解析: 1日目: ReporintEvnets.log を df に読み込む

Windows 11 の更新プログラム適用の状況を把握するために、ReportingEvents.log の解析を考えてみることにした。その1日目。 df に読み込んでみる。

ReportingEvents.log を読み込む

import pandas as pd
df = pd.read_csv("ReportingEvents.log", sep="\t", encoding="utf16")

#とりあえずの名前を付ける
df.columns=["ID1", "datetime", "num1", "status", "num2", "ID2", "num3", "num4",
            "note1", "note2", "note3", "note4", "note5"]

# NaN への対応
df["note4"].fillna("", inplace=True)

# 列の出力結果の文字数を増やす
pd.set_option("display.max_colwidth", 500)

ReportingEvents.log の出力

.NET Framework の更新プログラムについての情報を出力してみる

df[df["note4"].str.contains("Framework")].loc[:, ["datetime", "status", "note4"]]

datetime    status  note4
2024-08-15 02:41:24:313+0900    181 [AGENT_INSTALLING_STARTED]  Installation Started: Windows has started installing the following update: 2024-08 .NET Framework 3.5 および 4.8.1 の累積的な更新プログラム (x64 向け Windows 11, version 23H2 用) (KB5042099)
2024-08-15 03:17:44:788+0900    183 [AGENT_INSTALLING_SUCCEEDED]    Installation Successful: Windows successfully installed the following update: 2024-08 .NET Framework 3.5 および 4.8.1 の累積的な更新プログラム (x64 向け Windows 11, version 23H2 用) (KB5042099)

データフレームの列の内容が省略されてしまう時の対応

データフレームの内容を表示した際、文字数が多いと、末尾が "..." となり、出力が省略されてしまいます。列に表示する文字列の長さを増やすことでこの事象を解消できます。

列の文字数を 500 に設定する場合

pd.set_option("display.max_colwidth", 500)

出力の比較

+設定前

datetime                                        desc
2024-08-15 02:41:24:313+0900    Installation Started: Windows has started inst...

+設定後

datetime                                        desc
2024-08-15 02:41:24:313+0900    Installation Successful: Windows successfully installed the following update: 2024-08 .NET Framework 3.5 および 4.8.1 の累積的な更新プログラム (x64 向け Windows 11, version 23H2 用) (KB5042099)

Python: 二項分布とポアソン分布の確率の計算

scipy を使うことで、二項分布の確率を計算できる。 ちなみに、二項分布は英語で "binomial distribution" という。 pmf は、"Probability mass function" で、日本語に訳すと、"確率質量関数" である。

二項分布の確率の計算

from scipy.stats import binom

n = 200
p = 5/1000
k = 1

binom.pmf(k, n, p)

ポアソン分布の確率の計算

from scipy.stats import poisson

n = 200
p = 5/1000
k = 1
lmd = n * p
poisson.pmf(k, lmd)

Python で順列、組み合わせ、階乗の計算をする

Python の math モジュールを使うと、順列、組み合わせ、階乗の計算ができる

import math

# 順列:  4P2 の計算
math.perm(4, 2)

# 組み合わせ:  4C2 の計算
math.comb(4, 2)

# 階乗:  4! の計算
math.factorial(4)

math.comb を使って、二項分布の確率の式を表してみる。

p = 1/2
n = 10
k = 3

nCk = math.comb(n, k)
p1 = p**k
p2 = (1-p)**(n-k)
nCk * p1 * p2

df の各出力結果に対して関数を適用する (map)

DataFrame.map() を使うと、df の各出力結果に対して、関数を適用できる。 これで、例えば、データの出力結果の末尾に単位をつけたりできる。

以下のような感じにすると、df の各出力結果に "台" が付けられる。ちなみに、apply だと、出力の一番最後に "台" がついてしまう (これじゃない)。

def add_dai(x):
    return str(x) + "台"

print(df.map(add_dai))