Skip to content

Instantly share code, notes, and snippets.

@genkuroki
Last active October 18, 2020 18:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save genkuroki/d500887a7574cc3f99f51f37dc10a5c2 to your computer and use it in GitHub Desktop.
Save genkuroki/d500887a7574cc3f99f51f37dc10a5c2 to your computer and use it in GitHub Desktop.
PyCall pybaseball example
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "# PandasからJuliaのデータフレームへの変換\n\n黒木玄\n\n2020-09-20\n\n次のリンク先を参考にした(そのままでは動かない):\n\n* https://discourse.julialang.org/t/converting-pandas-dataframe-returned-from-pycall-to-julia-dataframe/43001/10\n\npandasなどとJuliaのあいだの翻訳:\n\n* https://juliadata.github.io/DataFrames.jl/latest/man/comparisons/\n\n**2020-09-20の時点での結論:** 以下の方法を使う.\n\n```julia\nusing PyCall\npybaseball = pyimport(\"pybaseball\")\ndf_pandas = pybaseball.statcast(start_dt=\"2020-08-01\", end_dt=\"2020-08-02\")\n\nusing DataFrames\nusing Pandas: Pandas\n\nfunction pandas_to_julia(df_pandas)\n colnames = Symbol.(df_pandas.columns)\n data = Array(Pandas.DataFrame(df_pandas))\n DataFrame(data, colnames)\nend\n\ndf = pandas_to_julia(df_pandas)\n```\n\n**2020-10-19の時点での結論:** 以下の方法を使う.\n\n```julia\nusing PyCall\npybaseball = pyimport(\"pybaseball\")\ndf_pandas = pybaseball.statcast(start_dt=\"2020-08-01\", end_dt=\"2020-08-02\")\n\nusing DataFrames\nusing Pandas: Pandas\n\nfunction VectorOfVectors(x::Pandas.PandasWrapped)\n X = pyimport(\"numpy\").asarray(x.pyo)\n C = [@view(X[:,i]) for i in axes(X, 2)]\n typeof(X).parameters[1] == PyObject || return C\n [convert.(PyAny, c) for c in C]\nend\n\nfunction pandas_to_df(df_pandas)\n colnames = Symbol.(df_pandas.columns)\n data = VectorOfVectors(Pandas.DataFrame(df_pandas))\n DataFrame(data, colnames)\nend\n\ndf = pandas_to_df(df_pandas)\n```"
},
{
"metadata": {
"toc": true
},
"cell_type": "markdown",
"source": "<h1>Table of Contents<span class=\"tocSkip\"></span></h1>\n<div class=\"toc\"><ul class=\"toc-item\"><li><span><a href=\"#PyCall経由でpybaseballを使ってデータを取得\" data-toc-modified-id=\"PyCall経由でpybaseballを使ってデータを取得-1\"><span class=\"toc-item-num\">1&nbsp;&nbsp;</span>PyCall経由でpybaseballを使ってデータを取得</a></span></li><li><span><a href=\"#方法1-1\" data-toc-modified-id=\"方法1-1-2\"><span class=\"toc-item-num\">2&nbsp;&nbsp;</span>方法1-1</a></span></li><li><span><a href=\"#方法1-2\" data-toc-modified-id=\"方法1-2-3\"><span class=\"toc-item-num\">3&nbsp;&nbsp;</span>方法1-2</a></span></li><li><span><a href=\"#方法2:-Pandas.jlも使う方法\" data-toc-modified-id=\"方法2:-Pandas.jlも使う方法-4\"><span class=\"toc-item-num\">4&nbsp;&nbsp;</span>方法2: Pandas.jlも使う方法</a></span></li><li><span><a href=\"#試行錯誤\" data-toc-modified-id=\"試行錯誤-5\"><span class=\"toc-item-num\">5&nbsp;&nbsp;</span>試行錯誤</a></span></li><li><span><a href=\"#方法3:-numpyとconvert(PyAny,-c)を使う方法\" data-toc-modified-id=\"方法3:-numpyとconvert(PyAny,-c)を使う方法-6\"><span class=\"toc-item-num\">6&nbsp;&nbsp;</span>方法3: numpyとconvert(PyAny, c)を使う方法</a></span></li></ul></div>"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## PyCall経由でpybaseballを使ってデータを取得\n\ndf_pandas をどのようにしてJuliaのデータフレームに変換するかが問題。\n\n* https://pypi.org/project/pybaseball/"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "using PyCall\npybaseball = pyimport(\"pybaseball\")\ndf_pandas = pybaseball.statcast(start_dt=\"2020-08-01\", end_dt=\"2020-08-02\")",
"execution_count": 1,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 1,
"data": {
"text/plain": "PyObject index pitch_type ... if_fielding_alignment of_fielding_alignment\n0 89 FC ... Strategic Strategic\n1 90 FF ... Strategic Strategic\n2 96 FC ... Strategic Strategic\n3 99 FC ... Infield shift Standard\n4 104 FC ... Infield shift Standard\n... ... ... ... ... ...\n7137 7090 FF ... Strategic Standard\n7138 7102 FF ... Infield shift Standard\n7139 7117 CU ... Infield shift Standard\n7140 7120 FF ... Infield shift Standard\n7141 7136 FF ... Infield shift Standard\n\n[7142 rows x 90 columns]",
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>index</th>\n <th>pitch_type</th>\n <th>game_date</th>\n <th>release_speed</th>\n <th>release_pos_x</th>\n <th>release_pos_z</th>\n <th>player_name</th>\n <th>batter</th>\n <th>pitcher</th>\n <th>events</th>\n <th>description</th>\n <th>spin_dir</th>\n <th>spin_rate_deprecated</th>\n <th>break_angle_deprecated</th>\n <th>break_length_deprecated</th>\n <th>zone</th>\n <th>des</th>\n <th>game_type</th>\n <th>stand</th>\n <th>p_throws</th>\n <th>home_team</th>\n <th>away_team</th>\n <th>type</th>\n <th>hit_location</th>\n <th>bb_type</th>\n <th>balls</th>\n <th>strikes</th>\n <th>game_year</th>\n <th>pfx_x</th>\n <th>pfx_z</th>\n <th>plate_x</th>\n <th>plate_z</th>\n <th>on_3b</th>\n <th>on_2b</th>\n <th>on_1b</th>\n <th>outs_when_up</th>\n <th>inning</th>\n <th>inning_topbot</th>\n <th>hc_x</th>\n <th>hc_y</th>\n <th>...</th>\n <th>az</th>\n <th>sz_top</th>\n <th>sz_bot</th>\n <th>hit_distance_sc</th>\n <th>launch_speed</th>\n <th>launch_angle</th>\n <th>effective_speed</th>\n <th>release_spin_rate</th>\n <th>release_extension</th>\n <th>game_pk</th>\n <th>pitcher.1</th>\n <th>fielder_2.1</th>\n <th>fielder_3</th>\n <th>fielder_4</th>\n <th>fielder_5</th>\n <th>fielder_6</th>\n <th>fielder_7</th>\n <th>fielder_8</th>\n <th>fielder_9</th>\n <th>release_pos_y</th>\n <th>estimated_ba_using_speedangle</th>\n <th>estimated_woba_using_speedangle</th>\n <th>woba_value</th>\n <th>woba_denom</th>\n <th>babip_value</th>\n <th>iso_value</th>\n <th>launch_speed_angle</th>\n <th>at_bat_number</th>\n <th>pitch_number</th>\n <th>pitch_name</th>\n <th>home_score</th>\n <th>away_score</th>\n <th>bat_score</th>\n <th>fld_score</th>\n <th>post_away_score</th>\n <th>post_home_score</th>\n <th>post_bat_score</th>\n <th>post_fld_score</th>\n <th>if_fielding_alignment</th>\n <th>of_fielding_alignment</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>89</td>\n <td>FC</td>\n <td>2020-08-02</td>\n <td>89.8</td>\n <td>-1.34</td>\n <td>6.09</td>\n <td>Cody Ponce</td>\n <td>595879.0</td>\n <td>664074.0</td>\n <td>single</td>\n <td>hit_into_play_score</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>5.0</td>\n <td>Javier Baez singles on a ground ball to center...</td>\n <td>R</td>\n <td>R</td>\n <td>R</td>\n <td>CHC</td>\n <td>PIT</td>\n <td>X</td>\n <td>8.0</td>\n <td>ground_ball</td>\n <td>2.0</td>\n <td>0.0</td>\n <td>2020.0</td>\n <td>-0.1</td>\n <td>0.9</td>\n <td>0.27</td>\n <td>2.18</td>\n <td>623520.0</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>1.0</td>\n <td>11.0</td>\n <td>Bot</td>\n <td>126.00</td>\n <td>104.31</td>\n <td>...</td>\n <td>-21.168680</td>\n <td>3.37</td>\n <td>1.53</td>\n <td>117.0</td>\n <td>99.1</td>\n <td>6.0</td>\n <td>91.1</td>\n <td>2618.0</td>\n <td>6.7</td>\n <td>631606.0</td>\n <td>664074.0</td>\n <td>607732.0</td>\n <td>605137.0</td>\n <td>624428.0</td>\n <td>591741.0</td>\n <td>621028.0</td>\n <td>668804.0</td>\n <td>502481.0</td>\n <td>657061.0</td>\n <td>53.78</td>\n <td>0.471</td>\n <td>0.424</td>\n <td>0.9</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>0.0</td>\n <td>4.0</td>\n <td>80.0</td>\n <td>3.0</td>\n <td>Cutter</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>Strategic</td>\n <td>Strategic</td>\n </tr>\n <tr>\n <th>1</th>\n <td>90</td>\n <td>FF</td>\n <td>2020-08-02</td>\n <td>93.7</td>\n <td>-1.33</td>\n <td>5.87</td>\n <td>Cody Ponce</td>\n <td>595879.0</td>\n <td>664074.0</td>\n <td>NaN</td>\n <td>ball</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>7.0</td>\n <td>NaN</td>\n <td>R</td>\n <td>R</td>\n <td>R</td>\n <td>CHC</td>\n <td>PIT</td>\n <td>B</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>1.0</td>\n <td>0.0</td>\n <td>2020.0</td>\n <td>-0.9</td>\n <td>1.4</td>\n <td>-0.77</td>\n <td>1.87</td>\n <td>623520.0</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>1.0</td>\n <td>11.0</td>\n <td>Bot</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>...</td>\n <td>-13.223407</td>\n <td>3.26</td>\n <td>1.53</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>95.2</td>\n <td>2462.0</td>\n <td>6.9</td>\n <td>631606.0</td>\n <td>664074.0</td>\n <td>607732.0</td>\n <td>605137.0</td>\n <td>624428.0</td>\n <td>591741.0</td>\n <td>621028.0</td>\n <td>668804.0</td>\n <td>502481.0</td>\n <td>657061.0</td>\n <td>53.63</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>80.0</td>\n <td>2.0</td>\n <td>4-Seam Fastball</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>Strategic</td>\n <td>Strategic</td>\n </tr>\n <tr>\n <th>2</th>\n <td>96</td>\n <td>FC</td>\n <td>2020-08-02</td>\n <td>89.5</td>\n <td>-1.38</td>\n <td>6.08</td>\n <td>Cody Ponce</td>\n <td>595879.0</td>\n <td>664074.0</td>\n <td>NaN</td>\n <td>ball</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>14.0</td>\n <td>NaN</td>\n <td>R</td>\n <td>R</td>\n <td>R</td>\n <td>CHC</td>\n <td>PIT</td>\n <td>B</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>2020.0</td>\n <td>0.4</td>\n <td>0.7</td>\n <td>1.44</td>\n <td>2.29</td>\n <td>623520.0</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>1.0</td>\n <td>11.0</td>\n <td>Bot</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>...</td>\n <td>-23.021592</td>\n <td>3.26</td>\n <td>1.53</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>90.6</td>\n <td>2516.0</td>\n <td>6.8</td>\n <td>631606.0</td>\n <td>664074.0</td>\n <td>607732.0</td>\n <td>605137.0</td>\n <td>624428.0</td>\n <td>591741.0</td>\n <td>621028.0</td>\n <td>668804.0</td>\n <td>502481.0</td>\n <td>657061.0</td>\n <td>53.74</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>80.0</td>\n <td>1.0</td>\n <td>Cutter</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>Strategic</td>\n <td>Strategic</td>\n </tr>\n <tr>\n <th>3</th>\n <td>99</td>\n <td>FC</td>\n <td>2020-08-02</td>\n <td>88.7</td>\n <td>-1.48</td>\n <td>6.03</td>\n <td>Cody Ponce</td>\n <td>519203.0</td>\n <td>664074.0</td>\n <td>field_out</td>\n <td>hit_into_play</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>3.0</td>\n <td>Anthony Rizzo flies out to right fielder Cole ...</td>\n <td>R</td>\n <td>L</td>\n <td>R</td>\n <td>CHC</td>\n <td>PIT</td>\n <td>X</td>\n <td>9.0</td>\n <td>fly_ball</td>\n <td>0.0</td>\n <td>2.0</td>\n <td>2020.0</td>\n <td>0.5</td>\n <td>0.6</td>\n <td>0.64</td>\n <td>2.93</td>\n <td>NaN</td>\n <td>623520.0</td>\n <td>NaN</td>\n <td>0.0</td>\n <td>11.0</td>\n <td>Bot</td>\n <td>208.02</td>\n <td>94.12</td>\n <td>...</td>\n <td>-24.804660</td>\n <td>3.49</td>\n <td>1.60</td>\n <td>314.0</td>\n <td>87.8</td>\n <td>39.0</td>\n <td>89.9</td>\n <td>2462.0</td>\n <td>6.7</td>\n <td>631606.0</td>\n <td>664074.0</td>\n <td>607732.0</td>\n <td>605137.0</td>\n <td>624428.0</td>\n <td>591741.0</td>\n <td>621028.0</td>\n <td>668804.0</td>\n <td>502481.0</td>\n <td>657061.0</td>\n <td>53.76</td>\n <td>0.014</td>\n <td>0.017</td>\n <td>0.0</td>\n <td>1.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>3.0</td>\n <td>79.0</td>\n <td>3.0</td>\n <td>Cutter</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>Infield shift</td>\n <td>Standard</td>\n </tr>\n <tr>\n <th>4</th>\n <td>104</td>\n <td>FC</td>\n <td>2020-08-02</td>\n <td>90.4</td>\n <td>-1.47</td>\n <td>6.10</td>\n <td>Cody Ponce</td>\n <td>519203.0</td>\n <td>664074.0</td>\n <td>NaN</td>\n <td>foul</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>3.0</td>\n <td>NaN</td>\n <td>R</td>\n <td>L</td>\n <td>R</td>\n <td>CHC</td>\n <td>PIT</td>\n <td>S</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>0.0</td>\n <td>1.0</td>\n <td>2020.0</td>\n <td>0.2</td>\n <td>1.0</td>\n <td>0.30</td>\n <td>3.34</td>\n <td>NaN</td>\n <td>623520.0</td>\n <td>NaN</td>\n <td>0.0</td>\n <td>11.0</td>\n <td>Bot</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>...</td>\n <td>-20.577313</td>\n <td>3.49</td>\n <td>1.60</td>\n <td>110.0</td>\n <td>63.0</td>\n <td>73.0</td>\n <td>91.0</td>\n <td>2574.0</td>\n <td>6.7</td>\n <td>631606.0</td>\n <td>664074.0</td>\n <td>607732.0</td>\n <td>605137.0</td>\n <td>624428.0</td>\n <td>591741.0</td>\n <td>621028.0</td>\n <td>668804.0</td>\n <td>502481.0</td>\n <td>657061.0</td>\n <td>53.80</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>79.0</td>\n <td>2.0</td>\n <td>Cutter</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>Infield shift</td>\n <td>Standard</td>\n </tr>\n <tr>\n <th>...</th>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n </tr>\n <tr>\n <th>7137</th>\n <td>7090</td>\n <td>FF</td>\n <td>2020-08-01</td>\n <td>96.4</td>\n <td>-1.09</td>\n <td>5.81</td>\n <td>Luke Weaver</td>\n <td>605141.0</td>\n <td>596133.0</td>\n <td>NaN</td>\n <td>called_strike</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>14.0</td>\n <td>NaN</td>\n <td>R</td>\n <td>R</td>\n <td>R</td>\n <td>ARI</td>\n <td>LAD</td>\n <td>S</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>2020.0</td>\n <td>-0.2</td>\n <td>1.6</td>\n <td>0.92</td>\n <td>1.68</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>Top</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>...</td>\n <td>-8.886344</td>\n <td>3.26</td>\n <td>1.66</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>95.7</td>\n <td>2534.0</td>\n <td>6.0</td>\n <td>630100.0</td>\n <td>596133.0</td>\n <td>608348.0</td>\n <td>545121.0</td>\n <td>606466.0</td>\n <td>500871.0</td>\n <td>605113.0</td>\n <td>444482.0</td>\n <td>516782.0</td>\n <td>641796.0</td>\n <td>54.46</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>2.0</td>\n <td>1.0</td>\n <td>4-Seam Fastball</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>Strategic</td>\n <td>Standard</td>\n </tr>\n <tr>\n <th>7138</th>\n <td>7102</td>\n <td>FF</td>\n <td>2020-08-01</td>\n <td>97.4</td>\n <td>-1.11</td>\n <td>5.82</td>\n <td>Luke Weaver</td>\n <td>571970.0</td>\n <td>596133.0</td>\n <td>strikeout</td>\n <td>swinging_strike</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>2.0</td>\n <td>Max Muncy strikes out swinging.</td>\n <td>R</td>\n <td>L</td>\n <td>R</td>\n <td>ARI</td>\n <td>LAD</td>\n <td>S</td>\n <td>2.0</td>\n <td>NaN</td>\n <td>1.0</td>\n <td>2.0</td>\n <td>2020.0</td>\n <td>-0.7</td>\n <td>1.4</td>\n <td>-0.15</td>\n <td>3.36</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>0.0</td>\n <td>1.0</td>\n <td>Top</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>...</td>\n <td>-12.144922</td>\n <td>3.37</td>\n <td>1.53</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>96.8</td>\n <td>2563.0</td>\n <td>6.1</td>\n <td>630100.0</td>\n <td>596133.0</td>\n <td>608348.0</td>\n <td>545121.0</td>\n <td>606466.0</td>\n <td>500871.0</td>\n <td>605113.0</td>\n <td>444482.0</td>\n <td>516782.0</td>\n <td>641796.0</td>\n <td>54.40</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>0.0</td>\n <td>1.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>NaN</td>\n <td>1.0</td>\n <td>4.0</td>\n <td>4-Seam Fastball</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>Infield shift</td>\n <td>Standard</td>\n </tr>\n <tr>\n <th>7139</th>\n <td>7117</td>\n <td>CU</td>\n <td>2020-08-01</td>\n <td>79.4</td>\n <td>-1.08</td>\n <td>5.77</td>\n <td>Luke Weaver</td>\n <td>571970.0</td>\n <td>596133.0</td>\n <td>NaN</td>\n <td>foul</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>9.0</td>\n <td>NaN</td>\n <td>R</td>\n <td>L</td>\n <td>R</td>\n <td>ARI</td>\n <td>LAD</td>\n <td>S</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>2020.0</td>\n <td>0.5</td>\n <td>-0.7</td>\n <td>0.54</td>\n <td>1.73</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>0.0</td>\n <td>1.0</td>\n <td>Top</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>...</td>\n <td>-38.699364</td>\n <td>3.37</td>\n <td>1.53</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>78.8</td>\n <td>2218.0</td>\n <td>6.0</td>\n <td>630100.0</td>\n <td>596133.0</td>\n <td>608348.0</td>\n <td>545121.0</td>\n <td>606466.0</td>\n <td>500871.0</td>\n <td>605113.0</td>\n <td>444482.0</td>\n <td>516782.0</td>\n <td>641796.0</td>\n <td>54.53</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>1.0</td>\n <td>3.0</td>\n <td>Curveball</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>Infield shift</td>\n <td>Standard</td>\n </tr>\n <tr>\n <th>7140</th>\n <td>7120</td>\n <td>FF</td>\n <td>2020-08-01</td>\n <td>95.9</td>\n <td>-1.12</td>\n <td>5.79</td>\n <td>Luke Weaver</td>\n <td>571970.0</td>\n <td>596133.0</td>\n <td>NaN</td>\n <td>ball</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>9.0</td>\n <td>NaN</td>\n <td>R</td>\n <td>L</td>\n <td>R</td>\n <td>ARI</td>\n <td>LAD</td>\n <td>B</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>0.0</td>\n <td>1.0</td>\n <td>2020.0</td>\n <td>-0.6</td>\n <td>1.6</td>\n <td>0.29</td>\n <td>1.54</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>0.0</td>\n <td>1.0</td>\n <td>Top</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>...</td>\n <td>-9.363253</td>\n <td>3.08</td>\n <td>1.57</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>95.3</td>\n <td>2420.0</td>\n <td>6.1</td>\n <td>630100.0</td>\n <td>596133.0</td>\n <td>608348.0</td>\n <td>545121.0</td>\n <td>606466.0</td>\n <td>500871.0</td>\n <td>605113.0</td>\n <td>444482.0</td>\n <td>516782.0</td>\n <td>641796.0</td>\n <td>54.37</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>1.0</td>\n <td>2.0</td>\n <td>4-Seam Fastball</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>Infield shift</td>\n <td>Standard</td>\n </tr>\n <tr>\n <th>7141</th>\n <td>7136</td>\n <td>FF</td>\n <td>2020-08-01</td>\n <td>93.4</td>\n <td>-1.14</td>\n <td>5.75</td>\n <td>Luke Weaver</td>\n <td>571970.0</td>\n <td>596133.0</td>\n <td>NaN</td>\n <td>foul</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>9.0</td>\n <td>NaN</td>\n <td>R</td>\n <td>L</td>\n <td>R</td>\n <td>ARI</td>\n <td>LAD</td>\n <td>S</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>2020.0</td>\n <td>-0.7</td>\n <td>1.6</td>\n <td>0.29</td>\n <td>2.05</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>0.0</td>\n <td>1.0</td>\n <td>Top</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>...</td>\n <td>-10.616442</td>\n <td>3.36</td>\n <td>1.52</td>\n <td>105.0</td>\n <td>75.3</td>\n <td>8.0</td>\n <td>92.6</td>\n <td>2339.0</td>\n <td>6.0</td>\n <td>630100.0</td>\n <td>596133.0</td>\n <td>608348.0</td>\n <td>545121.0</td>\n <td>606466.0</td>\n <td>500871.0</td>\n <td>605113.0</td>\n <td>444482.0</td>\n <td>516782.0</td>\n <td>641796.0</td>\n <td>54.51</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>1.0</td>\n <td>1.0</td>\n <td>4-Seam Fastball</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>0.0</td>\n <td>Infield shift</td>\n <td>Standard</td>\n </tr>\n </tbody>\n</table>\n<p>7142 rows × 90 columns</p>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## 方法1-1\n\n* https://github.com/convert_to_juliavec/DataFrames.jl"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "using DataFrames\n\nfunction convert_to_juliavec(vals)\n T = typeof(vals)\n if !(T <: Vector) || T <: Vector{PyObject}\n vals = string.(vals)\n vals = (v -> replace(v, r\"^[^']*'\"=>\"\")).(vals)\n vals = (v -> replace(v, r\"'[^']*$\"=>\"\")).(vals)\n end\n vals\nend\n\nfunction pandas_to_julia(df_pandas)\n df = DataFrame()\n for col in Symbol.(df_pandas.columns)\n df[!, col] = convert_to_juliavec(getproperty(df_pandas, col).values)\n end\n df\nend\n\ndf = pandas_to_julia(df_pandas)",
"execution_count": 2,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 2,
"data": {
"text/plain": "7142×90 DataFrame. Omitted printing of 86 columns\n│ Row │ index │ pitch_type │ game_date │ release_speed │\n│ │ \u001b[90mInt64\u001b[39m │ \u001b[90mString\u001b[39m │ \u001b[90mString\u001b[39m │ \u001b[90mFloat64\u001b[39m │\n├──────┼───────┼────────────┼───────────────────────────────┼───────────────┤\n│ 1 │ 0 │ FC │ 2020-08-02T00:00:00.000000000 │ 89.8 │\n│ 2 │ 1 │ FF │ 2020-08-02T00:00:00.000000000 │ 93.7 │\n│ 3 │ 2 │ FC │ 2020-08-02T00:00:00.000000000 │ 89.5 │\n│ 4 │ 3 │ FC │ 2020-08-02T00:00:00.000000000 │ 88.7 │\n│ 5 │ 4 │ FC │ 2020-08-02T00:00:00.000000000 │ 90.4 │\n│ 6 │ 5 │ FC │ 2020-08-02T00:00:00.000000000 │ 90.1 │\n│ 7 │ 6 │ FS │ 2020-08-02T00:00:00.000000000 │ 87.3 │\n│ 8 │ 7 │ FS │ 2020-08-02T00:00:00.000000000 │ 86.3 │\n│ 9 │ 8 │ FF │ 2020-08-02T00:00:00.000000000 │ 91.4 │\n│ 10 │ 9 │ FF │ 2020-08-02T00:00:00.000000000 │ 91.5 │\n⋮\n│ 7132 │ 7131 │ FF │ 2020-08-01T00:00:00.000000000 │ 95.0 │\n│ 7133 │ 7132 │ FF │ 2020-08-01T00:00:00.000000000 │ 96.1 │\n│ 7134 │ 7133 │ FF │ 2020-08-01T00:00:00.000000000 │ 96.2 │\n│ 7135 │ 7134 │ FF │ 2020-08-01T00:00:00.000000000 │ 96.3 │\n│ 7136 │ 7135 │ FF │ 2020-08-01T00:00:00.000000000 │ 95.7 │\n│ 7137 │ 7136 │ FC │ 2020-08-01T00:00:00.000000000 │ 90.7 │\n│ 7138 │ 7137 │ FF │ 2020-08-01T00:00:00.000000000 │ 96.4 │\n│ 7139 │ 7138 │ FF │ 2020-08-01T00:00:00.000000000 │ 97.4 │\n│ 7140 │ 7139 │ CU │ 2020-08-01T00:00:00.000000000 │ 79.4 │\n│ 7141 │ 7140 │ FF │ 2020-08-01T00:00:00.000000000 │ 95.9 │\n│ 7142 │ 7141 │ FF │ 2020-08-01T00:00:00.000000000 │ 93.4 │",
"text/html": "<table class=\"data-frame\"><thead><tr><th></th><th>index</th><th>pitch_type</th><th>game_date</th><th>release_speed</th><th>release_pos_x</th></tr><tr><th></th><th>Int64</th><th>String</th><th>String</th><th>Float64</th><th>Float64</th></tr></thead><tbody><p>7,142 rows × 90 columns (omitted printing of 85 columns)</p><tr><th>1</th><td>0</td><td>FC</td><td>2020-08-02T00:00:00.000000000</td><td>89.8</td><td>-1.34</td></tr><tr><th>2</th><td>1</td><td>FF</td><td>2020-08-02T00:00:00.000000000</td><td>93.7</td><td>-1.33</td></tr><tr><th>3</th><td>2</td><td>FC</td><td>2020-08-02T00:00:00.000000000</td><td>89.5</td><td>-1.38</td></tr><tr><th>4</th><td>3</td><td>FC</td><td>2020-08-02T00:00:00.000000000</td><td>88.7</td><td>-1.48</td></tr><tr><th>5</th><td>4</td><td>FC</td><td>2020-08-02T00:00:00.000000000</td><td>90.4</td><td>-1.47</td></tr><tr><th>6</th><td>5</td><td>FC</td><td>2020-08-02T00:00:00.000000000</td><td>90.1</td><td>-1.63</td></tr><tr><th>7</th><td>6</td><td>FS</td><td>2020-08-02T00:00:00.000000000</td><td>87.3</td><td>-1.44</td></tr><tr><th>8</th><td>7</td><td>FS</td><td>2020-08-02T00:00:00.000000000</td><td>86.3</td><td>-1.34</td></tr><tr><th>9</th><td>8</td><td>FF</td><td>2020-08-02T00:00:00.000000000</td><td>91.4</td><td>-1.12</td></tr><tr><th>10</th><td>9</td><td>FF</td><td>2020-08-02T00:00:00.000000000</td><td>91.5</td><td>-1.17</td></tr><tr><th>11</th><td>10</td><td>FS</td><td>2020-08-02T00:00:00.000000000</td><td>87.3</td><td>-1.49</td></tr><tr><th>12</th><td>11</td><td>FS</td><td>2020-08-02T00:00:00.000000000</td><td>86.6</td><td>-1.49</td></tr><tr><th>13</th><td>12</td><td>SI</td><td>2020-08-02T00:00:00.000000000</td><td>90.0</td><td>-1.37</td></tr><tr><th>14</th><td>13</td><td>FS</td><td>2020-08-02T00:00:00.000000000</td><td>86.4</td><td>-1.45</td></tr><tr><th>15</th><td>14</td><td>KC</td><td>2020-08-02T00:00:00.000000000</td><td>78.3</td><td>-1.45</td></tr><tr><th>16</th><td>15</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>84.3</td><td>1.83</td></tr><tr><th>17</th><td>16</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>83.3</td><td>1.85</td></tr><tr><th>18</th><td>17</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>82.6</td><td>1.93</td></tr><tr><th>19</th><td>18</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>82.3</td><td>1.91</td></tr><tr><th>20</th><td>19</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>83.0</td><td>1.89</td></tr><tr><th>21</th><td>20</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>84.1</td><td>1.96</td></tr><tr><th>22</th><td>21</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>82.3</td><td>1.9</td></tr><tr><th>23</th><td>22</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>84.6</td><td>1.79</td></tr><tr><th>24</th><td>23</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>81.4</td><td>1.89</td></tr><tr><th>25</th><td>24</td><td>SI</td><td>2020-08-02T00:00:00.000000000</td><td>91.3</td><td>1.69</td></tr><tr><th>26</th><td>25</td><td>FF</td><td>2020-08-02T00:00:00.000000000</td><td>89.1</td><td>1.73</td></tr><tr><th>27</th><td>26</td><td>FF</td><td>2020-08-02T00:00:00.000000000</td><td>89.7</td><td>1.62</td></tr><tr><th>28</th><td>27</td><td>FF</td><td>2020-08-02T00:00:00.000000000</td><td>89.7</td><td>1.7</td></tr><tr><th>29</th><td>28</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>81.8</td><td>1.88</td></tr><tr><th>30</th><td>29</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>81.6</td><td>1.95</td></tr><tr><th>&vellip;</th><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td></tr></tbody></table>",
"text/latex": "\\begin{tabular}{r|cccccc}\n\t& index & pitch\\_type & game\\_date & release\\_speed & release\\_pos\\_x & \\\\\n\t\\hline\n\t& Int64 & String & String & Float64 & Float64 & \\\\\n\t\\hline\n\t1 & 0 & FC & 2020-08-02T00:00:00.000000000 & 89.8 & -1.34 & $\\dots$ \\\\\n\t2 & 1 & FF & 2020-08-02T00:00:00.000000000 & 93.7 & -1.33 & $\\dots$ \\\\\n\t3 & 2 & FC & 2020-08-02T00:00:00.000000000 & 89.5 & -1.38 & $\\dots$ \\\\\n\t4 & 3 & FC & 2020-08-02T00:00:00.000000000 & 88.7 & -1.48 & $\\dots$ \\\\\n\t5 & 4 & FC & 2020-08-02T00:00:00.000000000 & 90.4 & -1.47 & $\\dots$ \\\\\n\t6 & 5 & FC & 2020-08-02T00:00:00.000000000 & 90.1 & -1.63 & $\\dots$ \\\\\n\t7 & 6 & FS & 2020-08-02T00:00:00.000000000 & 87.3 & -1.44 & $\\dots$ \\\\\n\t8 & 7 & FS & 2020-08-02T00:00:00.000000000 & 86.3 & -1.34 & $\\dots$ \\\\\n\t9 & 8 & FF & 2020-08-02T00:00:00.000000000 & 91.4 & -1.12 & $\\dots$ \\\\\n\t10 & 9 & FF & 2020-08-02T00:00:00.000000000 & 91.5 & -1.17 & $\\dots$ \\\\\n\t11 & 10 & FS & 2020-08-02T00:00:00.000000000 & 87.3 & -1.49 & $\\dots$ \\\\\n\t12 & 11 & FS & 2020-08-02T00:00:00.000000000 & 86.6 & -1.49 & $\\dots$ \\\\\n\t13 & 12 & SI & 2020-08-02T00:00:00.000000000 & 90.0 & -1.37 & $\\dots$ \\\\\n\t14 & 13 & FS & 2020-08-02T00:00:00.000000000 & 86.4 & -1.45 & $\\dots$ \\\\\n\t15 & 14 & KC & 2020-08-02T00:00:00.000000000 & 78.3 & -1.45 & $\\dots$ \\\\\n\t16 & 15 & SL & 2020-08-02T00:00:00.000000000 & 84.3 & 1.83 & $\\dots$ \\\\\n\t17 & 16 & SL & 2020-08-02T00:00:00.000000000 & 83.3 & 1.85 & $\\dots$ \\\\\n\t18 & 17 & SL & 2020-08-02T00:00:00.000000000 & 82.6 & 1.93 & $\\dots$ \\\\\n\t19 & 18 & SL & 2020-08-02T00:00:00.000000000 & 82.3 & 1.91 & $\\dots$ \\\\\n\t20 & 19 & SL & 2020-08-02T00:00:00.000000000 & 83.0 & 1.89 & $\\dots$ \\\\\n\t21 & 20 & SL & 2020-08-02T00:00:00.000000000 & 84.1 & 1.96 & $\\dots$ \\\\\n\t22 & 21 & SL & 2020-08-02T00:00:00.000000000 & 82.3 & 1.9 & $\\dots$ \\\\\n\t23 & 22 & SL & 2020-08-02T00:00:00.000000000 & 84.6 & 1.79 & $\\dots$ \\\\\n\t24 & 23 & SL & 2020-08-02T00:00:00.000000000 & 81.4 & 1.89 & $\\dots$ \\\\\n\t25 & 24 & SI & 2020-08-02T00:00:00.000000000 & 91.3 & 1.69 & $\\dots$ \\\\\n\t26 & 25 & FF & 2020-08-02T00:00:00.000000000 & 89.1 & 1.73 & $\\dots$ \\\\\n\t27 & 26 & FF & 2020-08-02T00:00:00.000000000 & 89.7 & 1.62 & $\\dots$ \\\\\n\t28 & 27 & FF & 2020-08-02T00:00:00.000000000 & 89.7 & 1.7 & $\\dots$ \\\\\n\t29 & 28 & SL & 2020-08-02T00:00:00.000000000 & 81.8 & 1.88 & $\\dots$ \\\\\n\t30 & 29 & SL & 2020-08-02T00:00:00.000000000 & 81.6 & 1.95 & $\\dots$ \\\\\n\t$\\dots$ & $\\dots$ & $\\dots$ & $\\dots$ & $\\dots$ & $\\dots$ & \\\\\n\\end{tabular}\n"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## 方法1-2\n\n本質的に方法1-1と同じ"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "using DataFrames\n\nfunction convert_to_juliavec(vals)\n T = typeof(vals)\n if !(T <: Vector) || T <: Vector{PyObject}\n vals = string.(vals)\n vals = (v -> replace(v, r\"^[^']*'\"=>\"\")).(vals)\n vals = (v -> replace(v, r\"'[^']*$\"=>\"\")).(vals)\n end\n vals\nend\n\nfunction pandas_to_julia(df_pandas)\n colnames = Symbol.(df_pandas.columns)\n data = (col -> convert_to_juliavec(getproperty(df_pandas, col).values)).(colnames)\n DataFrame(data, colnames)\nend\n\ndf1 = pandas_to_julia(df_pandas)",
"execution_count": 3,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 3,
"data": {
"text/plain": "7142×90 DataFrame. Omitted printing of 86 columns\n│ Row │ index │ pitch_type │ game_date │ release_speed │\n│ │ \u001b[90mInt64\u001b[39m │ \u001b[90mString\u001b[39m │ \u001b[90mString\u001b[39m │ \u001b[90mFloat64\u001b[39m │\n├──────┼───────┼────────────┼───────────────────────────────┼───────────────┤\n│ 1 │ 0 │ FC │ 2020-08-02T00:00:00.000000000 │ 89.8 │\n│ 2 │ 1 │ FF │ 2020-08-02T00:00:00.000000000 │ 93.7 │\n│ 3 │ 2 │ FC │ 2020-08-02T00:00:00.000000000 │ 89.5 │\n│ 4 │ 3 │ FC │ 2020-08-02T00:00:00.000000000 │ 88.7 │\n│ 5 │ 4 │ FC │ 2020-08-02T00:00:00.000000000 │ 90.4 │\n│ 6 │ 5 │ FC │ 2020-08-02T00:00:00.000000000 │ 90.1 │\n│ 7 │ 6 │ FS │ 2020-08-02T00:00:00.000000000 │ 87.3 │\n│ 8 │ 7 │ FS │ 2020-08-02T00:00:00.000000000 │ 86.3 │\n│ 9 │ 8 │ FF │ 2020-08-02T00:00:00.000000000 │ 91.4 │\n│ 10 │ 9 │ FF │ 2020-08-02T00:00:00.000000000 │ 91.5 │\n⋮\n│ 7132 │ 7131 │ FF │ 2020-08-01T00:00:00.000000000 │ 95.0 │\n│ 7133 │ 7132 │ FF │ 2020-08-01T00:00:00.000000000 │ 96.1 │\n│ 7134 │ 7133 │ FF │ 2020-08-01T00:00:00.000000000 │ 96.2 │\n│ 7135 │ 7134 │ FF │ 2020-08-01T00:00:00.000000000 │ 96.3 │\n│ 7136 │ 7135 │ FF │ 2020-08-01T00:00:00.000000000 │ 95.7 │\n│ 7137 │ 7136 │ FC │ 2020-08-01T00:00:00.000000000 │ 90.7 │\n│ 7138 │ 7137 │ FF │ 2020-08-01T00:00:00.000000000 │ 96.4 │\n│ 7139 │ 7138 │ FF │ 2020-08-01T00:00:00.000000000 │ 97.4 │\n│ 7140 │ 7139 │ CU │ 2020-08-01T00:00:00.000000000 │ 79.4 │\n│ 7141 │ 7140 │ FF │ 2020-08-01T00:00:00.000000000 │ 95.9 │\n│ 7142 │ 7141 │ FF │ 2020-08-01T00:00:00.000000000 │ 93.4 │",
"text/html": "<table class=\"data-frame\"><thead><tr><th></th><th>index</th><th>pitch_type</th><th>game_date</th><th>release_speed</th><th>release_pos_x</th></tr><tr><th></th><th>Int64</th><th>String</th><th>String</th><th>Float64</th><th>Float64</th></tr></thead><tbody><p>7,142 rows × 90 columns (omitted printing of 85 columns)</p><tr><th>1</th><td>0</td><td>FC</td><td>2020-08-02T00:00:00.000000000</td><td>89.8</td><td>-1.34</td></tr><tr><th>2</th><td>1</td><td>FF</td><td>2020-08-02T00:00:00.000000000</td><td>93.7</td><td>-1.33</td></tr><tr><th>3</th><td>2</td><td>FC</td><td>2020-08-02T00:00:00.000000000</td><td>89.5</td><td>-1.38</td></tr><tr><th>4</th><td>3</td><td>FC</td><td>2020-08-02T00:00:00.000000000</td><td>88.7</td><td>-1.48</td></tr><tr><th>5</th><td>4</td><td>FC</td><td>2020-08-02T00:00:00.000000000</td><td>90.4</td><td>-1.47</td></tr><tr><th>6</th><td>5</td><td>FC</td><td>2020-08-02T00:00:00.000000000</td><td>90.1</td><td>-1.63</td></tr><tr><th>7</th><td>6</td><td>FS</td><td>2020-08-02T00:00:00.000000000</td><td>87.3</td><td>-1.44</td></tr><tr><th>8</th><td>7</td><td>FS</td><td>2020-08-02T00:00:00.000000000</td><td>86.3</td><td>-1.34</td></tr><tr><th>9</th><td>8</td><td>FF</td><td>2020-08-02T00:00:00.000000000</td><td>91.4</td><td>-1.12</td></tr><tr><th>10</th><td>9</td><td>FF</td><td>2020-08-02T00:00:00.000000000</td><td>91.5</td><td>-1.17</td></tr><tr><th>11</th><td>10</td><td>FS</td><td>2020-08-02T00:00:00.000000000</td><td>87.3</td><td>-1.49</td></tr><tr><th>12</th><td>11</td><td>FS</td><td>2020-08-02T00:00:00.000000000</td><td>86.6</td><td>-1.49</td></tr><tr><th>13</th><td>12</td><td>SI</td><td>2020-08-02T00:00:00.000000000</td><td>90.0</td><td>-1.37</td></tr><tr><th>14</th><td>13</td><td>FS</td><td>2020-08-02T00:00:00.000000000</td><td>86.4</td><td>-1.45</td></tr><tr><th>15</th><td>14</td><td>KC</td><td>2020-08-02T00:00:00.000000000</td><td>78.3</td><td>-1.45</td></tr><tr><th>16</th><td>15</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>84.3</td><td>1.83</td></tr><tr><th>17</th><td>16</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>83.3</td><td>1.85</td></tr><tr><th>18</th><td>17</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>82.6</td><td>1.93</td></tr><tr><th>19</th><td>18</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>82.3</td><td>1.91</td></tr><tr><th>20</th><td>19</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>83.0</td><td>1.89</td></tr><tr><th>21</th><td>20</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>84.1</td><td>1.96</td></tr><tr><th>22</th><td>21</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>82.3</td><td>1.9</td></tr><tr><th>23</th><td>22</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>84.6</td><td>1.79</td></tr><tr><th>24</th><td>23</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>81.4</td><td>1.89</td></tr><tr><th>25</th><td>24</td><td>SI</td><td>2020-08-02T00:00:00.000000000</td><td>91.3</td><td>1.69</td></tr><tr><th>26</th><td>25</td><td>FF</td><td>2020-08-02T00:00:00.000000000</td><td>89.1</td><td>1.73</td></tr><tr><th>27</th><td>26</td><td>FF</td><td>2020-08-02T00:00:00.000000000</td><td>89.7</td><td>1.62</td></tr><tr><th>28</th><td>27</td><td>FF</td><td>2020-08-02T00:00:00.000000000</td><td>89.7</td><td>1.7</td></tr><tr><th>29</th><td>28</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>81.8</td><td>1.88</td></tr><tr><th>30</th><td>29</td><td>SL</td><td>2020-08-02T00:00:00.000000000</td><td>81.6</td><td>1.95</td></tr><tr><th>&vellip;</th><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td></tr></tbody></table>",
"text/latex": "\\begin{tabular}{r|cccccc}\n\t& index & pitch\\_type & game\\_date & release\\_speed & release\\_pos\\_x & \\\\\n\t\\hline\n\t& Int64 & String & String & Float64 & Float64 & \\\\\n\t\\hline\n\t1 & 0 & FC & 2020-08-02T00:00:00.000000000 & 89.8 & -1.34 & $\\dots$ \\\\\n\t2 & 1 & FF & 2020-08-02T00:00:00.000000000 & 93.7 & -1.33 & $\\dots$ \\\\\n\t3 & 2 & FC & 2020-08-02T00:00:00.000000000 & 89.5 & -1.38 & $\\dots$ \\\\\n\t4 & 3 & FC & 2020-08-02T00:00:00.000000000 & 88.7 & -1.48 & $\\dots$ \\\\\n\t5 & 4 & FC & 2020-08-02T00:00:00.000000000 & 90.4 & -1.47 & $\\dots$ \\\\\n\t6 & 5 & FC & 2020-08-02T00:00:00.000000000 & 90.1 & -1.63 & $\\dots$ \\\\\n\t7 & 6 & FS & 2020-08-02T00:00:00.000000000 & 87.3 & -1.44 & $\\dots$ \\\\\n\t8 & 7 & FS & 2020-08-02T00:00:00.000000000 & 86.3 & -1.34 & $\\dots$ \\\\\n\t9 & 8 & FF & 2020-08-02T00:00:00.000000000 & 91.4 & -1.12 & $\\dots$ \\\\\n\t10 & 9 & FF & 2020-08-02T00:00:00.000000000 & 91.5 & -1.17 & $\\dots$ \\\\\n\t11 & 10 & FS & 2020-08-02T00:00:00.000000000 & 87.3 & -1.49 & $\\dots$ \\\\\n\t12 & 11 & FS & 2020-08-02T00:00:00.000000000 & 86.6 & -1.49 & $\\dots$ \\\\\n\t13 & 12 & SI & 2020-08-02T00:00:00.000000000 & 90.0 & -1.37 & $\\dots$ \\\\\n\t14 & 13 & FS & 2020-08-02T00:00:00.000000000 & 86.4 & -1.45 & $\\dots$ \\\\\n\t15 & 14 & KC & 2020-08-02T00:00:00.000000000 & 78.3 & -1.45 & $\\dots$ \\\\\n\t16 & 15 & SL & 2020-08-02T00:00:00.000000000 & 84.3 & 1.83 & $\\dots$ \\\\\n\t17 & 16 & SL & 2020-08-02T00:00:00.000000000 & 83.3 & 1.85 & $\\dots$ \\\\\n\t18 & 17 & SL & 2020-08-02T00:00:00.000000000 & 82.6 & 1.93 & $\\dots$ \\\\\n\t19 & 18 & SL & 2020-08-02T00:00:00.000000000 & 82.3 & 1.91 & $\\dots$ \\\\\n\t20 & 19 & SL & 2020-08-02T00:00:00.000000000 & 83.0 & 1.89 & $\\dots$ \\\\\n\t21 & 20 & SL & 2020-08-02T00:00:00.000000000 & 84.1 & 1.96 & $\\dots$ \\\\\n\t22 & 21 & SL & 2020-08-02T00:00:00.000000000 & 82.3 & 1.9 & $\\dots$ \\\\\n\t23 & 22 & SL & 2020-08-02T00:00:00.000000000 & 84.6 & 1.79 & $\\dots$ \\\\\n\t24 & 23 & SL & 2020-08-02T00:00:00.000000000 & 81.4 & 1.89 & $\\dots$ \\\\\n\t25 & 24 & SI & 2020-08-02T00:00:00.000000000 & 91.3 & 1.69 & $\\dots$ \\\\\n\t26 & 25 & FF & 2020-08-02T00:00:00.000000000 & 89.1 & 1.73 & $\\dots$ \\\\\n\t27 & 26 & FF & 2020-08-02T00:00:00.000000000 & 89.7 & 1.62 & $\\dots$ \\\\\n\t28 & 27 & FF & 2020-08-02T00:00:00.000000000 & 89.7 & 1.7 & $\\dots$ \\\\\n\t29 & 28 & SL & 2020-08-02T00:00:00.000000000 & 81.8 & 1.88 & $\\dots$ \\\\\n\t30 & 29 & SL & 2020-08-02T00:00:00.000000000 & 81.6 & 1.95 & $\\dots$ \\\\\n\t$\\dots$ & $\\dots$ & $\\dots$ & $\\dots$ & $\\dots$ & $\\dots$ & \\\\\n\\end{tabular}\n"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "@show names(df1);",
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"text": "names(df1) = [\"index\", \"pitch_type\", \"game_date\", \"release_speed\", \"release_pos_x\", \"release_pos_z\", \"player_name\", \"batter\", \"pitcher\", \"events\", \"description\", \"spin_dir\", \"spin_rate_deprecated\", \"break_angle_deprecated\", \"break_length_deprecated\", \"zone\", \"des\", \"game_type\", \"stand\", \"p_throws\", \"home_team\", \"away_team\", \"type\", \"hit_location\", \"bb_type\", \"balls\", \"strikes\", \"game_year\", \"pfx_x\", \"pfx_z\", \"plate_x\", \"plate_z\", \"on_3b\", \"on_2b\", \"on_1b\", \"outs_when_up\", \"inning\", \"inning_topbot\", \"hc_x\", \"hc_y\", \"tfs_deprecated\", \"tfs_zulu_deprecated\", \"fielder_2\", \"umpire\", \"sv_id\", \"vx0\", \"vy0\", \"vz0\", \"ax\", \"ay\", \"az\", \"sz_top\", \"sz_bot\", \"hit_distance_sc\", \"launch_speed\", \"launch_angle\", \"effective_speed\", \"release_spin_rate\", \"release_extension\", \"game_pk\", \"pitcher.1\", \"fielder_2.1\", \"fielder_3\", \"fielder_4\", \"fielder_5\", \"fielder_6\", \"fielder_7\", \"fielder_8\", \"fielder_9\", \"release_pos_y\", \"estimated_ba_using_speedangle\", \"estimated_woba_using_speedangle\", \"woba_value\", \"woba_denom\", \"babip_value\", \"iso_value\", \"launch_speed_angle\", \"at_bat_number\", \"pitch_number\", \"pitch_name\", \"home_score\", \"away_score\", \"bat_score\", \"fld_score\", \"post_away_score\", \"post_home_score\", \"post_bat_score\", \"post_fld_score\", \"if_fielding_alignment\", \"of_fielding_alignment\"]\n",
"name": "stdout"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "@show names(df, 1:10);",
"execution_count": 5,
"outputs": [
{
"output_type": "stream",
"text": "names(df, 1:10) = [\"index\", \"pitch_type\", \"game_date\", \"release_speed\", \"release_pos_x\", \"release_pos_z\", \"player_name\", \"batter\", \"pitcher\", \"events\"]\n",
"name": "stdout"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "df1.release_speed[1:10]",
"execution_count": 6,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 6,
"data": {
"text/plain": "10-element Array{Float64,1}:\n 89.8\n 93.7\n 89.5\n 88.7\n 90.4\n 90.1\n 87.3\n 86.3\n 91.4\n 91.5"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "df1[!, :release_speed][1:10]",
"execution_count": 7,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 7,
"data": {
"text/plain": "10-element Array{Float64,1}:\n 89.8\n 93.7\n 89.5\n 88.7\n 90.4\n 90.1\n 87.3\n 86.3\n 91.4\n 91.5"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "df1[!, :pitch_type][1:10]",
"execution_count": 8,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 8,
"data": {
"text/plain": "10-element Array{String,1}:\n \"FC\"\n \"FF\"\n \"FC\"\n \"FC\"\n \"FC\"\n \"FC\"\n \"FS\"\n \"FS\"\n \"FF\"\n \"FF\""
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "df1[!, :game_date][1:10]",
"execution_count": 9,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 9,
"data": {
"text/plain": "10-element Array{String,1}:\n \"2020-08-02T00:00:00.000000000\"\n \"2020-08-02T00:00:00.000000000\"\n \"2020-08-02T00:00:00.000000000\"\n \"2020-08-02T00:00:00.000000000\"\n \"2020-08-02T00:00:00.000000000\"\n \"2020-08-02T00:00:00.000000000\"\n \"2020-08-02T00:00:00.000000000\"\n \"2020-08-02T00:00:00.000000000\"\n \"2020-08-02T00:00:00.000000000\"\n \"2020-08-02T00:00:00.000000000\""
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## 方法2: Pandas.jlも使う方法\n\n* https://github.com/JuliaPy/Pandas.jl"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "using DataFrames\nusing Pandas: Pandas\n\nfunction pandas_to_julia(df_pandas)\n colnames = Symbol.(df_pandas.columns)\n data = Array(Pandas.DataFrame(df_pandas))\n DataFrame(data, colnames)\nend\n\ndf2 = pandas_to_julia(df_pandas)",
"execution_count": 10,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 10,
"data": {
"text/plain": "7142×90 DataFrame. Omitted printing of 86 columns\n│ Row │ index │ pitch_type │ game_date │ release_speed │\n│ │ \u001b[90mAny\u001b[39m │ \u001b[90mAny\u001b[39m │ \u001b[90mAny\u001b[39m │ \u001b[90mAny\u001b[39m │\n├──────┼───────┼────────────┼─────────────────────┼───────────────┤\n│ 1 │ 89 │ FC │ 2020-08-02T00:00:00 │ 89.8 │\n│ 2 │ 90 │ FF │ 2020-08-02T00:00:00 │ 93.7 │\n│ 3 │ 96 │ FC │ 2020-08-02T00:00:00 │ 89.5 │\n│ 4 │ 99 │ FC │ 2020-08-02T00:00:00 │ 88.7 │\n│ 5 │ 104 │ FC │ 2020-08-02T00:00:00 │ 90.4 │\n│ 6 │ 106 │ FC │ 2020-08-02T00:00:00 │ 90.1 │\n│ 7 │ 110 │ FS │ 2020-08-02T00:00:00 │ 87.3 │\n│ 8 │ 115 │ FS │ 2020-08-02T00:00:00 │ 86.3 │\n│ 9 │ 118 │ FF │ 2020-08-02T00:00:00 │ 91.4 │\n│ 10 │ 123 │ FF │ 2020-08-02T00:00:00 │ 91.5 │\n⋮\n│ 7132 │ 7021 │ FF │ 2020-08-01T00:00:00 │ 95.0 │\n│ 7133 │ 7037 │ FF │ 2020-08-01T00:00:00 │ 96.1 │\n│ 7134 │ 7053 │ FF │ 2020-08-01T00:00:00 │ 96.2 │\n│ 7135 │ 7058 │ FF │ 2020-08-01T00:00:00 │ 96.3 │\n│ 7136 │ 7067 │ FF │ 2020-08-01T00:00:00 │ 95.7 │\n│ 7137 │ 7081 │ FC │ 2020-08-01T00:00:00 │ 90.7 │\n│ 7138 │ 7090 │ FF │ 2020-08-01T00:00:00 │ 96.4 │\n│ 7139 │ 7102 │ FF │ 2020-08-01T00:00:00 │ 97.4 │\n│ 7140 │ 7117 │ CU │ 2020-08-01T00:00:00 │ 79.4 │\n│ 7141 │ 7120 │ FF │ 2020-08-01T00:00:00 │ 95.9 │\n│ 7142 │ 7136 │ FF │ 2020-08-01T00:00:00 │ 93.4 │",
"text/html": "<table class=\"data-frame\"><thead><tr><th></th><th>index</th><th>pitch_type</th><th>game_date</th><th>release_speed</th><th>release_pos_x</th><th>release_pos_z</th></tr><tr><th></th><th>Any</th><th>Any</th><th>Any</th><th>Any</th><th>Any</th><th>Any</th></tr></thead><tbody><p>7,142 rows × 90 columns (omitted printing of 84 columns)</p><tr><th>1</th><td>89</td><td>FC</td><td>2020-08-02T00:00:00</td><td>89.8</td><td>-1.34</td><td>6.09</td></tr><tr><th>2</th><td>90</td><td>FF</td><td>2020-08-02T00:00:00</td><td>93.7</td><td>-1.33</td><td>5.87</td></tr><tr><th>3</th><td>96</td><td>FC</td><td>2020-08-02T00:00:00</td><td>89.5</td><td>-1.38</td><td>6.08</td></tr><tr><th>4</th><td>99</td><td>FC</td><td>2020-08-02T00:00:00</td><td>88.7</td><td>-1.48</td><td>6.03</td></tr><tr><th>5</th><td>104</td><td>FC</td><td>2020-08-02T00:00:00</td><td>90.4</td><td>-1.47</td><td>6.1</td></tr><tr><th>6</th><td>106</td><td>FC</td><td>2020-08-02T00:00:00</td><td>90.1</td><td>-1.63</td><td>6.05</td></tr><tr><th>7</th><td>110</td><td>FS</td><td>2020-08-02T00:00:00</td><td>87.3</td><td>-1.44</td><td>5.49</td></tr><tr><th>8</th><td>115</td><td>FS</td><td>2020-08-02T00:00:00</td><td>86.3</td><td>-1.34</td><td>5.51</td></tr><tr><th>9</th><td>118</td><td>FF</td><td>2020-08-02T00:00:00</td><td>91.4</td><td>-1.12</td><td>5.71</td></tr><tr><th>10</th><td>123</td><td>FF</td><td>2020-08-02T00:00:00</td><td>91.5</td><td>-1.17</td><td>5.64</td></tr><tr><th>11</th><td>126</td><td>FS</td><td>2020-08-02T00:00:00</td><td>87.3</td><td>-1.49</td><td>5.51</td></tr><tr><th>12</th><td>129</td><td>FS</td><td>2020-08-02T00:00:00</td><td>86.6</td><td>-1.49</td><td>5.55</td></tr><tr><th>13</th><td>135</td><td>SI</td><td>2020-08-02T00:00:00</td><td>90.0</td><td>-1.37</td><td>5.51</td></tr><tr><th>14</th><td>137</td><td>FS</td><td>2020-08-02T00:00:00</td><td>86.4</td><td>-1.45</td><td>5.58</td></tr><tr><th>15</th><td>143</td><td>KC</td><td>2020-08-02T00:00:00</td><td>78.3</td><td>-1.45</td><td>5.68</td></tr><tr><th>16</th><td>147</td><td>SL</td><td>2020-08-02T00:00:00</td><td>84.3</td><td>1.83</td><td>5.93</td></tr><tr><th>17</th><td>152</td><td>SL</td><td>2020-08-02T00:00:00</td><td>83.3</td><td>1.85</td><td>5.94</td></tr><tr><th>18</th><td>155</td><td>SL</td><td>2020-08-02T00:00:00</td><td>82.6</td><td>1.93</td><td>5.9</td></tr><tr><th>19</th><td>162</td><td>SL</td><td>2020-08-02T00:00:00</td><td>82.3</td><td>1.91</td><td>5.81</td></tr><tr><th>20</th><td>166</td><td>SL</td><td>2020-08-02T00:00:00</td><td>83.0</td><td>1.89</td><td>5.91</td></tr><tr><th>21</th><td>172</td><td>SL</td><td>2020-08-02T00:00:00</td><td>84.1</td><td>1.96</td><td>5.87</td></tr><tr><th>22</th><td>174</td><td>SL</td><td>2020-08-02T00:00:00</td><td>82.3</td><td>1.9</td><td>6.04</td></tr><tr><th>23</th><td>182</td><td>SL</td><td>2020-08-02T00:00:00</td><td>84.6</td><td>1.79</td><td>5.92</td></tr><tr><th>24</th><td>184</td><td>SL</td><td>2020-08-02T00:00:00</td><td>81.4</td><td>1.89</td><td>6.1</td></tr><tr><th>25</th><td>193</td><td>SI</td><td>2020-08-02T00:00:00</td><td>91.3</td><td>1.69</td><td>6.07</td></tr><tr><th>26</th><td>194</td><td>FF</td><td>2020-08-02T00:00:00</td><td>89.1</td><td>1.73</td><td>6.02</td></tr><tr><th>27</th><td>202</td><td>FF</td><td>2020-08-02T00:00:00</td><td>89.7</td><td>1.62</td><td>6.23</td></tr><tr><th>28</th><td>204</td><td>FF</td><td>2020-08-02T00:00:00</td><td>89.7</td><td>1.7</td><td>6.1</td></tr><tr><th>29</th><td>213</td><td>SL</td><td>2020-08-02T00:00:00</td><td>81.8</td><td>1.88</td><td>5.99</td></tr><tr><th>30</th><td>215</td><td>SL</td><td>2020-08-02T00:00:00</td><td>81.6</td><td>1.95</td><td>5.95</td></tr><tr><th>&vellip;</th><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td></tr></tbody></table>",
"text/latex": "\\begin{tabular}{r|ccccccc}\n\t& index & pitch\\_type & game\\_date & release\\_speed & release\\_pos\\_x & release\\_pos\\_z & \\\\\n\t\\hline\n\t& Any & Any & Any & Any & Any & Any & \\\\\n\t\\hline\n\t1 & 89 & FC & 2020-08-02T00:00:00 & 89.8 & -1.34 & 6.09 & $\\dots$ \\\\\n\t2 & 90 & FF & 2020-08-02T00:00:00 & 93.7 & -1.33 & 5.87 & $\\dots$ \\\\\n\t3 & 96 & FC & 2020-08-02T00:00:00 & 89.5 & -1.38 & 6.08 & $\\dots$ \\\\\n\t4 & 99 & FC & 2020-08-02T00:00:00 & 88.7 & -1.48 & 6.03 & $\\dots$ \\\\\n\t5 & 104 & FC & 2020-08-02T00:00:00 & 90.4 & -1.47 & 6.1 & $\\dots$ \\\\\n\t6 & 106 & FC & 2020-08-02T00:00:00 & 90.1 & -1.63 & 6.05 & $\\dots$ \\\\\n\t7 & 110 & FS & 2020-08-02T00:00:00 & 87.3 & -1.44 & 5.49 & $\\dots$ \\\\\n\t8 & 115 & FS & 2020-08-02T00:00:00 & 86.3 & -1.34 & 5.51 & $\\dots$ \\\\\n\t9 & 118 & FF & 2020-08-02T00:00:00 & 91.4 & -1.12 & 5.71 & $\\dots$ \\\\\n\t10 & 123 & FF & 2020-08-02T00:00:00 & 91.5 & -1.17 & 5.64 & $\\dots$ \\\\\n\t11 & 126 & FS & 2020-08-02T00:00:00 & 87.3 & -1.49 & 5.51 & $\\dots$ \\\\\n\t12 & 129 & FS & 2020-08-02T00:00:00 & 86.6 & -1.49 & 5.55 & $\\dots$ \\\\\n\t13 & 135 & SI & 2020-08-02T00:00:00 & 90.0 & -1.37 & 5.51 & $\\dots$ \\\\\n\t14 & 137 & FS & 2020-08-02T00:00:00 & 86.4 & -1.45 & 5.58 & $\\dots$ \\\\\n\t15 & 143 & KC & 2020-08-02T00:00:00 & 78.3 & -1.45 & 5.68 & $\\dots$ \\\\\n\t16 & 147 & SL & 2020-08-02T00:00:00 & 84.3 & 1.83 & 5.93 & $\\dots$ \\\\\n\t17 & 152 & SL & 2020-08-02T00:00:00 & 83.3 & 1.85 & 5.94 & $\\dots$ \\\\\n\t18 & 155 & SL & 2020-08-02T00:00:00 & 82.6 & 1.93 & 5.9 & $\\dots$ \\\\\n\t19 & 162 & SL & 2020-08-02T00:00:00 & 82.3 & 1.91 & 5.81 & $\\dots$ \\\\\n\t20 & 166 & SL & 2020-08-02T00:00:00 & 83.0 & 1.89 & 5.91 & $\\dots$ \\\\\n\t21 & 172 & SL & 2020-08-02T00:00:00 & 84.1 & 1.96 & 5.87 & $\\dots$ \\\\\n\t22 & 174 & SL & 2020-08-02T00:00:00 & 82.3 & 1.9 & 6.04 & $\\dots$ \\\\\n\t23 & 182 & SL & 2020-08-02T00:00:00 & 84.6 & 1.79 & 5.92 & $\\dots$ \\\\\n\t24 & 184 & SL & 2020-08-02T00:00:00 & 81.4 & 1.89 & 6.1 & $\\dots$ \\\\\n\t25 & 193 & SI & 2020-08-02T00:00:00 & 91.3 & 1.69 & 6.07 & $\\dots$ \\\\\n\t26 & 194 & FF & 2020-08-02T00:00:00 & 89.1 & 1.73 & 6.02 & $\\dots$ \\\\\n\t27 & 202 & FF & 2020-08-02T00:00:00 & 89.7 & 1.62 & 6.23 & $\\dots$ \\\\\n\t28 & 204 & FF & 2020-08-02T00:00:00 & 89.7 & 1.7 & 6.1 & $\\dots$ \\\\\n\t29 & 213 & SL & 2020-08-02T00:00:00 & 81.8 & 1.88 & 5.99 & $\\dots$ \\\\\n\t30 & 215 & SL & 2020-08-02T00:00:00 & 81.6 & 1.95 & 5.95 & $\\dots$ \\\\\n\t$\\dots$ & $\\dots$ & $\\dots$ & $\\dots$ & $\\dots$ & $\\dots$ & $\\dots$ & \\\\\n\\end{tabular}\n"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "@show names(df2);",
"execution_count": 11,
"outputs": [
{
"output_type": "stream",
"text": "names(df2) = [\"index\", \"pitch_type\", \"game_date\", \"release_speed\", \"release_pos_x\", \"release_pos_z\", \"player_name\", \"batter\", \"pitcher\", \"events\", \"description\", \"spin_dir\", \"spin_rate_deprecated\", \"break_angle_deprecated\", \"break_length_deprecated\", \"zone\", \"des\", \"game_type\", \"stand\", \"p_throws\", \"home_team\", \"away_team\", \"type\", \"hit_location\", \"bb_type\", \"balls\", \"strikes\", \"game_year\", \"pfx_x\", \"pfx_z\", \"plate_x\", \"plate_z\", \"on_3b\", \"on_2b\", \"on_1b\", \"outs_when_up\", \"inning\", \"inning_topbot\", \"hc_x\", \"hc_y\", \"tfs_deprecated\", \"tfs_zulu_deprecated\", \"fielder_2\", \"umpire\", \"sv_id\", \"vx0\", \"vy0\", \"vz0\", \"ax\", \"ay\", \"az\", \"sz_top\", \"sz_bot\", \"hit_distance_sc\", \"launch_speed\", \"launch_angle\", \"effective_speed\", \"release_spin_rate\", \"release_extension\", \"game_pk\", \"pitcher.1\", \"fielder_2.1\", \"fielder_3\", \"fielder_4\", \"fielder_5\", \"fielder_6\", \"fielder_7\", \"fielder_8\", \"fielder_9\", \"release_pos_y\", \"estimated_ba_using_speedangle\", \"estimated_woba_using_speedangle\", \"woba_value\", \"woba_denom\", \"babip_value\", \"iso_value\", \"launch_speed_angle\", \"at_bat_number\", \"pitch_number\", \"pitch_name\", \"home_score\", \"away_score\", \"bat_score\", \"fld_score\", \"post_away_score\", \"post_home_score\", \"post_bat_score\", \"post_fld_score\", \"if_fielding_alignment\", \"of_fielding_alignment\"]\n",
"name": "stdout"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "df2[!, :release_speed][1:10]",
"execution_count": 12,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 12,
"data": {
"text/plain": "10-element Array{Any,1}:\n 89.8\n 93.7\n 89.5\n 88.7\n 90.4\n 90.1\n 87.3\n 86.3\n 91.4\n 91.5"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "df2[!, :pitch_type][1:10]",
"execution_count": 13,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 13,
"data": {
"text/plain": "10-element Array{Any,1}:\n \"FC\"\n \"FF\"\n \"FC\"\n \"FC\"\n \"FC\"\n \"FC\"\n \"FS\"\n \"FS\"\n \"FF\"\n \"FF\""
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "df2[!, :game_date][1:10]",
"execution_count": 14,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 14,
"data": {
"text/plain": "10-element Array{Any,1}:\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "df2[!, :game_date][1] |> typeof",
"execution_count": 15,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 15,
"data": {
"text/plain": "Dates.DateTime"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## 試行錯誤"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "data = Array(Pandas.DataFrame(df_pandas))",
"execution_count": 16,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 16,
"data": {
"text/plain": "7142×90 Array{Any,2}:\n 89 \"FC\" … 1.0 \"Strategic\" \"Strategic\"\n 90 \"FF\" 1.0 \"Strategic\" \"Strategic\"\n 96 \"FC\" 1.0 \"Strategic\" \"Strategic\"\n 99 \"FC\" 1.0 \"Infield shift\" \"Standard\"\n 104 \"FC\" 1.0 \"Infield shift\" \"Standard\"\n 106 \"FC\" … 1.0 \"Infield shift\" \"Standard\"\n 110 \"FS\" 1.0 \"Standard\" \"Standard\"\n 115 \"FS\" 1.0 \"Standard\" \"Standard\"\n 118 \"FF\" 1.0 \"Infield shift\" \"Standard\"\n 123 \"FF\" 1.0 \"Infield shift\" \"Standard\"\n 126 \"FS\" … 1.0 \"Infield shift\" \"Standard\"\n 129 \"FS\" 1.0 \"Standard\" \"Standard\"\n 135 \"SI\" 1.0 \"Standard\" \"Standard\"\n ⋮ ⋱ \n 7018 \"CH\" … 0.0 \"Strategic\" \"Standard\"\n 7021 \"FF\" 0.0 \"Strategic\" \"Standard\"\n 7037 \"FF\" 0.0 \"Standard\" \"Standard\"\n 7053 \"FF\" 0.0 \"Standard\" \"Standard\"\n 7058 \"FF\" 0.0 \"Standard\" \"Standard\"\n 7067 \"FF\" … 0.0 \"Standard\" \"Standard\"\n 7081 \"FC\" 0.0 \"Standard\" \"Standard\"\n 7090 \"FF\" 0.0 \"Strategic\" \"Standard\"\n 7102 \"FF\" 0.0 \"Infield shift\" \"Standard\"\n 7117 \"CU\" 0.0 \"Infield shift\" \"Standard\"\n 7120 \"FF\" … 0.0 \"Infield shift\" \"Standard\"\n 7136 \"FF\" 0.0 \"Infield shift\" \"Standard\""
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "Array(Pandas.DataFrame(df_pandas)[:index])",
"execution_count": 17,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 17,
"data": {
"text/plain": "7142-element Array{Int64,1}:\n 89\n 90\n 96\n 99\n 104\n 106\n 110\n 115\n 118\n 123\n 126\n 129\n 135\n ⋮\n 7018\n 7021\n 7037\n 7053\n 7058\n 7067\n 7081\n 7090\n 7102\n 7117\n 7120\n 7136"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "Array(Pandas.DataFrame(df_pandas)[:pitch_type])",
"execution_count": 18,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 18,
"data": {
"text/plain": "7142-element Array{Any,1}:\n \"FC\"\n \"FF\"\n \"FC\"\n \"FC\"\n \"FC\"\n \"FC\"\n \"FS\"\n \"FS\"\n \"FF\"\n \"FF\"\n \"FS\"\n \"FS\"\n \"SI\"\n ⋮\n \"CH\"\n \"FF\"\n \"FF\"\n \"FF\"\n \"FF\"\n \"FF\"\n \"FC\"\n \"FF\"\n \"FF\"\n \"CU\"\n \"FF\"\n \"FF\""
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "Array(Pandas.DataFrame(df_pandas)[:game_date])",
"execution_count": 19,
"outputs": [
{
"output_type": "error",
"ename": "LoadError",
"evalue": "BoundsError: attempt to access Core.SimpleVector\n at index [1]",
"traceback": [
"BoundsError: attempt to access Core.SimpleVector\n at index [1]",
"",
"Stacktrace:",
" [1] getindex(::Core.SimpleVector, ::Int64) at .\\essentials.jl:583",
" [2] Array(::Pandas.Series) at C:\\Users\\genkuroki\\.julia\\packages\\Pandas\\rAPmB\\src\\Pandas.jl:81",
" [3] top-level scope at In[19]:1",
" [4] include_string(::Function, ::Module, ::String, ::String) at .\\loading.jl:1091",
" [5] execute_code(::String, ::String) at C:\\Users\\genkuroki\\.julia\\packages\\IJulia\\rWZ9e\\src\\execute_request.jl:27",
" [6] execute_request(::ZMQ.Socket, ::IJulia.Msg) at C:\\Users\\genkuroki\\.julia\\packages\\IJulia\\rWZ9e\\src\\execute_request.jl:86",
" [7] #invokelatest#1 at .\\essentials.jl:710 [inlined]",
" [8] invokelatest at .\\essentials.jl:709 [inlined]",
" [9] eventloop(::ZMQ.Socket) at C:\\Users\\genkuroki\\.julia\\packages\\IJulia\\rWZ9e\\src\\eventloop.jl:8",
" [10] (::IJulia.var\"#15#18\")() at .\\task.jl:356"
]
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "using Dates\nPandas.DataFrame(df_pandas)[:game_date] .|> Dates.DateTime",
"execution_count": 20,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 20,
"data": {
"text/plain": "7142-element Array{DateTime,1}:\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n ⋮\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "@which Array(Pandas.DataFrame(df_pandas))",
"execution_count": 21,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 21,
"data": {
"text/plain": "(::Type{Array})(x::Pandas.PandasWrapped) in Pandas at C:\\Users\\genkuroki\\.julia\\packages\\Pandas\\rAPmB\\src\\Pandas.jl:79",
"text/html": "(::<b>Type{Array}</b>)(x::<b>Pandas.PandasWrapped</b>) in Pandas at <a href=\"file://C:/Users/genkuroki/.julia/packages/Pandas/rAPmB/src/Pandas.jl\" target=\"_blank\">C:\\Users\\genkuroki\\.julia\\packages\\Pandas\\rAPmB\\src\\Pandas.jl:79</a>"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "https://github.com/JuliaPy/Pandas.jl/blob/master/src/Pandas.jl#L79-L90\n```julia\nfunction Base.Array(x::PandasWrapped)\n c = np.asarray(x.pyo)\n if typeof(c).parameters[1] == PyObject\n out = Array{Any}(undef, size(x))\n for idx in eachindex(out)\n out[idx] = convert(PyAny, c[idx])\n end\n out\n else\n c\n end\nend\n```"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "using PyCall\nnp = pyimport(\"numpy\")",
"execution_count": 22,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 22,
"data": {
"text/plain": "PyObject <module 'numpy' from 'C:\\\\Users\\\\genkuroki\\\\.julia\\\\conda\\\\3\\\\lib\\\\site-packages\\\\numpy\\\\__init__.py'>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "x = Pandas.DataFrame(df_pandas)\nX = np.asarray(x.pyo)",
"execution_count": 23,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 23,
"data": {
"text/plain": "7142×90 Array{PyObject,2}:\n PyObject 89 PyObject 'FC' … PyObject 'Strategic'\n PyObject 90 PyObject 'FF' PyObject 'Strategic'\n PyObject 96 PyObject 'FC' PyObject 'Strategic'\n PyObject 99 PyObject 'FC' PyObject 'Standard'\n PyObject 104 PyObject 'FC' PyObject 'Standard'\n PyObject 106 PyObject 'FC' … PyObject 'Standard'\n PyObject 110 PyObject 'FS' PyObject 'Standard'\n PyObject 115 PyObject 'FS' PyObject 'Standard'\n PyObject 118 PyObject 'FF' PyObject 'Standard'\n PyObject 123 PyObject 'FF' PyObject 'Standard'\n PyObject 126 PyObject 'FS' … PyObject 'Standard'\n PyObject 129 PyObject 'FS' PyObject 'Standard'\n PyObject 135 PyObject 'SI' PyObject 'Standard'\n ⋮ ⋱ \n PyObject 7018 PyObject 'CH' … PyObject 'Standard'\n PyObject 7021 PyObject 'FF' PyObject 'Standard'\n PyObject 7037 PyObject 'FF' PyObject 'Standard'\n PyObject 7053 PyObject 'FF' PyObject 'Standard'\n PyObject 7058 PyObject 'FF' PyObject 'Standard'\n PyObject 7067 PyObject 'FF' … PyObject 'Standard'\n PyObject 7081 PyObject 'FC' PyObject 'Standard'\n PyObject 7090 PyObject 'FF' PyObject 'Standard'\n PyObject 7102 PyObject 'FF' PyObject 'Standard'\n PyObject 7117 PyObject 'CU' PyObject 'Standard'\n PyObject 7120 PyObject 'FF' … PyObject 'Standard'\n PyObject 7136 PyObject 'FF' PyObject 'Standard'"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "convert.(PyAny, @view(X[:,3]))",
"execution_count": 24,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 24,
"data": {
"text/plain": "7142-element Array{DateTime,1}:\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n ⋮\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00\n 2020-08-01T00:00:00"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "c = [@view(X[:,i]) for i in axes(X, 2)]",
"execution_count": 25,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 25,
"data": {
"text/plain": "90-element Array{SubArray{PyObject,1,Array{PyObject,2},Tuple{Base.Slice{Base.OneTo{Int64}},Int64},true},1}:\n [PyObject 89, PyObject 90, PyObject 96, PyObject 99, PyObject 104, PyObject 106, PyObject 110, PyObject 115, PyObject 118, PyObject 123 … PyObject 7037, PyObject 7053, PyObject 7058, PyObject 7067, PyObject 7081, PyObject 7090, PyObject 7102, PyObject 7117, PyObject 7120, PyObject 7136]\n [PyObject 'FC', PyObject 'FF', PyObject 'FC', PyObject 'FC', PyObject 'FC', PyObject 'FC', PyObject 'FS', PyObject 'FS', PyObject 'FF', PyObject 'FF' … PyObject 'FF', PyObject 'FF', PyObject 'FF', PyObject 'FF', PyObject 'FC', PyObject 'FF', PyObject 'FF', PyObject 'CU', PyObject 'FF', PyObject 'FF']\n [PyObject Timestamp('2020-08-02 00:00:00'), PyObject Timestamp('2020-08-02 00:00:00'), PyObject Timestamp('2020-08-02 00:00:00'), PyObject Timestamp('2020-08-02 00:00:00'), PyObject Timestamp('2020-08-02 00:00:00'), PyObject Timestamp('2020-08-02 00:00:00'), PyObject Timestamp('2020-08-02 00:00:00'), PyObject Timestamp('2020-08-02 00:00:00'), PyObject Timestamp('2020-08-02 00:00:00'), PyObject Timestamp('2020-08-02 00:00:00') … PyObject Timestamp('2020-08-01 00:00:00'), PyObject Timestamp('2020-08-01 00:00:00'), PyObject Timestamp('2020-08-01 00:00:00'), PyObject Timestamp('2020-08-01 00:00:00'), PyObject Timestamp('2020-08-01 00:00:00'), PyObject Timestamp('2020-08-01 00:00:00'), PyObject Timestamp('2020-08-01 00:00:00'), PyObject Timestamp('2020-08-01 00:00:00'), PyObject Timestamp('2020-08-01 00:00:00'), PyObject Timestamp('2020-08-01 00:00:00')]\n [PyObject 89.8, PyObject 93.7, PyObject 89.5, PyObject 88.7, PyObject 90.4, PyObject 90.1, PyObject 87.3, PyObject 86.3, PyObject 91.4, PyObject 91.5 … PyObject 96.1, PyObject 96.2, PyObject 96.3, PyObject 95.7, PyObject 90.7, PyObject 96.4, PyObject 97.4, PyObject 79.4, PyObject 95.9, PyObject 93.4]\n [PyObject -1.34, PyObject -1.33, PyObject -1.38, PyObject -1.48, PyObject -1.47, PyObject -1.63, PyObject -1.44, PyObject -1.34, PyObject -1.12, PyObject -1.17 … PyObject -1.12, PyObject -0.98, PyObject -0.94, PyObject -1.08, PyObject -1.07, PyObject -1.09, PyObject -1.11, PyObject -1.08, PyObject -1.12, PyObject -1.14]\n [PyObject 6.09, PyObject 5.87, PyObject 6.08, PyObject 6.03, PyObject 6.1, PyObject 6.05, PyObject 5.49, PyObject 5.51, PyObject 5.71, PyObject 5.64 … PyObject 5.69, PyObject 5.83, PyObject 5.91, PyObject 5.81, PyObject 5.77, PyObject 5.81, PyObject 5.82, PyObject 5.77, PyObject 5.79, PyObject 5.75]\n [PyObject 'Cody Ponce', PyObject 'Cody Ponce', PyObject 'Cody Ponce', PyObject 'Cody Ponce', PyObject 'Cody Ponce', PyObject 'Cody Ponce', PyObject 'Jeremy Jeffress', PyObject 'Jeremy Jeffress', PyObject 'Jeremy Jeffress', PyObject 'Jeremy Jeffress' … PyObject 'Luke Weaver', PyObject 'Luke Weaver', PyObject 'Luke Weaver', PyObject 'Luke Weaver', PyObject 'Luke Weaver', PyObject 'Luke Weaver', PyObject 'Luke Weaver', PyObject 'Luke Weaver', PyObject 'Luke Weaver', PyObject 'Luke Weaver']\n [PyObject 595879.0, PyObject 595879.0, PyObject 595879.0, PyObject 519203.0, PyObject 519203.0, PyObject 519203.0, PyObject 502481.0, PyObject 502481.0, PyObject 592567.0, PyObject 592567.0 … PyObject 605141.0, PyObject 605141.0, PyObject 605141.0, PyObject 605141.0, PyObject 605141.0, PyObject 605141.0, PyObject 571970.0, PyObject 571970.0, PyObject 571970.0, PyObject 571970.0]\n [PyObject 664074.0, PyObject 664074.0, PyObject 664074.0, PyObject 664074.0, PyObject 664074.0, PyObject 664074.0, PyObject 502026.0, PyObject 502026.0, PyObject 502026.0, PyObject 502026.0 … PyObject 596133.0, PyObject 596133.0, PyObject 596133.0, PyObject 596133.0, PyObject 596133.0, PyObject 596133.0, PyObject 596133.0, PyObject 596133.0, PyObject 596133.0, PyObject 596133.0]\n [PyObject 'single', PyObject nan, PyObject nan, PyObject 'field_out', PyObject nan, PyObject nan, PyObject 'field_out', PyObject nan, PyObject 'field_out', PyObject nan … PyObject 'double', PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject 'strikeout', PyObject nan, PyObject nan, PyObject nan]\n [PyObject 'hit_into_play_score', PyObject 'ball', PyObject 'ball', PyObject 'hit_into_play', PyObject 'foul', PyObject 'called_strike', PyObject 'hit_into_play', PyObject 'swinging_strike', PyObject 'hit_into_play', PyObject 'swinging_strike' … PyObject 'hit_into_play_no_out', PyObject 'ball', PyObject 'ball', PyObject 'ball', PyObject 'called_strike', PyObject 'called_strike', PyObject 'swinging_strike', PyObject 'foul', PyObject 'ball', PyObject 'foul']\n [PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan … PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan]\n [PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan … PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan, PyObject nan]\n ⋮\n [PyObject 3.0, PyObject 2.0, PyObject 1.0, PyObject 3.0, PyObject 2.0, PyObject 1.0, PyObject 2.0, PyObject 1.0, PyObject 3.0, PyObject 2.0 … PyObject 6.0, PyObject 5.0, PyObject 4.0, PyObject 3.0, PyObject 2.0, PyObject 1.0, PyObject 4.0, PyObject 3.0, PyObject 2.0, PyObject 1.0]\n [PyObject 'Cutter', PyObject '4-Seam Fastball', PyObject 'Cutter', PyObject 'Cutter', PyObject 'Cutter', PyObject 'Cutter', PyObject 'Split-Finger', PyObject 'Split-Finger', PyObject '4-Seam Fastball', PyObject '4-Seam Fastball' … PyObject '4-Seam Fastball', PyObject '4-Seam Fastball', PyObject '4-Seam Fastball', PyObject '4-Seam Fastball', PyObject 'Cutter', PyObject '4-Seam Fastball', PyObject '4-Seam Fastball', PyObject 'Curveball', PyObject '4-Seam Fastball', PyObject '4-Seam Fastball']\n [PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0 … PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0]\n [PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0 … PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0]\n [PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0 … PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0]\n [PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0 … PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0]\n [PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0 … PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0]\n [PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0 … PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0]\n [PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0 … PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0]\n [PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0, PyObject 1.0 … PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0, PyObject 0.0]\n [PyObject 'Strategic', PyObject 'Strategic', PyObject 'Strategic', PyObject 'Infield shift', PyObject 'Infield shift', PyObject 'Infield shift', PyObject 'Standard', PyObject 'Standard', PyObject 'Infield shift', PyObject 'Infield shift' … PyObject 'Standard', PyObject 'Standard', PyObject 'Standard', PyObject 'Standard', PyObject 'Standard', PyObject 'Strategic', PyObject 'Infield shift', PyObject 'Infield shift', PyObject 'Infield shift', PyObject 'Infield shift']\n [PyObject 'Strategic', PyObject 'Strategic', PyObject 'Strategic', PyObject 'Standard', PyObject 'Standard', PyObject 'Standard', PyObject 'Standard', PyObject 'Standard', PyObject 'Standard', PyObject 'Standard' … PyObject 'Standard', PyObject 'Standard', PyObject 'Standard', PyObject 'Standard', PyObject 'Standard', PyObject 'Standard', PyObject 'Standard', PyObject 'Standard', PyObject 'Standard', PyObject 'Standard']"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "typeof(X).parameters[1]",
"execution_count": 26,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 26,
"data": {
"text/plain": "PyObject"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## 方法3: numpyとconvert(PyAny, c)を使う方法"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "using PyCall\n\nfunction VectorOfVectors(x::Pandas.PandasWrapped)\n X = pyimport(\"numpy\").asarray(x.pyo)\n C = [@view(X[:,i]) for i in axes(X, 2)]\n typeof(X).parameters[1] == PyObject || return C\n [convert.(PyAny, c) for c in C]\nend\n\nfunction pandas_to_df(df_pandas)\n colnames = Symbol.(df_pandas.columns)\n data = VectorOfVectors(Pandas.DataFrame(df_pandas))\n DataFrame(data, colnames)\nend\n\ndf3 = pandas_to_df(df_pandas)",
"execution_count": 27,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 27,
"data": {
"text/plain": "7142×90 DataFrame. Omitted printing of 86 columns\n│ Row │ index │ pitch_type │ game_date │ release_speed │\n│ │ \u001b[90mInt64\u001b[39m │ \u001b[90mString\u001b[39m │ \u001b[90mDateTime\u001b[39m │ \u001b[90mFloat64\u001b[39m │\n├──────┼───────┼────────────┼─────────────────────┼───────────────┤\n│ 1 │ 89 │ FC │ 2020-08-02T00:00:00 │ 89.8 │\n│ 2 │ 90 │ FF │ 2020-08-02T00:00:00 │ 93.7 │\n│ 3 │ 96 │ FC │ 2020-08-02T00:00:00 │ 89.5 │\n│ 4 │ 99 │ FC │ 2020-08-02T00:00:00 │ 88.7 │\n│ 5 │ 104 │ FC │ 2020-08-02T00:00:00 │ 90.4 │\n│ 6 │ 106 │ FC │ 2020-08-02T00:00:00 │ 90.1 │\n│ 7 │ 110 │ FS │ 2020-08-02T00:00:00 │ 87.3 │\n│ 8 │ 115 │ FS │ 2020-08-02T00:00:00 │ 86.3 │\n│ 9 │ 118 │ FF │ 2020-08-02T00:00:00 │ 91.4 │\n│ 10 │ 123 │ FF │ 2020-08-02T00:00:00 │ 91.5 │\n⋮\n│ 7132 │ 7021 │ FF │ 2020-08-01T00:00:00 │ 95.0 │\n│ 7133 │ 7037 │ FF │ 2020-08-01T00:00:00 │ 96.1 │\n│ 7134 │ 7053 │ FF │ 2020-08-01T00:00:00 │ 96.2 │\n│ 7135 │ 7058 │ FF │ 2020-08-01T00:00:00 │ 96.3 │\n│ 7136 │ 7067 │ FF │ 2020-08-01T00:00:00 │ 95.7 │\n│ 7137 │ 7081 │ FC │ 2020-08-01T00:00:00 │ 90.7 │\n│ 7138 │ 7090 │ FF │ 2020-08-01T00:00:00 │ 96.4 │\n│ 7139 │ 7102 │ FF │ 2020-08-01T00:00:00 │ 97.4 │\n│ 7140 │ 7117 │ CU │ 2020-08-01T00:00:00 │ 79.4 │\n│ 7141 │ 7120 │ FF │ 2020-08-01T00:00:00 │ 95.9 │\n│ 7142 │ 7136 │ FF │ 2020-08-01T00:00:00 │ 93.4 │",
"text/html": "<table class=\"data-frame\"><thead><tr><th></th><th>index</th><th>pitch_type</th><th>game_date</th><th>release_speed</th><th>release_pos_x</th><th>release_pos_z</th></tr><tr><th></th><th>Int64</th><th>String</th><th>DateTime</th><th>Float64</th><th>Float64</th><th>Float64</th></tr></thead><tbody><p>7,142 rows × 90 columns (omitted printing of 84 columns)</p><tr><th>1</th><td>89</td><td>FC</td><td>2020-08-02T00:00:00</td><td>89.8</td><td>-1.34</td><td>6.09</td></tr><tr><th>2</th><td>90</td><td>FF</td><td>2020-08-02T00:00:00</td><td>93.7</td><td>-1.33</td><td>5.87</td></tr><tr><th>3</th><td>96</td><td>FC</td><td>2020-08-02T00:00:00</td><td>89.5</td><td>-1.38</td><td>6.08</td></tr><tr><th>4</th><td>99</td><td>FC</td><td>2020-08-02T00:00:00</td><td>88.7</td><td>-1.48</td><td>6.03</td></tr><tr><th>5</th><td>104</td><td>FC</td><td>2020-08-02T00:00:00</td><td>90.4</td><td>-1.47</td><td>6.1</td></tr><tr><th>6</th><td>106</td><td>FC</td><td>2020-08-02T00:00:00</td><td>90.1</td><td>-1.63</td><td>6.05</td></tr><tr><th>7</th><td>110</td><td>FS</td><td>2020-08-02T00:00:00</td><td>87.3</td><td>-1.44</td><td>5.49</td></tr><tr><th>8</th><td>115</td><td>FS</td><td>2020-08-02T00:00:00</td><td>86.3</td><td>-1.34</td><td>5.51</td></tr><tr><th>9</th><td>118</td><td>FF</td><td>2020-08-02T00:00:00</td><td>91.4</td><td>-1.12</td><td>5.71</td></tr><tr><th>10</th><td>123</td><td>FF</td><td>2020-08-02T00:00:00</td><td>91.5</td><td>-1.17</td><td>5.64</td></tr><tr><th>11</th><td>126</td><td>FS</td><td>2020-08-02T00:00:00</td><td>87.3</td><td>-1.49</td><td>5.51</td></tr><tr><th>12</th><td>129</td><td>FS</td><td>2020-08-02T00:00:00</td><td>86.6</td><td>-1.49</td><td>5.55</td></tr><tr><th>13</th><td>135</td><td>SI</td><td>2020-08-02T00:00:00</td><td>90.0</td><td>-1.37</td><td>5.51</td></tr><tr><th>14</th><td>137</td><td>FS</td><td>2020-08-02T00:00:00</td><td>86.4</td><td>-1.45</td><td>5.58</td></tr><tr><th>15</th><td>143</td><td>KC</td><td>2020-08-02T00:00:00</td><td>78.3</td><td>-1.45</td><td>5.68</td></tr><tr><th>16</th><td>147</td><td>SL</td><td>2020-08-02T00:00:00</td><td>84.3</td><td>1.83</td><td>5.93</td></tr><tr><th>17</th><td>152</td><td>SL</td><td>2020-08-02T00:00:00</td><td>83.3</td><td>1.85</td><td>5.94</td></tr><tr><th>18</th><td>155</td><td>SL</td><td>2020-08-02T00:00:00</td><td>82.6</td><td>1.93</td><td>5.9</td></tr><tr><th>19</th><td>162</td><td>SL</td><td>2020-08-02T00:00:00</td><td>82.3</td><td>1.91</td><td>5.81</td></tr><tr><th>20</th><td>166</td><td>SL</td><td>2020-08-02T00:00:00</td><td>83.0</td><td>1.89</td><td>5.91</td></tr><tr><th>21</th><td>172</td><td>SL</td><td>2020-08-02T00:00:00</td><td>84.1</td><td>1.96</td><td>5.87</td></tr><tr><th>22</th><td>174</td><td>SL</td><td>2020-08-02T00:00:00</td><td>82.3</td><td>1.9</td><td>6.04</td></tr><tr><th>23</th><td>182</td><td>SL</td><td>2020-08-02T00:00:00</td><td>84.6</td><td>1.79</td><td>5.92</td></tr><tr><th>24</th><td>184</td><td>SL</td><td>2020-08-02T00:00:00</td><td>81.4</td><td>1.89</td><td>6.1</td></tr><tr><th>25</th><td>193</td><td>SI</td><td>2020-08-02T00:00:00</td><td>91.3</td><td>1.69</td><td>6.07</td></tr><tr><th>26</th><td>194</td><td>FF</td><td>2020-08-02T00:00:00</td><td>89.1</td><td>1.73</td><td>6.02</td></tr><tr><th>27</th><td>202</td><td>FF</td><td>2020-08-02T00:00:00</td><td>89.7</td><td>1.62</td><td>6.23</td></tr><tr><th>28</th><td>204</td><td>FF</td><td>2020-08-02T00:00:00</td><td>89.7</td><td>1.7</td><td>6.1</td></tr><tr><th>29</th><td>213</td><td>SL</td><td>2020-08-02T00:00:00</td><td>81.8</td><td>1.88</td><td>5.99</td></tr><tr><th>30</th><td>215</td><td>SL</td><td>2020-08-02T00:00:00</td><td>81.6</td><td>1.95</td><td>5.95</td></tr><tr><th>&vellip;</th><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td><td>&vellip;</td></tr></tbody></table>",
"text/latex": "\\begin{tabular}{r|ccccccc}\n\t& index & pitch\\_type & game\\_date & release\\_speed & release\\_pos\\_x & release\\_pos\\_z & \\\\\n\t\\hline\n\t& Int64 & String & DateTime & Float64 & Float64 & Float64 & \\\\\n\t\\hline\n\t1 & 89 & FC & 2020-08-02T00:00:00 & 89.8 & -1.34 & 6.09 & $\\dots$ \\\\\n\t2 & 90 & FF & 2020-08-02T00:00:00 & 93.7 & -1.33 & 5.87 & $\\dots$ \\\\\n\t3 & 96 & FC & 2020-08-02T00:00:00 & 89.5 & -1.38 & 6.08 & $\\dots$ \\\\\n\t4 & 99 & FC & 2020-08-02T00:00:00 & 88.7 & -1.48 & 6.03 & $\\dots$ \\\\\n\t5 & 104 & FC & 2020-08-02T00:00:00 & 90.4 & -1.47 & 6.1 & $\\dots$ \\\\\n\t6 & 106 & FC & 2020-08-02T00:00:00 & 90.1 & -1.63 & 6.05 & $\\dots$ \\\\\n\t7 & 110 & FS & 2020-08-02T00:00:00 & 87.3 & -1.44 & 5.49 & $\\dots$ \\\\\n\t8 & 115 & FS & 2020-08-02T00:00:00 & 86.3 & -1.34 & 5.51 & $\\dots$ \\\\\n\t9 & 118 & FF & 2020-08-02T00:00:00 & 91.4 & -1.12 & 5.71 & $\\dots$ \\\\\n\t10 & 123 & FF & 2020-08-02T00:00:00 & 91.5 & -1.17 & 5.64 & $\\dots$ \\\\\n\t11 & 126 & FS & 2020-08-02T00:00:00 & 87.3 & -1.49 & 5.51 & $\\dots$ \\\\\n\t12 & 129 & FS & 2020-08-02T00:00:00 & 86.6 & -1.49 & 5.55 & $\\dots$ \\\\\n\t13 & 135 & SI & 2020-08-02T00:00:00 & 90.0 & -1.37 & 5.51 & $\\dots$ \\\\\n\t14 & 137 & FS & 2020-08-02T00:00:00 & 86.4 & -1.45 & 5.58 & $\\dots$ \\\\\n\t15 & 143 & KC & 2020-08-02T00:00:00 & 78.3 & -1.45 & 5.68 & $\\dots$ \\\\\n\t16 & 147 & SL & 2020-08-02T00:00:00 & 84.3 & 1.83 & 5.93 & $\\dots$ \\\\\n\t17 & 152 & SL & 2020-08-02T00:00:00 & 83.3 & 1.85 & 5.94 & $\\dots$ \\\\\n\t18 & 155 & SL & 2020-08-02T00:00:00 & 82.6 & 1.93 & 5.9 & $\\dots$ \\\\\n\t19 & 162 & SL & 2020-08-02T00:00:00 & 82.3 & 1.91 & 5.81 & $\\dots$ \\\\\n\t20 & 166 & SL & 2020-08-02T00:00:00 & 83.0 & 1.89 & 5.91 & $\\dots$ \\\\\n\t21 & 172 & SL & 2020-08-02T00:00:00 & 84.1 & 1.96 & 5.87 & $\\dots$ \\\\\n\t22 & 174 & SL & 2020-08-02T00:00:00 & 82.3 & 1.9 & 6.04 & $\\dots$ \\\\\n\t23 & 182 & SL & 2020-08-02T00:00:00 & 84.6 & 1.79 & 5.92 & $\\dots$ \\\\\n\t24 & 184 & SL & 2020-08-02T00:00:00 & 81.4 & 1.89 & 6.1 & $\\dots$ \\\\\n\t25 & 193 & SI & 2020-08-02T00:00:00 & 91.3 & 1.69 & 6.07 & $\\dots$ \\\\\n\t26 & 194 & FF & 2020-08-02T00:00:00 & 89.1 & 1.73 & 6.02 & $\\dots$ \\\\\n\t27 & 202 & FF & 2020-08-02T00:00:00 & 89.7 & 1.62 & 6.23 & $\\dots$ \\\\\n\t28 & 204 & FF & 2020-08-02T00:00:00 & 89.7 & 1.7 & 6.1 & $\\dots$ \\\\\n\t29 & 213 & SL & 2020-08-02T00:00:00 & 81.8 & 1.88 & 5.99 & $\\dots$ \\\\\n\t30 & 215 & SL & 2020-08-02T00:00:00 & 81.6 & 1.95 & 5.95 & $\\dots$ \\\\\n\t$\\dots$ & $\\dots$ & $\\dots$ & $\\dots$ & $\\dots$ & $\\dots$ & $\\dots$ & \\\\\n\\end{tabular}\n"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "df3[!, :release_speed][1:10]",
"execution_count": 28,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 28,
"data": {
"text/plain": "10-element Array{Float64,1}:\n 89.8\n 93.7\n 89.5\n 88.7\n 90.4\n 90.1\n 87.3\n 86.3\n 91.4\n 91.5"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "df3[!, :pitch_type][1:10]",
"execution_count": 29,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 29,
"data": {
"text/plain": "10-element Array{String,1}:\n \"FC\"\n \"FF\"\n \"FC\"\n \"FC\"\n \"FC\"\n \"FC\"\n \"FS\"\n \"FS\"\n \"FF\"\n \"FF\""
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "df3[!, :game_date][1:10]",
"execution_count": 30,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 30,
"data": {
"text/plain": "10-element Array{DateTime,1}:\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00\n 2020-08-02T00:00:00"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"@webio": {
"lastKernelId": null,
"lastCommId": null
},
"_draft": {
"nbviewer_url": "https://gist.github.com/d500887a7574cc3f99f51f37dc10a5c2"
},
"gist": {
"id": "d500887a7574cc3f99f51f37dc10a5c2",
"data": {
"description": "PyCall pybaseball example",
"public": true
}
},
"kernelspec": {
"name": "julia-mkl-depwarn--o3-1.5",
"display_name": "Julia MKL depwarn -O3 1.5.2",
"language": "julia"
},
"language_info": {
"file_extension": ".jl",
"name": "julia",
"mimetype": "application/julia",
"version": "1.5.2"
},
"toc": {
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": true,
"base_numbering": 1,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": true,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment