データフレームに任意の行要素が含まれるかどうかチェック(行ごとのチェック)

How to do Mapping between Numpy Array and Pandas Dataframe? – StackOverflow

Pandasでこの手の処理がしたい場合は,除外マージを利用する.必ずしも最も効率的な方法ではないが,応用が利くので,類似のケースに適用可能だし,間違いが少ないと思う(Pandas.DataFrame.isinが用いられるケースではその方が効率的だが,必ずしも意図した処理を行えているかどうか).

import pandas as pd
import numpy as np


data = [[0, 10, 22000, 3], 
        [1, 15, 42135, 4], 
        [0, 14, 13526, 5],
        [0, 16, 32156, 3], 
        [1, 23, 13889, 5], 
        [0, 18, 18000, 6], 
        [0, 21, 13189, 2], 
        [1, 32, 58766, 2]] 
col = ['Gender', 'Age', 'Amount','Dependents']

arr = np.array([[1, 15, 42135, 4],
       [1, 23, 13889, 5],
       [0, 21, 13189, 2]])
m = pd.DataFrame(arr, columns=col)

df = (
    pd.DataFrame(data, columns=col)
    .merge(m, indicator=True, how='left')
    .replace({'_merge': {'left_only': 0, 'both': 1}})
    .rename(columns={'_merge': 'Good_Bad'})
)
df
    Gender  Age Amount  Dependents  Good_Bad
0   0   10  22000   3       0
1   1   15  42135   4       1
2   0   14  13526   5       0
3   0   16  32156   3       0
4   1   23  13889   5       1
5   0   18  18000   6       0
6   0   21  13189   2       1
7   1   32  58766   2       0

今のケースの様に,数値データの場合はNumpyで処理するのがリーズナブルチョイス.

def view1D(a):
    a = np.ascontiguousarray(a)
    void_dt = np.dtype((np.void, a.itemsize*a.shape[1]))
    return a.view(void_dt).ravel()


def isin_nd(a, b):
    A, B = view1D(a.reshape(a.shape[0], -1)), view1D(b.reshape(b.shape[0], -1))
    return np.isin(A, B)


np.column_stack((data, isin_nd(np.array(data), arr).view('i1')))
array([[    0,    10, 22000,     3,     0],
       [    1,    15, 42135,     4,     1],
       [    0,    14, 13526,     5,     0],
       [    0,    16, 32156,     3,     0],
       [    1,    23, 13889,     5,     1],
       [    0,    18, 18000,     6,     0],
       [    0,    21, 13189,     2,     1],
       [    1,    32, 58766,     2,     0]])
df = (
    pd.DataFrame(data, columns=col)
    .assign(Good_Bad=lambda df: isin_nd(df.to_numpy(), arr).view('u1'))
)
df
    Gender  Age Amount  Dependents  Good_Bad
0   0   10  22000   3       0
1   1   15  42135   4       1
2   0   14  13526   5       0
3   0   16  32156   3       0
4   1   23  13889   5       1
5   0   18  18000   6       0
6   0   21  13189   2       1
7   1   32  58766   2       0
広告
カテゴリー: 未分類 | コメントをどうぞ

ノードの座標を表すリストからツリー構造を作成

if I want to make a tree structure from the string? – StackOverflow

ノードの座標を表すリストが与えられた時,ツリー構造を構築する効率的な方法を考える.特に仮定(条件)が明示されていないので,xy座標面で上から下へツリー構造となる様に仮定すると,座標リストをy軸で降順にソートして,最短エッジを求めていけば良い事が分かる.各ノードの番号は,質問の通り,リスト内の順番で振っていくと,

from collections import defaultdict
import networkx as nx


lst = [[5, 3], [11, 5], [13, 3], [3, 5], [6, 1], [1, 3], [8, 6], [7, 2], [2, 2]]
idx_d = {tuple(v): k for k, v in enumerate(lst, 1)}

dd = defaultdict(set)
for v, k in sorted(lst, key=lambda x: -x[1]):
    dd[k].add(v)

G = nx.Graph()
G.add_nodes_from(range(1, len(lst)+1))
for i in G:
    G.node[i]['pos'] = lst[i-1]

b = None
for k, v in dd.items():
    if b is not None:
        f = lambda e: min((s for s in b[0]), key=lambda x: abs(x-e))
        l = [(idx_d[f(e), b[1]], idx_d[e, k]) for e in v]
        G.add_edges_from(l)
    b = (v, k)

pos = nx.get_node_attributes(G, 'pos')
nx.draw(G, pos, with_labels=True)

download

カテゴリー: 未分類 | コメントをどうぞ

グループに基づいて列を行に転置

Datamash: Transposing the column into rows based on group in bash – StackOverflow

A 123
A 23
A 45
A 67
B 88
B 72
B 50
B 23
C 12
C 14

↓

A 123 23 45 67
B 88  72 50 23
C 12 14

スマホでちょっとした作業をしたい場合には,datamashが便利.
(Bashで処理する場合も,datamashが有効な場合は極めて効率的)

ただ,ネットに繋がる環境であれば,Python(Pandas)を使わない理由が無い.

import io
import pandas as pd


strings = """A 123
A 23
A 45
A 67
B 88
B 72
B 50
B 23
C 12
C 14"""

df = (
    pd.read_csv(io.StringIO(strings), sep='\s+', header=None)
    .assign(col=lambda df: df.groupby(0).cumcount())
    .pivot(index=0, columns='col', values=1)
    .fillna('')
    .rename_axis(index='', columns='')
)
df
    0   1   2   3
A   123.0   23.0    45  67
B   88.0    72.0    50  23
C   12.0    14.0        
カテゴリー: 未分類 | コメントをどうぞ

米中貿易戦争と通貨安競争

文章を纏める程の気力は無いので、思いを書き殴る程度で。

米中貿易競争は既にリスク示現下にあり、貿易戦争は既に始まっていると云って良い。その時、好手か悪手かはさておき、トランプディールには一貫性がある。まず、安全保障政策として。「安全保障」は日米貿易摩擦と同じく建前でもあり、しかし覇権主義的には本質でもある。自由市場経済においては相対的優位性が全てで、覇権(1位)でなければ意味がない。元々、中国の人権問題、知財問題、そして安全保障上の問題、問題は山積していたが、ここで米国がいよいよ動き出したのは、次世代の主要セクターに於ける覇権争いで、米国がいよいよ中国に取って代わられるリスクが顕在化したからに過ぎない。元々、米国のシンクタンク予想によれば、2015−2020年に米中戦争が起こる確率は75%とも云われていて(10年前にみた記事なので出典が分からないが)、米中関税水準が1930年代の保護主義時代、そしてブロック経済圏から世界大戦の流れといったものが想起されるが、予想がいよいよ笑い事では済まなくなってきた。日本は早々に折れて、プラザ合意を飲んだが、中国の場合は日本のそれを熟知し、過去に学び、日本の二の舞は踏まないとの決心がある分、このチキンゲームはそれぞれ妥協点を見出すのは難く、行き着く所まで行く可能性は無視出来ない。

一方で世界経済がいよいよリセッションに陥るかと危機感が募る中で、少しでも富を自国に移転させたい向きは強く、暗に明に通貨安競争が勃発しつつある。その筆頭はやはりトランプだろうが、関税のタイミング、ツイッターを用いた市場撹乱、FRBに対する口先介入をみていると、トランプの思惑として、株式市場は出来るだけ下げたくないが、ドル安誘導はしたい、またうまくドル安にならなかったとしても、ドル高をうまく利用して関税の悪影響を吸収したい、或いはドル高による富の移転に対して、その影響を吸収する為に関税を上げているのではないか。優先順位は分からないが、関税とドル安誘導(その為の口先介入等)に於けるトランプディールは、安全保障という譲れない戦略と、経済的観点に於ける非常に巧妙な、しかしハイリスクな不確実性の高い戦術に基づいて行われているのでは。そう考えると、ツイッター攻勢のタイミングが非常に分かり易く、株価、ドルインデックス、特にユーロ水準に応じて、NY市場がクローズの時に出来るだけ撹乱し、ドル安誘導、株先物が下げるとフォロー、ドル安トレンドというよりは、ドル高トレンドを形成させないというか。まあ、不確実性の高まりは、その内コントロール不能な事態を引き起こすだろうが。そして、この一番の被害者は最終的に日本になるのは明らか(まして世界中が予防的措置を講じようと動く中で日本だけが同じ事を繰り返しているから)。

ドル高が続けば、そして株価が安定している限りは、米国は関税水準を上げる事を厭わないだろう。米中、譲れないのは必然で、第三者にスケープゴートを求めない限りは(これが一番怖くて、当初恐れられていた事だが)、今の調子で悪化の一途を辿るんだろう。

カテゴリー: 未分類 | コメントをどうぞ

1次元のnumpy.ndarrayから対となる組み合わせを生成する効率的な方法

Fast (numpy) pairwise combination generation from 1-dimensional array (pandas index) – StackOverflow

組み合わせは直積集合から上三角行列を求めるイメージ.

import numpy as np


def numpy_combinations(arr):
    r, c = np.triu_indices(len(arr), 1)
    return np.stack((arr[r], arr[c]), 1)


a = np.array([1, 2, 3, 4])
numpy_combinations(a)
array([[1, 2],
       [1, 3],
       [1, 4],
       [2, 3],
       [2, 4],
       [3, 4]])
from numba import jit


@jit(nopython=True, parallel=True, fastmath=True)
def pairwise_combs(a):
    n = len(a)
    L = n*(n-1)//2
    out = np.empty((L,2),dtype=a.dtype)
    iterID = 0
    for i in range(n):
        for j in range(i+1,n):
            out[iterID,0] = a[i]
            out[iterID,1] = a[j]
            iterID += 1
    return out
a = np.random.rand(1000)
%timeit pairwise_combs(a)
%timeit numpy_combinations(a)
a = np.random.rand(5000)
%timeit pairwise_combs(a)
%timeit numpy_combinations(a)
100 loops, best of 3: 3.63 ms per loop
100 loops, best of 3: 18.1 ms per loop
10 loops, best of 3: 47.8 ms per loop
1 loop, best of 3: 336 ms per loop
カテゴリー: 未分類 | コメントをどうぞ

任意のインデックス配列に基づいてマスクアレイを求める

Numpy – how to convert an array of vector indices to a mask? – StackOverflow

シンプルが一番.凸凹なインデックス操作は,並列化は難しくピュアに処理した方が良いので,リストに直してlinear indexing.

import numpy as np


def create_mask(ind, c=8):
    m = np.zeros((len(ind), c), bool)
    idx = [v+i*c for i, l in enumerate(ind.tolist()) for v in l]
    m.flat[idx] = True
    return m


def create_mask2(indices, m):
    mask = np.zeros((len(indices), m), dtype=bool)
    for i, idx in enumerate(indices):
        mask[i, idx] = True
    return mask


def mask_from_indices(indices, ncols=None):
    # Extract column indices
    col_idx = np.concatenate(indices)

    # If number of cols is not given, infer it based on max column index
    if ncols is None:
        ncols = col_idx.max()+1

    # Length of indices, to be used as no. of rows in o/p
    n = len(indices)

    # Initialize o/p array
    out = np.zeros((n,ncols), dtype=bool)

    # Lengths of each index element that represents each group of col indices
    lens = np.array(list(map(len,indices)))

    # Use np.repeat to generate all row indices
    row_idx = np.repeat(np.arange(len(lens)),lens)

    # Finally use row, col indices to set True values
    out[row_idx,col_idx] = 1
    return out    


ind = np.array([[2, 0],[0],[4, 7, 1]])
display(create_mask(ind))

%timeit create_mask(ind)
%timeit create_mask2(ind, 8)
%timeit mask_from_indices(ind)

ind = np.concatenate([ind]*1000)
%timeit create_mask(ind)
%timeit create_mask2(ind, 8)
%timeit mask_from_indices(ind)
array([[ True, False,  True, False, False, False, False, False],
       [ True, False, False, False, False, False, False, False],
       [False,  True, False, False,  True, False, False,  True]])

100000 loops, best of 3: 3.88 µs per loop
100000 loops, best of 3: 8.32 µs per loop
100000 loops, best of 3: 14.3 µs per loop

1000 loops, best of 3: 1.53 ms per loop
100 loops, best of 3: 6.2 ms per loop
100 loops, best of 3: 2.91 ms per loop
カテゴリー: 未分類 | コメントをどうぞ

食べてはいけない「食べ物」なんて無い

やれ農薬だ遺伝子組換えだ添加物だ……と気にしだすと枚挙に暇がない.そもそも,この手の研究は米国発のものが多く,日本と米国では事情が大きく異なるので,一概には云えないが,それをそのまま日本向けに発信している記事も多い.この手の記事をみて思うのは,「食べ物」に食べてはいけないものなんて無い.エビデンスとして有意にリスクがある,負のエフェクトがある,そうだとして,

……冷蔵庫が壊れた\(^o^)/

カテゴリー: 未分類 | コメントをどうぞ