ビッグデータ (8): Pandas の基本アプリケーションを詳しく解説 (5)

コラム紹介

私自身の経験と社内資料でまとめられたPythonチュートリアルを組み合わせることで、1日3~5章、最短1か月でPythonの学習を総合的に完了し、実践的な開発を行うことができます。上司になろう!来て!巻き上げる!

すべての記事については、コラム「Python フルスタック チュートリアル (基礎 0)」
を参照してください。最新の更新情報「大昌試験で頻繁に聞かれる面接の質問の詳細な説明」を参照してください。このコラムでは、高頻度の面接質問に対する詳細な回答を提供します。 - 近年の頻度テストを、あなた自身の長年の実務経験、および同僚のリーダーの指導と組み合わせて実施しました。テストや Python を勉強している学生が面接をスムーズに通過し、満足のいく内定を獲得できるように支援することを目的としています。



Pandasの基本的な使い方を詳しく解説 (5)

データフレームのアプリケーション

ウィンドウ計算

DataFrameオブジェクトrollingメソッドを使用すると、ウィンドウにデータを配置し、関数を使用してウィンドウ内のデータを操作および処理できます。たとえば、ある銘柄の最近のデータを取得し、5 日移動平均と 10 日移動平均を作成したい場合、最初にウィンドウを設定してから計算を実行する必要があります。サードパーティライブラリを利用してpandas-datareader、一定期間内の指定銘柄のデータを取得することができます。具体的な操作は以下のとおりです。

pandas-datareaderサードパーティのライブラリをインストールします。

pip install pandas-datareader

pandas-datareaderBaidu (銘柄コード: BIDU) の最新株価データは、が提供するget_data_stooqStooq Web サイトから取得します

import pandas_datareader as pdr

baidu_df = pdr.get_data_stooq('BIDU', start='2021-11-22', end='2021-12-7')
baidu_df.sort_index(inplace=True)
baidu_df

出力:

ここに画像の説明を挿入

上に、の5 つの列DataFrameがあり、それぞれコードストックの始値、高値、安値、終値、取引高を表しています 次に、Baidu の株価データに対してウィンドウ計算を実行します。OpenHighLowCloseVolume

baidu_df.rolling(5).mean()

出力:

上のClose列のデータは、必要な 5 日移動平均です。もちろん、次のメソッドを使用して、Close列に対応するSeriesオブジェクトの 5 日移動平均を直接計算することもできます。

baidu_df.Close.rolling(5).mean()

出力:

Date
2021-11-22        NaN
2021-11-23        NaN
2021-11-24        NaN
2021-11-26        NaN
2021-11-29    150.608
2021-11-30    151.014
2021-12-01    150.682
2021-12-02    150.196
2021-12-03    147.062
2021-12-06    146.534
2021-12-07    146.544
Name: Close, dtype: float64

適合性判定

統計学では、通常、共分散 (共分散) を使用して、2 つの確率変数の同時変動を測定します。変数XXの場合Xのより大きな値は主に別の変数YYYのより大きな値は両方のより小さな値に対応し、2 つの変数は同様に動作する傾向があり、共分散は正になります。1 つの変数のより大きな値がもう 1 つの変数のより小さな値にほぼ対応する場合、2 つの変数は負の共分散で反対の動作を示す傾向があります。簡単に言えば、共分散の符号は 2 つの変数がどのように関連しているかを示します。分散は共分散の特殊なケースであり、変数とそれ自体の共分散です。

cov ( X , Y ) = E ( ( X − μ ) ( Y − υ ) ) = E ( X ⋅ Y ) − μ υ cov(X,Y) = E((X − \mu)(Y - \upsilon) )) = E(X \cdot Y) - \mu\upsilonco v ( X ,=そして(( Xm ) ( Y))=E ( X

XXならXYYYが統計的に独立している場合、 XXの場合、2 つの共分散は 0 になります。XYYYが独立している場合

E ( X ⋅ Y ) = E ( X ) ⋅ E ( Y ) = μ υ E(X \cdot Y) = E(X) \cdot E(Y) = \mu\upsilonE ( X=E ( X )E (および)=

共分散の大きさは変数のサイズに依存するため、通常は解釈が容易ではありませんが、正規形での共分散の大きさは 2 つの変数間の線形関係の強さを示すことができます。統計学では、ピアソン積率相関係数は共分散の正規形であり、2 つの変数XXを測定するために使用されます。XYYY間の相関度-11

ρ X , Y = cov ( X , Y ) σ X σ Y \rho{X,Y} = \frac {cov(X, Y)} {\sigma_{X}\sigma_{Y}}ρ X Y=p×pco v ( X ,

標本の共分散と標準偏差を推定すると、通常ギリシャ文字ρ \rhoを使用して標本のピアソン係数を取得できます。ρは言いました。

ρ = ∑ i = 1 n ( X i − X ˉ ) ( Y i − Y ˉ ) ∑ i = 1 n ( X i − X ˉ ) 2 ∑ i = 1 n ( Y i − Y ˉ ) 2 \rho = \frac {\sum_{i=1}^{n}(X_i - \bar{X})(Y_i - \bar{Y})} {\sqrt{\sum_{i=1}^{n}(X_i - \bar{X})^2} \sqrt{\sum_{i=1}^{n}(Y_i - \bar{Y})^2}}r=i = 1( X私はバツˉ )2 i = 1( Y私はYˉ )2 i = 1( X私はバツˉ )(そして私はYˉ )

ρ \rhoを使用します指標の相関性をρ値で判断する場合は、次の2つのステップに従います。

  1. 指標が正の相関があるか、負の相関があるか、相関していないかを判断します。
    • $ \rho \gt 0 $ の場合、変数は正の相関がある、つまり 2 つの傾向が一致していると見なされます。
    • $ \rho \lt 0 $ の場合、変数は負の相関関係にある、つまり 2 つの傾向が逆であると考えられます。
    • $ \rho = 0 $ の場合、変数は相関していないと考えられますが、2 つの指標が統計的に独立していることを意味するわけではありません。
  2. 指標間の相関の程度を判断します。
    • $\rho$ の絶対値が $[0.6,1]$ の間にある場合、変数には強い相関があるとみなされます。
    • $ \rho $ の絶対値が $ [0.1,0.6) $ の間にある場合、変数間の相関は弱いと考えられます。
    • $\rho$ の絶対値が $[0,0.1)$ の間にある場合、変数間に相関はないと考えられます。

ピアソンの相関係数は以下に適用されます。

  1. 2 つの変数の間には線形関係があり、両方とも連続データです。
  2. 2 つの変数の母集団は正規分布しているか、ほぼ正規で単峰性です。
  3. 2 つの変数の観測値はペアになり、観測値の各ペアは互いに独立しています。

DataFrameオブジェクトのcovメソッドとメソッドcorrは、共分散と相関係数をそれぞれ計算するために使用されます。corrメソッドの最初のパラメーターmethodのデフォルト値pearsonは、ピアソン相関係数の計算を示します。さらに、ピアソン相関係数を指定kendallまたはspearman取得することもできます。 Kendall 係数または Speier Mann 順位相関係数。

次に、boston_house_price.csv有名なボストンの住宅価格データ セットをという名前のファイルから取得して作成しますDataFramecorrこのメソッドを使用して、住宅価格に影響を与える可能性のある要因のどれが13住宅価格と正または負の相関関係があるかを計算します。コードは次のとおりです。

boston_df = pd.read_csv('data/csv/boston_house_price.csv')
boston_df.corr()

:上記の例で CSV ファイルが必要な場合は、次の Baidu クラウド ディスク アドレスから取得できます。データは「ゼロから学ぶデータ分析」のディレクトリにあります。リンク: https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g、抽出コード: e7b4。

出力:

ここに画像の説明を挿入


スピアマンの相関係数は、2 つの変数の観測値がペアの段階的データであるか、連続変数の観測データから変換された段階的データである限り、2 つの変数に関係なく、データ条件に対するピアソンの相関係数ほど厳密ではありません。全体の分布の形状は次のとおりです。サンプル サイズの大きさはすべて、スピアマンの順位相関係数を使用して調べることができます。スピアマン相関係数は次の方法で計算します。

boston_df.corr('spearman')

出力:

Notebook または JupyterLab では、PRICE列にグラデーション カラーを追加し、その色を使用して、住宅価格と負の相関がある列、正の相関がある列、および相関がない列を視覚的に表示できます。オブジェクト プロパティのメソッドでこの操作を完了DataFrameできstyleますbackground_gradient。コードは次のとおりです。

boston_df.corr('spearman').style.background_gradient('RdYlBu', subset=['PRICE'])

上記コードの代表の色RdYlBuは、相関係数のデータ値が に近いほど1赤に近づき、データ値が に近いほど1青に近づき、データ値が添付ファイル0黄色です。

plt.get_cmap('RdYlBu')

ここに画像の説明を挿入

インデックスの適用

オブジェクトのインデックス作成サービスを提供するIndex型をもう一度見てみましょう。一般的に使用される型は次のとおりです。SeriesDataFrameIndex

範囲インデックス (RangeIndex)

コード:

sales_data = np.random.randint(400, 1000, 12)
month_index = pd.RangeIndex(1, 13, name='月份')
ser = pd.Series(data=sales_data, index=month_index)
ser

出力:

月份
1     703
2     705
3     557
4     943
5     961
6     615
7     788
8     985
9     921
10    951
11    874
12    609
dtype: int64

カテゴリインデックス

コード:

cate_index = pd.CategoricalIndex(
    ['苹果', '香蕉', '苹果', '苹果', '桃子', '香蕉'],
    ordered=True,
    categories=['苹果', '香蕉', '桃子']
)
ser = pd.Series(data=amount, index=cate_index)
ser

出力:

苹果    6
香蕉    6
苹果    7
苹果    6
桃子    8
香蕉    6
dtype: int64

コード:

ser.groupby(level=0).sum()

出力:

苹果    19
香蕉    12
桃子     8
dtype: int64

複数レベルのインデックス (MultiIndex)

コード:

ids = np.arange(1001, 1006)
sms = ['期中', '期末']
index = pd.MultiIndex.from_product((ids, sms), names=['学号', '学期'])
courses = ['语文', '数学', '英语']
scores = np.random.randint(60, 101, (10, 3))
df = pd.DataFrame(data=scores, columns=courses, index=index)
df

説明: 上記のコードは2 つのデータセットのデカルト積を通じてマルチレベルインデックスを構築するMultiIndexクラスメソッドを使用していますfrom_productidssms

出力:

             语文 数学 英语
学号	学期			
1001  期中	93	77	60
      期末	93	98	84
1002  期中	64	78	71
      期末	70	71	97
1003  期中	72	88	97
      期末	99	100	63
1004  期中	80	71	61
      期末	91	62	72
1005  期中	82	95	67
      期末	84	78	86

コード:

# 计算每个学生的成绩,期中占25%,期末占75%
df.groupby(level=0).agg(lambda x: x.values[0] * 0.25 + x.values[1] * 0.75)

出力:

        语文    数学    英语
学号			
1001	93.00	92.75	78.00
1002	68.50	72.75	90.50
1003	92.25	97.00	71.50
1004	88.25	64.25	69.25
1005	83.50	82.25	81.25

日時インデックス (DatetimeIndex)

  1. 関数を通じてdate_range()日時インデックスを作成できます。コードを以下に示します。

    コード:

    pd.date_range('2021-1-1', '2021-6-1', periods=10)
    

    出力:

    DatetimeIndex(['2021-01-01 00:00:00', '2021-01-17 18:40:00',
                   '2021-02-03 13:20:00', '2021-02-20 08:00:00',
                   '2021-03-09 02:40:00', '2021-03-25 21:20:00',
                   '2021-04-11 16:00:00', '2021-04-28 10:40:00',
                   '2021-05-15 05:20:00', '2021-06-01 00:00:00'],
                  dtype='datetime64[ns]', freq=None)
    

    コード:

    pd.date_range('2021-1-1', '2021-6-1', freq='W')
    

    出力:

    DatetimeIndex(['2021-01-03', '2021-01-10', '2021-01-17', '2021-01-24',
                   '2021-01-31', '2021-02-07', '2021-02-14', '2021-02-21',
                   '2021-02-28', '2021-03-07', '2021-03-14', '2021-03-21',
                   '2021-03-28', '2021-04-04', '2021-04-11', '2021-04-18',
                   '2021-04-25', '2021-05-02', '2021-05-09', '2021-05-16',
                   '2021-05-23', '2021-05-30'],
                  dtype='datetime64[ns]', freq='W-SUN')
    
  2. DateOffsetにより時差の設定やDatetimeIndex計算を行うことができますが、具体的な操作は以下の通りです。

    コード:

    index = pd.date_range('2021-1-1', '2021-6-1', freq='W')
    index - pd.DateOffset(days=2)
    

    出力:

    DatetimeIndex(['2021-01-01', '2021-01-08', '2021-01-15', '2021-01-22',
                   '2021-01-29', '2021-02-05', '2021-02-12', '2021-02-19',
                   '2021-02-26', '2021-03-05', '2021-03-12', '2021-03-19',
                   '2021-03-26', '2021-04-02', '2021-04-09', '2021-04-16',
                   '2021-04-23', '2021-04-30', '2021-05-07', '2021-05-14',
                   '2021-05-21', '2021-05-28'],
                  dtype='datetime64[ns]', freq=None)
    

    コード:

    index + pd.DateOffset(days=2)
    

    出力:

    DatetimeIndex(['2021-01-05', '2021-01-12', '2021-01-19', '2021-01-26',
                   '2021-02-02', '2021-02-09', '2021-02-16', '2021-02-23',
                   '2021-03-02', '2021-03-09', '2021-03-16', '2021-03-23',
                   '2021-03-30', '2021-04-06', '2021-04-13', '2021-04-20',
                   '2021-04-27', '2021-05-04', '2021-05-11', '2021-05-18',
                   '2021-05-25', '2021-06-01'],
                  dtype='datetime64[ns]', freq=None)
    
  3. DatatimeIndexデータは、次のような型に関連付けられたメソッドを使用して操作できます。

    • shift()方法: データを時間内で前後にシフトすることにより、上記の Baidu 株データを例として取り上げます。コードは次のとおりです。

      コード:

      baidu_df.shift(3, fill_value=0)
      

      出力:

      コード:

      baidu_df.shift(-1, fill_value=0)
      

      出力:

    • asfreq()方法: 時間周波数を指定して、対応するデータを抽出します。コードは次のとおりです。

      コード:

      baidu_df.asfreq('5D')
      

      出力:

ここに画像の説明を挿入

コード:

       baidu_df.asfreq('5D', method='ffill')
- `resample()`方法:基于时间对数据进行重采样,相当于根据时间周期对数据进行了分组操作,代码如下所示。

    代码:

    ```python
    baidu_df.resample('1M').mean()
    ```

> **说明**:上面的代码中,`W`表示一周,`5D`表示`5`天,`1M`表示`1`个月。
  1. タイムゾーンの変換

    • タイムゾーン情報を取得します。

      import pytz
      
      pytz.common_timezones
      
    • tz_localize()方法: 日時をローカライズします。

      コード:

      baidu_df = baidu_df.tz_localize('Asia/Chongqing')
      baidu_df
      

      出力:

    • tz_convert()方法: タイムゾーンを変換します。

      コード:

      baidu_df.tz_convert('America/New_York')
      

      出力:

おすすめ

転載: blog.csdn.net/ml202187/article/details/132707836