2022年12月2日金曜日

サイコロ振って中心極限定理を確かめる

 中心極限定理とは、

中心極限定理は標本平均と母平均との誤差を論ずるものである。多くの場合、母集団の分布がどんな分布であっても、その誤差は標本の大きさを大きくしたとき近似的に正規分布に従う。wikipedia

とあるように標本を大きくしていくと正規分布に近づくという定理です。

サイコロを想定してpythonで表現してみます。

numpyのrandintでランダムに1〜6の目を出すサイコロを回数分出します。

とりあえず10000回くらい振ってみましょう。

#! /usr/bin/env python

# -*- coding:utf-8 -*-

import pandas as pd
import numpy as np


print("[dice]")
print()

# サイコロの目(1〜6)をランダムにnumpy配列で出力
pip = np.random.randint(1, 7, 10000)

# 作られた配列の先頭を表示
print(pip[:10])
print()
print(f"平均値: %f" % pip.mean())
print()

そしてmatplotlibのヒストグラムで分布を見てみましょう。

#ヒストグラムでプロット
import matplotlib.pyplot as plt
import japanize_matplotlib

plt.title("サイコロ")
plt.xlabel("出た目")
plt.ylabel("出た回数")
plt.hist(pip, bins=6, ec="k")
plt.show()

平均値: 3.502500
1~6までほぼ同じ回数出てるのが分かります。
期待値は(1+2+3+4+5+6) / 6 = 7/2 = 3.5なので平均値もほぼ合ってます。
サイコロ1つなら感覚的にもつかみやすいでしょう。

次に2個のサイコロを振ってみます。



import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
#最瀕値を出すために使用
import statistics

#振る回数
roll = 10000

#1つ目のサイコロ
pip = np.random.randint(1, 7, roll)
#2こ目のサイコロの
pip2 = np.random.randint(1, 7, roll)

print("[dice]")
print()
#先頭10回分の目
print(pip[:10])
print(pip2[:10])

sm = pip + pip2
print()
print(f"平均値: %f" % sm.mean())
print(f'最瀕値: %f' % statistics.mode(sm))

plt.title("サイコロ")
plt.xlabel("出た目")
plt.ylabel("出た回数")
plt.hist(sm, bins=11, ec="k")

plt.show()

平均値: 7.044900

最瀕値: 7.000000


サイコロを2つにすると足した7が一番多い山のような形になることが分かります。




振るサイコロ6個の目の合計ではどうでしょう?

サイコロ6つだと、出る目は6の6乗の46656とおりになるので、それ以上回数を振らないとまばらな結果になりそうです。

10万回くらい振ってみましょう

#! /usr/bin/env python

# -*- coding:utf-8 -*-

#
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
#最瀕値を出すために使用
import statistics

#振る回数
roll = 100000

# ndarrayの初期化
sm = np.zeros(roll)

print("[dice]")


for i in range(6):
    pip = np.random.randint(1, 7, roll)
    
    #出ための先頭10回
    print(pip[:10])
    sm += pip

print()
print(f"平均値: %f" % sm.mean())
print(f"最瀕値: %f" % statistics.mode(sm))
print()
#出ための合計の種類
print(np.unique(sm))


plt.figure(figsize=(10, 8))
plt.title("サイコロ")
plt.xlabel("出た目の合計")
plt.ylabel("出た回数")
plt.grid()
plt.hist(sm, bins=31, ec="k")

plt.show()

平均値: 21.013420

最瀕値: 21.000000



ほぼ正規分布に近づきました。

標本を大きくすれば正規分布に近づいていくという中心極限定理が感覚的につかめました。

2022年11月19日土曜日

form要素のinput type="button" と button要素のJavaScriptでの挙動の違い

 フォーム要素でボタンを使用する場合、現在ではbutton要素が推奨されてます。

理由はそこら中で書いてありますが、CSSで疑似要素が使えたり、デザイン性で柔軟だからです。

ここではJavaScriptによる違いを書きます。


まずは、何もないbutton要素

  

何も指定しないと、type="submit"と同じ送信になり、formのaction属性と同じになります。

なのでtype="button"にしたい場合は属性を書かなければなりません。

button要素の中のテキストを取得したい場合は、input要素のようにvalueでは取得できません。button要素の文字は、タグで挟まれてるのでtextContentで取得します。


button要素でカウンターを作る例

  

冷静に考えたら分かりますね。

submitで値を送信したい場合は、そのままvalue属性が書けます。

2022年9月15日木曜日

PythonのMeCab使用でエラーが出る

 MeCabは日本語形態素解析システムの主要パッケージで、日本語解析によく使われます

しかしバージョンが合ってないとただimportしただけではエラーが出ます。


Python3の pip install mecab でエラーが出た場合は



$ pip install mecab-python3

$ pip install unidic-lite


でインストールしてください。


unidic-liteは辞書です。


----------------------------------------------------------


Failed initializing MeCab. Please see the README for possible solutions:


    https://github.com/SamuraiT/mecab-python3#common-issues


If you are still having trouble, please file an issue here, and include the

ERROR DETAILS below:


    https://github.com/SamuraiT/mecab-python3/issues


issueを英語で書く必要はありません。


------------------- ERROR DETAILS ------------------------


のようなエラーが出た場合は辞書がインストールされてません

2022年8月28日日曜日

線形回帰を求める(2)

前回は散布図で、都道府県別人口と平均年収をプロットしました。 後は線形回帰分析するだけです。 線形回帰はsklearnライブラリを使用することで簡単に分析できます。
from sklearn.linear_model import LinearRegression

X = df3[['人口']]
y = df3['平均年収']

# モデルの作成
model = LinearRegression()

model.fit(X, y)


print("傾き: %f" % model.coef_)
print("切片: %f" % model.intercept_)
print()
print("決定係数: %f" % model.score(X, y))


y = ax + b 

傾き: 0.124986 
切片: 4101341.031155 

決定係数: 0.605080


sklearnを使うだけで、簡単に単回帰分析出来ます。

predictを使い回帰直線を引きます。

人口と平均年収の関係はありそうですね。

predict = model.predict(X)

plt.plot(x, predict, color="coral")

全コード
#! /usr/bin/env python

# -*- coding:utf-8 -*-

#
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.linear_model import LinearRegression

#日本円表示を数値に
def currencyToNumber(val):
    # 万と千以下に分ける
    man, sen = val.split("万")

    #円を取り除き,千以下を0埋め
    sen = sen.replace("円", "")
    sen = sen.zfill(4)

    man += sen
    return int(man)
    

# 数値のカンマを取り除く
def dropComma(val):
    val = val.replace(",", "")

    return float(val)

data1 = "../data/prefecture1.csv"
data2 = "../data/income_pref.csv"

df1 = pd.read_csv(data1)
df2 = pd.read_csv(data2)

print(df1.head())
print()
print(df2.head())
print()

df3 = pd.merge(df1, df2)

print(df3.head())
print()

df3['平均年収'] = df3['平均年収'].apply(currencyToNumber)
df3['人口'] = df3['人口'].apply(dropComma)

x = df3['人口']
X = df3[['人口']]
y = df3['平均年収']


# モデルの作成
model = LinearRegression()

model.fit(X, y)


print("傾き: %f" % model.coef_)
print("切片: %f" % model.intercept_)
print()
print("決定係数: %f" % model.score(X, y))

pref_name = df3['都道府県']

plt.figure(figsize=(16, 10))

predict = model.predict(X)


plt.title("人口と平均年収のグラフ", fontsize=24)
plt.scatter(x, y)
plt.grid()

plt.xlabel("人口(人)", fontsize=18)
plt.ylabel("平均年収(円)", fontsize=18)

plt.plot(x, predict, color="coral")

for i, pref in enumerate(pref_name):
    plt.annotate(pref, (x[i], y[i]))

nums = plt.gca().get_yticks()
plt.gca().set_yticklabels(['{:,.0f}'.format(i) for i in nums])
nums = plt.gca().get_xticks()
plt.gca().set_xticklabels(['{:,.0f}'.format(i) for i in nums])

out = "img/prefecture_data1.png"
plt.savefig(out)
plt.show()

線形回帰を求める(1)

 色々なデータに触れると、相関関係があるのか確かめたくなります。

最も簡単な分析が線形回帰でよく使われています。

今回は、こちらのデータを使い都道府県と平均年収の関係を使って簡単なテストをしてみます。

import pandas as pd

data1 = "prefecture1.csv"
data2 = "income_pref.csv"

df1 = pd.read_csv(data1)
df2 = pd.read_csv(data2)

print(df1.head())
print(df2.head())

  都道府県 県庁所在地          人口          面積     人口密度
0  北海道   札幌市  5,181,776   83,424.41    66.08 
1  青森県   青森市  1,221,288    9,645.62   126.62 
2  岩手県   盛岡市  1,196,277   15,275.01    78.32 
3  宮城県   仙台市  2,290,036    7,282.29   314.47 
4  秋田県   秋田市    944,902   11,637.52    81.19 

   順位  都道府県       平均年収
0  1位   東京都  584万9300円
1  2位  神奈川県  541万5500円
2  3位   愛知県   524万400円
3  4位   大阪府  511万8600円
4  5位   兵庫県  495万2100円


データフレームをマージし、数値で処理出来るようにコンマなど取り払います。
説明変数xは人口、目的変数yは平均年収の関係を調べましょう。



# データのマージ
df3 = pd.merge(df1, df2)



#日本円表示を数値に
def currencyToNumber(val):
    # 万と千以下に分ける
    man, sen = val.split("万")

    #円を取り除き,千以下を0埋め
    sen = sen.replace("円", "")
    sen = sen.zfill(4)

    man += sen
    return int(man)
    

# 数値のカンマを取り除く
def dropComma(val):
    val = val.replace(",", "")

    return float(val)
    
    
    
# 関数を適用して数値にする
df3['平均年収'] = df3['平均年収'].apply(currencyToNumber)
df3['人口'] = df3['人口'].apply(dropComma)

# プロットする場合はSeriesで小文字のx
x = df3['人口']
# 線形回帰する場合はDataFrameで大文字のX
X = df3[['人口']]

# 目的変数y
y = df3['平均年収']


出来上がったデータを散布図としてプロットします。

import matplotlib.pyplot as plt
import japanize_matplotlib


# 県名が見やすいように大きめのグラフに
plt.figure(figsize=(16, 10))


plt.title("人口と平均年収のグラフ", fontsize=24)

#散布図
plt.scatter(x, y)
plt.grid()

plt.xlabel("人口(人)", fontsize=18)
plt.ylabel("平均年収(円)", fontsize=18)

# 点それぞれに中訳を入れる annotate
pref_name = df3['都道府県']

for i, pref in enumerate(pref_name):
    plt.annotate(pref, (x[i], y[i]))

# 数値が大きいと指数表示になるので、分かりやすく整数表示にする
nums = plt.gca().get_yticks()
plt.gca().set_yticklabels(['{:,.0f}'.format(i) for i in nums])
nums = plt.gca().get_xticks()
plt.gca().set_xticklabels(['{:,.0f}'.format(i) for i in nums])


plt.show()

2022年6月17日金曜日

NBA選手データを整える

 NBAはデータを豊富に提供しているので分析に適しています。

ただし、身長や体重が日本と異なる表記なので、日本で分かりやすいようにデータを変換してみます。

ついでに欠損値除去や微調整してデータを取り扱い安くします。


まず、元データ player_data.csv の中身を確認します。

filename = "player_data.csv"

df = pd.read_csv(filename)

print(df.head())
print()
print(df.shape)
print()
print(df.info())


                  name  year_start  year_end position height  weight        birth_date                                college

0       Alaa Abdelnaby        1991      1995      F-C   6-10   240.0     June 24, 1968                        Duke University

1      Zaid Abdul-Aziz        1969      1978      C-F    6-9   235.0     April 7, 1946                  Iowa State University

2  Kareem Abdul-Jabbar        1970      1989        C    7-2   225.0    April 16, 1947  University of California, Los Angeles

3   Mahmoud Abdul-Rauf        1991      2001        G    6-1   162.0     March 9, 1969             Louisiana State University

4    Tariq Abdul-Wahad        1998      2003        F    6-6   223.0  November 3, 1974              San Jose State University


(4550, 8)


<class 'pandas.core.frame.DataFrame'>

RangeIndex: 4550 entries, 0 to 4549

Data columns (total 8 columns):

 #   Column      Non-Null Count  Dtype  

---  ------      --------------  -----  

 0   name        4550 non-null   object 

 1   year_start  4550 non-null   int64  

 2   year_end    4550 non-null   int64  

 3   position    4549 non-null   object 

 4   height      4549 non-null   object 

 5   weight      4544 non-null   float64

 6   birth_date  4519 non-null   object 

 7   college     4248 non-null   object 

dtypes: float64(1), int64(2), object(5)


データは4550件、birth_dateやweightに欠損値が散見されます。


print(df[df['weight'].isnull()])
print()
print(df[df['birth_date'].isnull()].sort_values('year_end', ascending=False))

df2 = df.dropna(how="any")
欠損値データを確認すると昔の人ばかりなので、昔の年代を分析しない場合は削除して構わないでしょう。dropna(how="any")で欠損値を取り除いたデータフレームにします。


# 1foot = 30.48, 1inch = 2.54cm
FOOT= 30.48
INCH = 2.54

# 1pond = 0.4536kg
LB = 0.4536

# フィートをセンチに
def toCenti(height):

    ft, inc = height.split("-")
    cent = int(ft) * FOOT + int(inc) * INCH

    return round(cent, 2)


# ポンドをキログラムに
def toKilogram(weight):

    kg = weight * LB
    
    return round(kg, 2)
    
 
# 以上の関数を身長体重データに適用させる
df2['height'] = df2['height'].apply(toCenti)
df2['weight'] = df2['weight'].apply(toKilogram)


print(df2.head())
print()
print(df2.shape)



                  name  year_start  year_end position  height  weight        birth_date                                college
0       Alaa Abdelnaby        1991      1995      F-C  208.28  108.86     June 24, 1968                        Duke University
1      Zaid Abdul-Aziz        1969      1978      C-F  205.74  106.60     April 7, 1946                  Iowa State University
2  Kareem Abdul-Jabbar        1970      1989        C  218.44  102.06    April 16, 1947  University of California, Los Angeles
3   Mahmoud Abdul-Rauf        1991      2001        G  185.42   73.48     March 9, 1969             Louisiana State University
4    Tariq Abdul-Wahad        1998      2003        F  198.12  101.15  November 3, 1974              San Jose State University

(4213, 8)

変換できました。

player_data_a.csv
完成データは 

2022年6月11日土曜日

matplotlibで一次関数グラフを作る

前回、matplotlibで方眼紙の様な正方形グリッドが作れたら、数学の関数グラフも容易に作れます。

matplotlibはデータをプロットするライブラリなので式をそのままグラフにするのはひと工夫必要です。

今度はオブジェクト指向で関数グラフを作り、一次関数をプロットします。


# オブジェクト指向でグラフ作成
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
 
# これで正方形になります。
ax.set_aspect('equal', adjustable='box')

# 表示する幅
ax.set_xlim(-10, 11)
ax.set_ylim(-10, 11)

# グラフの刻み
ax.set_xticks(np.arange(-10, 10, 5))
ax.set_yticks(np.arange(-10, 10, 5))
 
# 補助線をonにします
ax.minorticks_on() 

# グリッドの主線と補助線
ax.grid(which="major", color="black", alpha=0.5)
ax.grid(which="minor", color="gray", linestyle="--", alpha=0.5)

# 数値表示を0に合わせます。
ax.spines['bottom'].set_position("zero")
ax.spines['left'].set_position("zero")
 

今回はオブジェクト指向のプロットなので若干書き方が違います。特に正方形にするには set_aspect('equal', adjustable='box')という指定をします。 またグラフの数値を0に合わせるため、spines.set_position 関数で zero を指定します。

関数グラフの方眼紙が出来たら、後は一次関数のデータを生成する関数を作ればいいだけ。

# 一次関数のデータを作る関数 
def linear(a, b, ran=np.arange(-10,10)):

    arr = []
    for x in ran:
        y = x*a + b
        arr.append(y)

	# 式から配列データを返します。
    return arr
これを応用すれば二次関数や他の関数もプロットできますね。


[完成形]
#! /usr/bin/env python

# -*- coding:utf-8 -*-
 
 
import numpy as np
import matplotlib.pyplot as plt


# 一次関数のデータを作る関数 
def linear(a, b, ran=np.arange(-10,10)):

    arr = []
    for x in ran:
        y = x*a + b
        arr.append(y)

	# 式から配列データを返します。
    return arr

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
 
# これで正方形になります。
ax.set_aspect('equal', adjustable='box')

# 表示する幅
ax.set_xlim(-10, 11)
ax.set_ylim(-10, 11)

# グラフの刻み
ax.set_xticks(np.arange(-10, 10, 5))
ax.set_yticks(np.arange(-10, 10, 5))
 
# 補助線をonにします
ax.minorticks_on() 

# グリッドの主線と補助線
ax.grid(which="major", color="black", alpha=0.5)
ax.grid(which="minor", color="gray", linestyle="--", alpha=0.5)

# 数値表示を0に合わせます。
ax.spines['bottom'].set_position("zero")
ax.spines['left'].set_position("zero")

x = np.arange(-10, 10)

# y = 2x + 3の一次関数を生成
y = linear(2, 3, x)
ax.plot(x, y)


plt.show()

2022年6月9日木曜日

matplotlibで方眼紙のようなグリッドを作る

Pythonのmatplotlibはグラフ描画のためのライブラリですが、描画はデータによって自動的に調整されるので、時には方眼紙のように正確なグリッドが欲しい場合もあります。

正方形の方眼紙のようなグリッドは、plt.axis("square")で正方形に、ticksでマス目を刻みます。

#! /usr/bin/env python

# -*- coding:utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt

# 正方形で表示
plt.axis("square")

# 表示範囲の指定
plt.xlim(-10, 10)
plt.ylim(-10, 10)

# 値の刻み
plt.xticks(np.arange(-10, 11, 5))
plt.yticks(np.arange(-10, 11, 5))

#grid マイナー線の指定をします
plt.minorticks_on()
plt.grid()
# マイナー線は破線で透明度50%
plt.grid(which="minor", color="gray", linestyle="--", alpha=0.5)

plt.show()
 
 
ポイントはaxis("square")です。これで数値通りの大きさで表示されます。
あとはxlimでX軸の、ylimでY軸のグラフの範囲、ticksで表示するメモリ数値の刻みを指定します。
グリッドの線はgrid関数で指定しますが、主線だけでなく副線も表示したい場合はminorticks_on関数を呼び出して表示します。
副線は同じgrid関数でwhich="minor"で呼び出します。
あとは"--"で破線、alphaで透明度など指定して好みの方眼紙に調整してください。



以上のようなグラフになります。


2022年5月21日土曜日

NBAデータから歴代得点王ランキングを出してみる

馴染みのあるデータや好きなスポーツのデータを扱ったりするとデータフレームを習得するのも楽しめていいですね。

今回はおなじくkaggleの NBA Players stats since 1950 から Seasons_Stats.csv を使用して歴代得点王を取り出したいと思います。


#! /usr/bin/env python

# -*- coding:utf-8 -*-

#
import pandas as pd
import numpy as np

filename = "../data/Seasons_Stats.csv"

print("[NBA]")
print()

df = pd.read_csv(filename, index_col=0)

print()

# 年間得点の多い順にソート
porder = df.sort_values('PTS', ascending=False)

# Year, Player, PTSのみのデータフレームにする
points = porder.loc[:, ['Year', 'Player', 'PTS']]

# Year, Player, PTSのみのDataFrame 数
print(points.shape)
print()

# 欠損値の削除
points = points.dropna()
print(points.shape)
print()

# 見やすいようにfloatからintへの変換
point = points.astype({'Year': 'int64', 'PTS': 'int64'})
print(points.dtypes)
print()
print(points.info())
print()

# 得点ランキングトップ50を表示する
points.reset_index(drop=True, inplace=True)
points.index = np.arange(1, len(points)+1)
print(points.head(50))


まず、年間得点(PTS)を sort_values() を使い得点の多い順(逆ソート)します。
得点だけのランキングなので記録年数(Year)、選手名(Player)、年間得点(PTS)だけのデータフレームを loc を使って切り出します。

このままだと年と年間得点もデータ型が float64 なのでintに変えたいと思いますが、欠損値があるのでデータ変換できません。
そこで先に欠損値行をdropna() で消します。
元の数(24691, 3) から (24624, 3) に減りました。
これで astype() を使い 年と年間得点を int に変換します。

もう一つソートされてもインデックスがそのままだと何の数字か分からないのでインデックスを reset_index() で振り直します。
インデックスをランキングにしたいなら0基準より1から数えたほうがいいでしょう。

すべて整ったら歴代得点ランキングトップ50を取り出してみます。

    Year                Player   PTS
1   1962     Wilt Chamberlain*  4029
2   1963     Wilt Chamberlain*  3586
3   1987       Michael Jordan*  3041
4   1961     Wilt Chamberlain*  3033
5   1964     Wilt Chamberlain*  2948
6   1988       Michael Jordan*  2868
7   2006           Kobe Bryant  2832
8   1975           Bob McAdoo*  2831
9   1972  Kareem Abdul-Jabbar*  2822
10  1967           Rick Barry*  2775
11  1990       Michael Jordan*  2753
12  1973       Tiny Archibald*  2719
13  1963         Elgin Baylor*  2719
14  1960     Wilt Chamberlain*  2707
15  1966     Wilt Chamberlain*  2649
16  1989       Michael Jordan*  2633
17  1971  Kareem Abdul-Jabbar*  2596
18  2014          Kevin Durant  2593
19  1980        George Gervin*  2585
20  1991       Michael Jordan*  2580
21  2017     Russell Westbrook  2558
22  1982        George Gervin*  2551
23  1993       Michael Jordan*  2541
24  1990          Karl Malone*  2540
25  1961         Elgin Baylor*  2538
26  1965     Wilt Chamberlain*  2534
27  1982         Moses Malone*  2520
28  1962         Walt Bellamy*  2495
29  1996       Michael Jordan*  2491
30  1964      Oscar Robertson*  2480
31  2006          LeBron James  2478
32  1966           Jerry West*  2476
33  2010          Kevin Durant  2472
34  2003           Kobe Bryant  2461
35  1982       Adrian Dantley*  2457
36  1981       Adrian Dantley*  2452
37  1975           Rick Barry*  2450
38  1962      Oscar Robertson*  2432
39  1997       Michael Jordan*  2431
40  2007           Kobe Bryant  2430
41  1962           Bob Pettit*  2429
42  1976           Bob McAdoo*  2427
43  1984       Adrian Dantley*  2418
44  1986         Alex English*  2414
45  1967      Oscar Robertson*  2412
46  2003         Tracy McGrady  2407
47  1992       Michael Jordan*  2404
48  1988    Dominique Wilkins*  2397
49  2009           Dwyane Wade  2386
50  1994       David Robinson*  2383


 Wilt Chamberlainの年間得点が異常と言われるほど凄い数字だというのが分かります。






 

NBAデータをDataFrameを使ってグループ分けをする

Pandasのデータフレームはデータ分析に適しています。

NBAデータから自分の取り出したいデータに分けてみます。

データ元は便利な kaggle から「NBA Players stats since 1950」というデータをお借りします。


Seasons_Stats.csvには1950-2017年まで(24691, 53)件という選手の膨大なデータがあります。


 #! /usr/bin/env python
 # -*- coding:utf-8 -*-
 
 #import pandas as pd
 import numpy as np
 
 filename = "Seasons_Stats.csv"
 
 df = pd.read_csv(filename)
 
 print(df.head())
 print()
 print(df.shape)
 print()


 Unnamed: 0    Year         Player Pos   Age  ...    STL   BLK    TOV     PF     PTS
9547        9547  1990.0     Mark Acres   C  27.0  ...   36.0  25.0   70.0  248.0   362.0
9548        9548  1990.0  Michael Adams  PG  27.0  ...  121.0   3.0  141.0  133.0 1221.0
9549        9549  1990.0   Mark Aguirre  SF  30.0  ...   34.0  19.0  121.0  201.0  1099.0
9550        9550  1990.0    Danny Ainge  PG  30.0  ...  113.0  18.0  185.0  238.0  1342.0
9551        9551  1990.0    Mark Alarie  PF  26.0  ...   60.0  39.0  101.0  219.0   860.0

(24691, 53)



これでは流石に大きすぎるので1990年代のデータだけ取り出してみましょう。

y1990 = df[df['Year'] == 1990]
y1990 = y1990.drop(y1990.columns[0], axis=1)
y1990 = y1990.reset_index(drop=True)

print(y1990.head())
print()
print(y1990.shape)
先頭のインデックスはいらないのでdrop関数で弾いて、reset_index関数で振り直しています。
引数のdrop=Trueは元のインデックスを残さないためのものです。


     Year         Player Pos   Age   Tm  ...    STL   BLK    TOV     PF     PTS
0  1990.0     Mark Acres   C  27.0  ORL  ...   36.0  25.0   70.0  248.0   362.0
1  1990.0  Michael Adams  PG  27.0  DEN  ...  121.0   3.0  141.0  133.0  1221.0
2  1990.0   Mark Aguirre  SF  30.0  DET  ...   34.0  19.0  121.0  201.0  1099.0
3  1990.0    Danny Ainge  PG  30.0  SAC  ...  113.0  18.0  185.0  238.0  1342.0
4  1990.0    Mark Alarie  PF  26.0  WSB  ...   60.0  39.0  101.0  219.0   860.0

(459, 52)

これで1990年のデータが取り出せました。

2022年3月5日土曜日

LaravelをApache2でルーティングさせる

Laravelは専用サーバでもApacheでも表示させることはできるが、Apacheでルーティングさせるにはrewrite機能が必要

そのためそのままでルーティングさせたページを表示してもNot Foundになる


$ apache2 -v
Server version: Apache/2.4.38 (Debian)


Debian系の場合Apache2の設定ファイルは /etc/apache2 にある apache2.conf
になる。(昔はhttpd.conf)

一枚に書かれていたhttpd.confと違いモジュール等がツリー形式にリンクされている。

/etc/apache2/
# |-- apache2.conf
# | `--  ports.conf
# |-- mods-enabled
# | |-- *.load
# | `-- *.conf
# |-- conf-enabled
# | `-- *.conf
# `-- sites-enabled
# `-- *.conf

モジュール有効化も直接書き換える形から a2enmod コマンドで有効化する形になっているので mods-available ディレクトリに rewrite.load があるか確認


$ ls mods-available/
..... request.load allowmethods.load     dav_lock.load
mime_magic.conf      rewrite.load

確認できたらモジュール有効化

$ sudo a2enmod rewrite

そして apache2.conf にある AllowOverride を All に書き換える

$ sudo vi /etc/apache2/apache2.conf

<Directory /var/www/>
        Options Indexes FollowSymLinks
        # AllowOverride None 
        AllowOverride All  # NoneからAllへと変更
        Require all granted
</Directory>


Apache2を再起動

$ sudo service apache2 restart

これでルーティングされたページを開いてもちゃんと表示される。