Bạn có thể sử dụng phương thức Pandas Transform () cho các tập hợp nhóm như "Over (phân vùng bởi ...)" trong SQL:
Làm thế nào để bạn sắp xếp các giá trị trong gấu trúc nhóm? – Use .groupby and .transform to achieve SQL-like window functionality in Pandas
Sắp xếp các giá trị theo thứ tự giảm dần với GroupBy, bạn có thể sắp xếp các giá trị theo thứ tự giảm dần bằng cách sử dụng phương thức ascending = false param sang sort_values (). Hàm đầu () được sử dụng để có được n hàng đầu tiên. Nó rất hữu ích cho việc kiểm tra nhanh chóng nếu đối tượng của bạn có đúng loại dữ liệu trong đó.
tl; dr-sử dụng .groupby và .transform để đạt được chức năng cửa sổ giống SQL trong gấu trúc
Dữ liệu cắt và cắt giảm dữ liệu bằng gấu trúc và SQL là một kỹ năng chính cho bất kỳ nhà khoa học dữ liệu nào.
Các nhà khoa học dữ liệu thường sẽ làm việc với cả SQL và gấu trúc để chuyển đổi dữ liệu tùy thuộc vào trường hợp sử dụng cụ thể và nơi lưu trữ dữ liệu. Ví dụ: SQL thường được sử dụng khi làm việc trực tiếp với dữ liệu trong cơ sở dữ liệu, tức là tạo các bảng hoặc chế độ xem mới của dữ liệu. Gandas được sử dụng thường xuyên hơn khi xử lý trước dữ liệu cho các quy trình công việc học máy hoặc trực quan hóa.
Điều quan trọng là phải lưu loát với cả cú pháp SQL và Pandas để có thể chuyển đổi liền mạch dữ liệu của bạn cho câu hỏi kinh doanh mà bạn đang cố gắng trả lời.
Tuy nhiên, có những trường hợp thực hiện các phép biến đổi nhất định dễ diễn ra bằng ngôn ngữ này hơn ngôn ngữ khác.
Đối với tôi, điều này dường như luôn xảy ra khi cố gắng thực hiện các phép biến đổi liên quan đến các chức năng cửa sổ bằng gấu trúc. Tôi không biết nó là gì, nhưng tôi thấy cú pháp SQL cho các chức năng cửa sổ sẽ trực quan hơn nhiều.
Trong bài đăng này, tôi sẽ mô tả sự khác biệt giữa cú pháp SQL và PANDAS để áp dụng các tính toán chức năng cửa sổ cho các phân vùng khác nhau trong dữ liệu của bạn.
Các chức năng cửa sổ cho phép người dùng thực hiện các tập hợp và tính toán so với các mặt cắt (phân vùng) khác nhau của dữ liệu. Trái ngược với các hàm tập hợp tiêu chuẩn (ví dụ: tổng, giá trị trung bình, đếm, v.v.) trả về một giá trị duy nhất cho mỗi phân vùng được xác định trong truy vấn, các hàm cửa sổ trả về một giá trị cho mỗi hàng trong bảng gốc.
Khi nào bạn sẽ sử dụng chức năng cửa sổ?
Tôi thấy có hai kịch bản chính trong quy trình công việc khoa học dữ liệu liên quan đến các chức năng cửa sổ:
- nội suy hoặc buộc các giá trị bị thiếu dựa trên các thuộc tính thống kê của các giá trị khác trong cùng một nhóm
- Tạo các tính năng mới cho các mô hình ML
Khi bạn có dữ liệu bảng điều khiển, các chức năng cửa sổ rất hữu ích để tăng cường dữ liệu của bạn với các tính năng mới đại diện cho các thuộc tính tổng hợp của các phân vùng cụ thể trong dữ liệu của bạn.
Ví dụ, hãy tưởng tượng bạn đang tạo ra một mô hình để dự đoán giá nhà trong khu phố của bạn cung cấp nhiều thông tin khác nhau về mỗi ngôi nhà như loại nhà (ví dụ: tách rời, căn hộ, v.v.), diện tích sàn, số phòng ngủ, số phòng tắm, v.v.
Một tính năng bạn có thể muốn tạo cho mô hình của mình là so sánh diện tích sàn của ngôi nhà hiện tại với khu vực trung bình cho một ngôi nhà thuộc loại cụ thể đó. Giả thuyết này: Nếu ngôi nhà có diện tích sàn lớn hơn khu vực trung bình cho một loại nhà tương đương, thì nó có nhiều khả năng được định giá ở đầu thị trường.
Để tính toán tính năng này, chúng tôi sẽ cần tạo một cột mới, với mỗi hàng, chứa giá nhà trung bình cho loại nhà hàng hiện tại. Sau đó, chúng tôi có thể tính toán sự khác biệt giữa khu vực nhà và trung bình nhóm của nó để sử dụng làm tính năng trong mô hình của chúng tôi.
Tính năng mới này sẽ yêu cầu một hàm cửa sổ sẽ tính toán và trả về giá trị cho mỗi hàng trong bộ dữ liệu với giá nhà trung bình của nhóm đó.
Tài liệu cơ sở dữ liệu Postgres có một hướng dẫn tuyệt vời về các chức năng cửa sổ.
Đây là một bản tóm tắt nhanh chóng.
Để tạo thành hàm cửa sổ trong SQL, bạn cần ba phần:
- Hàm tổng hợp hoặc tính toán để áp dụng cho cột đích (ví dụ:
import datetime
import random
import ffn
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
1, import datetime
import random
import ffn
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
2) - Từ khóa
import datetime
import random
import ffn
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
3 để bắt đầu chức năng cửa sổ - Từ khóa
import datetime
import random
import ffn
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
4 xác định (các) phân vùng dữ liệu để áp dụng hàm tổng hợp - (Tùy chọn) Từ khóa
import datetime
import random
import ffn
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
5 để xác định phân loại cần thiết trong mỗi phân vùng dữ liệu. Ví dụ: nếu thứ tự của các hàng ảnh hưởng đến giá trị của phép tính
Chức năng cửa sổ trong gấu trúc
.groupby là cơ sở của các chức năng cửa sổ trong gấu trúc
Tôi nghĩ rằng sự nhầm lẫn của tôi khi cố gắng dịch các chức năng cửa sổ SQL sang gấu trúc bắt nguồn từ thực tế là bạn không sử dụng rõ ràng từ khóa
import datetime
import random
import ffn
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
6 cho các chức năng cửa sổ trong SQL. Trong khi đó, trong gấu trúc, cơ sở của các hàm cửa sổ là hàm .groupby.import datetime
import random
import ffn
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
7 trong gấu trúc tương tự như từ khóa import datetime
import random
import ffn
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
4 trong SQL. Điều khoản nhóm trong Pandas xác định phân vùng (nhóm) trong dữ liệu mà hàm tổng hợp nên được áp dụng.Ngoài việc chỉ định các phân vùng dữ liệu bằng cách sử dụng
import datetime
import random
import ffn
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
7, chúng ta cần xác định tổng hợp hoặc tính toán nào để áp dụng cho các phân vùng dữ liệu. Điều này có thể đạt được bằng cách sử dụng hàm .transform.Hàm
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
0 có hàm (nghĩa là hàm tính toán số lượng mong muốn) làm đối số và trả về một khung dữ liệu có cùng độ dài với bản gốc.Hàm được cung cấp cho
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
0 có thể là một chuỗi (đối với các chức năng tổng hợp đơn giản như ‘sum,‘ nghĩa là, ‘đếm) hoặc hàm có thể gọi được (tức là hàm lambda) cho các hoạt động phức tạp hơn.Nếu chức năng bạn áp dụng cho dữ liệu của mình không phải là hàm tổng hợp, tức là nó tự nhiên trả về một giá trị (hàng) cho mỗi hàng trong khung dữ liệu, thay vì một hàng, bạn không cần sử dụng từ khóa
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
0.Ví dụ: nếu bạn muốn tạo một cột mới với các giá trị trong mỗi nhóm được thay đổi bởi một (nghĩa là trong một thời gian, giá trị của ngày trước), bạn có thể bỏ qua hàm
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
0 và chỉ cần sử dụng chức năng pandas tích hợp thay thế - trong trường hợp này Hàm tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
4. Điều này là do việc chuyển dữ liệu tự nhiên trả về một giá trị cho mỗi hàng, thay vì một giá trị tổng hợp duy nhất cho nhóm.Ví dụ
Cách tốt nhất để giải thích sự khác biệt là bằng cách chứng minh với một số ví dụ.
Đối với các chức năng cửa sổ này, bản demo, chúng tôi sẽ sử dụng bộ dữ liệu về giá cổ phiếu cho các công ty khác nhau. Mã dưới đây cho thấy một số thiết lập đơn giản để thu thập dữ liệu này.
Có một cuốn sổ tay đi kèm cho bài đăng trên blog này có sẵn trong REPO Kỹ thuật cho Khoa học Dữ liệu nếu bạn muốn tự mình thử các ví dụ.
Thành lập
Cài đặt các yêu cầu nếu cần thiết
# install required libraries if necessary
pip install matplotlib pandas ffn
Nhập thư viện
import datetime
import random
import ffn
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
Thu thập dữ liệu
Chúng tôi sẽ sử dụng một trong những thư viện yêu thích của tôi để phân tích tài chính - thư viện FFN - để thu thập dữ liệu trong một dòng mã.
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
Lưu vào cơ sở dữ liệu SQLite
Để chứng minh và so sánh cú pháp SQL với Pandas, chúng tôi sẽ lưu dữ liệu này trong cơ sở dữ liệu SQLite trong bộ nhớ đơn giản. Điều này cho phép chúng tôi sử dụng cú pháp trực tiếp SQL để đọc và chuyển đổi dữ liệu.
import sqlite3
# create connection to in memory sqlite db
with sqlite3.connect(":memory:") as conn:
# save prices dataframe to sqlite db
prices.to_sql(name="prices", con=conn, index=False)
Hãy cùng lấy một số ví dụ bằng cách sử dụng bộ dữ liệu giá cổ phiếu để so sánh sự khác biệt giữa các hàm cửa sổ trong SQL và tương đương trong gấu trúc.
Ví dụ 1: Tính giá cổ phiếu tối đa cho mỗi công ty trong khoảng thời gian
SQL
Chúng tôi tính toán giá cổ phiếu tối đa cho mỗi đánh dấu bằng cách sử dụng hàm
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
5 kết hợp với hàm cửa sổ:- Hàm cửa sổ được bắt đầu với từ khóa
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
6 - Chúng tôi chỉ định rằng cột
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
7 nên được sử dụng để phân vùng dữ liệu
Điều này sẽ trả về một bảng có cùng độ dài với bản gốc, nhưng với một cột mới có tên
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
8 chứa giá cổ phiếu tối đa của công ty có liên quan trong khoảng thời gian, dữ liệu bao gồm.ex1_sql_query = """
SELECT
date(Date) as Date
, ticker
, closing_price
, MAX(closing_price) OVER(PARTITION BY ticker) as max_price
FROM
prices
"""
# use pandas read_sql to execute the query and return a dataframe
ex1_sql = pd.read_sql(ex1_sql_query, con=conn)
ex1_sql
Gấu trúc
Chúng tôi sử dụng chức năng GroupBy để phân vùng dữ liệu của Ticker và cung cấp
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
9 cho hàm import sqlite3
# create connection to in memory sqlite db
with sqlite3.connect(":memory:") as conn:
# save prices dataframe to sqlite db
prices.to_sql(name="prices", con=conn, index=False)
0 để có được một cột mới cho thấy giá cổ phiếu tối đa cho người đánh dấu đó.Lưu ý rằng
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
9 là một hàm tập hợp đơn giản, chúng ta chỉ có thể chuyển nó dưới dạng chuỗi cho hàm import sqlite3
# create connection to in memory sqlite db
with sqlite3.connect(":memory:") as conn:
# save prices dataframe to sqlite db
prices.to_sql(name="prices", con=conn, index=False)
0 thay vì cung cấp một hàm mới (ví dụ: hàm Lambda).# copy dataframe to avoid overwritting original (optional)
ex1_pandas = prices.copy()
# add new column
ex1_pandas["max_price"] = ex1_pandas.groupby("ticker")["closing_price"].transform("max")
ex1_pandas
Ví dụ 2: 28 ngày đóng cửa trung bình di chuyển cho mỗi công ty
SQL
Chúng tôi tính toán giá cổ phiếu tối đa cho mỗi đánh dấu bằng cách sử dụng hàm
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
5 kết hợp với hàm cửa sổ:Hàm cửa sổ được bắt đầu với từ khóa
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
6ex2_sql_query = """
SELECT
date(Date) AS Date
, ticker
, closing_price
, AVG(closing_price) OVER(
PARTITION BY ticker
ORDER BY date(Date)
ROWS BETWEEN 27 PRECEDING AND CURRENT ROW
)
AS ma_28_day
FROM
prices
"""
ex2_sql = pd.read_sql(ex2_sql_query, con=conn)
ex2_sql
Gấu trúc
Chúng tôi sử dụng chức năng GroupBy để phân vùng dữ liệu của Ticker và cung cấp
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
9 cho hàm import sqlite3
# create connection to in memory sqlite db
with sqlite3.connect(":memory:") as conn:
# save prices dataframe to sqlite db
prices.to_sql(name="prices", con=conn, index=False)
0 để có được một cột mới cho thấy giá cổ phiếu tối đa cho người đánh dấu đó.Lưu ý rằng
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
9 là một hàm tập hợp đơn giản, chúng ta chỉ có thể chuyển nó dưới dạng chuỗi cho hàm import sqlite3
# create connection to in memory sqlite db
with sqlite3.connect(":memory:") as conn:
# save prices dataframe to sqlite db
prices.to_sql(name="prices", con=conn, index=False)
0 thay vì cung cấp một hàm mới (ví dụ: hàm Lambda).
# install required libraries if necessary
pip install matplotlib pandas ffn
0Ví dụ 2: 28 ngày đóng cửa trung bình di chuyển cho mỗi công tySQL
# install required libraries if necessary
pip install matplotlib pandas ffn
1# install required libraries if necessary
pip install matplotlib pandas ffn
2Gấu trúc
Chúng tôi sử dụng chức năng GroupBy để phân vùng dữ liệu của Ticker và cung cấp
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
9 cho hàm import sqlite3
# create connection to in memory sqlite db
with sqlite3.connect(":memory:") as conn:
# save prices dataframe to sqlite db
prices.to_sql(name="prices", con=conn, index=False)
0 để có được một cột mới cho thấy giá cổ phiếu tối đa cho người đánh dấu đó.# install required libraries if necessary
pip install matplotlib pandas ffn
3SQL
Chúng tôi tính toán giá cổ phiếu tối đa cho mỗi đánh dấu bằng cách sử dụng hàm
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
5 kết hợp với hàm cửa sổ:# install required libraries if necessary
pip install matplotlib pandas ffn
4# install required libraries if necessary
pip install matplotlib pandas ffn
5Gấu trúc
Chúng tôi sử dụng chức năng GroupBy để phân vùng dữ liệu của Ticker và cung cấp
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
9 cho hàm import sqlite3
# create connection to in memory sqlite db
with sqlite3.connect(":memory:") as conn:
# save prices dataframe to sqlite db
prices.to_sql(name="prices", con=conn, index=False)
0 để có được một cột mới cho thấy giá cổ phiếu tối đa cho người đánh dấu đó.# install required libraries if necessary
pip install matplotlib pandas ffn
6Gấu trúc
Chúng tôi sử dụng chức năng GroupBy để phân vùng dữ liệu của Ticker và cung cấp
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
9 cho hàm import sqlite3
# create connection to in memory sqlite db
with sqlite3.connect(":memory:") as conn:
# save prices dataframe to sqlite db
prices.to_sql(name="prices", con=conn, index=False)
0 để có được một cột mới cho thấy giá cổ phiếu tối đa cho người đánh dấu đó.Lưu ý rằng
tickers = [
"AAPL", # apple
"DIS", # disney
"NKE", # nike
"TSLA", # tesla
]
# get stock price data
prices = ffn.get(tickers, start="2018-01-01")
# convert data into 'long' table format for purposes of this exercise
prices = prices.melt(ignore_index=False, var_name="ticker", value_name="closing_price")
# reset index to make 'Date' a column
prices = prices.reset_index()
# display 5 example rows in the dataset
prices.sample(5).sort_index()
9 là một hàm tập hợp đơn giản, chúng ta chỉ có thể chuyển nó dưới dạng chuỗi cho hàm import sqlite3
# create connection to in memory sqlite db
with sqlite3.connect(":memory:") as conn:
# save prices dataframe to sqlite db
prices.to_sql(name="prices", con=conn, index=False)
0 thay vì cung cấp một hàm mới (ví dụ: hàm Lambda).Ví dụ 2: 28 ngày đóng cửa trung bình di chuyển cho mỗi công ty
# install required libraries if necessary
pip install matplotlib pandas ffn
7# install required libraries if necessary
pip install matplotlib pandas ffn
8# install required libraries if necessary
pip install matplotlib pandas ffn
9import datetime
import random
import ffn
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
0Khi tính trung bình di chuyển, thứ tự các giá trị trong nhóm rất quan trọng (chúng nên theo thứ tự thời gian), do đó chúng ta cần đặt hàng các giá trị trong nhóm vào ngày.
Ngoài ra, trong SQL, để xác định cửa sổ cuộn, chúng tôi chỉ định rằng trung bình nên được tính bằng cách sử dụng 27 hàng trước và hàng hiện tại (tổng cộng 28).
Để đạt được điều tương tự trong gấu trúc, chúng ta có thể tạo một cột mới trong DataFrame (‘MA_28_Day,) bằng cách sử dụng
import sqlite3
# create connection to in memory sqlite db
with sqlite3.connect(":memory:") as conn:
# save prices dataframe to sqlite db
prices.to_sql(name="prices", con=conn, index=False)
3 và import sqlite3
# create connection to in memory sqlite db
with sqlite3.connect(":memory:") as conn:
# save prices dataframe to sqlite db
prices.to_sql(name="prices", con=conn, index=False)
0. Chúng tôi sử dụng cú pháp Python sườn Lambda để xác định chức năng nào nên được áp dụng cho mỗi nhóm. Trong trường hợp này, chúng tôi muốn sử dụng tính toán trung bình (trung bình) trên cửa sổ cuộn 28 hàng.Hãy nhớ sắp xếp khung dữ liệu gấu trúc trước khi áp dụng chức năng cửa sổ khi sử dụng các tính toán nhạy cảm với thứ tự của các hàng
Trung bình di động 28 ngày cho Tesla vào năm 2021
Trong ví dụ này, chúng tôi không cần sử dụng hàm
import sqlite3
# create connection to in memory sqlite db
with sqlite3.connect(":memory:") as conn:
# save prices dataframe to sqlite db
prices.to_sql(name="prices", con=conn, index=False)
0 vì import sqlite3
# create connection to in memory sqlite db
with sqlite3.connect(":memory:") as conn:
# save prices dataframe to sqlite db
prices.to_sql(name="prices", con=conn, index=False)
6 tự nhiên trả về giá trị cho mỗi hàng trong dữ liệu, thay vì tập hợp.
Ví dụ 4: Tỷ lệ phần trăm hàng ngày
- Để tính toán lợi nhuận hàng ngày, chúng tôi cần tính toán mức đóng trước đó trong một truy vấn con (hoặc CTE) và sau đó sử dụng giá trị đó để tính toán mức tăng thay đổi phần trăm hoặc lợi nhuận hàng ngày.
- Ở đây chúng ta có thể sử dụng cú pháp chức năng Lambda để áp dụng tính toán phức tạp hơn cho mỗi nhóm.
- Ví dụ 5: Thiếu nội suy dữ liệu
- Cuối cùng, ví dụ này, chúng tôi sẽ chỉ sử dụng gấu trúc để chứng minh cách sử dụng các chức năng loại cửa sổ để nội suy dữ liệu bị thiếu.
- Trước tiên, chúng tôi ngẫu nhiên xóa một số dữ liệu để mô phỏng dữ liệu bị thiếu trong bộ dữ liệu trong thế giới thực.
- Sau đó, chúng ta có thể sử dụng các chức năng nội suy hoặc cắt bỏ để điền vào các khoảng trống trong mỗi nhóm với một số lượng có ý nghĩa nhất cho tình huống. Đối với trường hợp sử dụng của chúng tôi, chúng tôi sẽ sử dụng phương thức ‘Forward Fill, để áp đặt giá trị của giá đóng trước đó nếu dữ liệu bị thiếu.
Phân vùng bởi: Điều này chia các hàng hoặc kết quả truy vấn được đặt thành các phân vùng nhỏ.Đặt hàng bởi: Điều này sắp xếp các hàng theo thứ tự tăng dần hoặc giảm dần cho cửa sổ phân vùng.Thứ tự mặc định là tăng dần.Hàng hoặc phạm vi: Bạn có thể giới hạn thêm các hàng trong một phân vùng bằng cách chỉ định các điểm bắt đầu và điểm cuối.divides the rows or query result set into small partitions. Order By: This arranges the rows in ascending or descending order for the partition window. The default order is ascending. Row or Range: You can further limit the rows in a partition by specifying the start and endpoints.
Sắp xếp các giá trị theo thứ tự giảm dần với GroupBy, bạn có thể sắp xếp các giá trị theo thứ tự giảm dần bằng cách sử dụng phương thức ascending = false param sang sort_values ().Hàm đầu () được sử dụng để có được n hàng đầu tiên.Nó rất hữu ích cho việc kiểm tra nhanh chóng nếu đối tượng của bạn có đúng loại dữ liệu trong đó.using ascending=False param to sort_values() method. The head() function is used to get the first n rows. It is useful for quickly testing if your object has the right type of data in it.