03-Pandas詳解

来源:https://www.cnblogs.com/culin/archive/2023/02/08/17102351.html
-Advertisement-
Play Games

Pandas Pandas的主要功能 具備對其功能的數據結構DataFrame、Series 集成時間序列功能 提供豐富的數學運算和操作 靈活處理缺失數據 Series **Series介紹:**Series是一種類似於一維數組的對象,由一組數據和一組與之相關的數據標簽(索引)組成,比較像列表和字典 ...


Pandas

Pandas的主要功能

  • 具備對其功能的數據結構DataFrame、Series
  • 集成時間序列功能
  • 提供豐富的數學運算和操作
  • 靈活處理缺失數據

Series

Series介紹:Series是一種類似於一維數組的對象,由一組數據和一組與之相關的數據標簽(索引)組成,比較像列表和字典的結合體
Series創建方式:

# 普通創建
pd.Series([1,2,3,4])
# 帶索引創建
pd.Series([1,2,3,4],index=['a','b','c','d']) #但是我們依舊可以通過[0]來訪問到數據,有兩種訪問方法,並沒有被真正覆蓋掉
# 使用字典創建
pd.Series({'a':1,'b':2})

Series使用特性

Series支持array特性 Series支持字典特性
從ndarray創建Series:Series(arr) 從字典創建Series,Series(dic)
與標量運算sr*2 in運算:'a' in str
兩個Series運算:sr1+sr2 鍵索引:s['a']、s[['a'、'b']]
索引:sr[0],s[[1,2,4]]
切片:sr[0:2]
通用函數:np.abs(sr)
布爾值過濾:sr[sr>0]

01-常用函數

# 獲取索引值
sr.index
# 獲取值
sr.values
# 根據標簽花式索引
sr[['a','b']]
# 根據標簽切片
sr['a','b']

Sr整數索引問題
在對Series進行切片處理時,可能會出現整數訪問的問題

import pandas as pd
import numpy as np
sr = pd.Series(np.arange(20))
sr2 = sr[10:].copy()
sr2[10] # 可以正常訪問
sr2[0] # 無法正常訪問
# 如何解決整數索引的問題
# 通過標簽選擇 [[1,13,14],[10,11,12]]
sr2.loc[10] #結果為1
# 通過下標選擇
src.iloc[10] #選擇失敗,下標越界
src.iloc[0] #結果為1

02-數據對齊

在Series中,是按照索引對齊的,兩個Series對象是按照索引對齊然後計算的。

sr1 = pd.Series([11,12,13],['a','c','d'])
sr2 = pd.Series([14,15,21],['c','a','d'])
sr1 + sr2
# 如果一個索引有,另外一個索引沒有,那麼就會出現NaN的結果
# 缺失值處理
sr1.add(sr2,fill_value=0)

運行結果如下

a    26
c    26
d    34
dtype: int64


DataFrame

DataFrame:DataFrame是一個表格型數據結構,含有一組有序的列.DataFrame可以被看作是Series組成的字典,並且共用一個索引。
創建DataFrame:
先創建一個基礎的DataFrame

test1 = pd.DataFrame({'one':[1,2,3],'two':[4,5,6]},index=['a','b','c'])
test1
# 或者也可以用以下格式,體現Pandas將字典轉化為dataframe
import pandas as pd
data = {"name":["yahoo","google","facebook"],"marks":[200,400,800],"price":[9,3,7]}
dataframe1 = pd.DataFrame(data,index=['one','two','three'])
dataframe1

創建出的DataFrame對象如下
image.png
以及如下:image.png
再通過Series創建一個DataFrame

test2 = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['a','b','c','d'])})

創建出的DataFrame對象如下
image.png
DataFrame讀取CSV文件

# 讀取csv文件
df = pd.read_csv('test.csv')
# 保存csv文件
df.to_csv("文件名.csv")

01-常用屬性

DataFrame常用屬性

屬性值 屬性作用
index 獲取索引
T 轉置
columns 獲取列索引
values 獲取值索引
describe() 獲取快速統計

02-索引與切片

# 根據索引名索引
df['列']['行'] #註意順序不能反了
# 通過標簽形式訪問
df.loc['行','列']
# 通過標簽方式訪問某幾行
df.loc[['a','c'],:]

03-數據對齊

DataFrame行列在進行數據對齊的時候,其行索引和列索引分別對齊

04-缺失值處理

DataFrame在處理缺失值的時候與Series有相像的地方,但是在使用dropna()時候,會刪除這一行。
所以我們需要一個函數,當這一行全為NaN時候,我們再刪除它

# 當一行全為缺失值時,進行刪除
test2.dropna(how='all')
# 當一行只要有一個缺失值時,刪除
test2.dropna(how='any')
# 當一列只要有一個缺失值是,刪除
test2.dropna(axis=1,how='any') #預設axis=0,按行刪除,修改axis=1,按列刪除

05-常用函數

# 對列(行)求平均值 mean(axis=0,skipna=False)
df.mean() #預設按照列求缺失數據
df.mean(axis=1) #按照行求缺失數據
# 對列(行)求和
df.sum()  #預設按照列求缺失數據
df.sum(axis=1) #按照行求缺失數據
# 對列(行)索引排序,有NAN的部分不參與排序,放到最後
df.sort_values(by='列名') #按照某列升序排列
df.sort_values(by='列名',ascending=False) #按照某列降序排列
df.sort_values(by='行名',axis=1) #按照某行升序排列
df.sort_values(by='行名',axis=1,ascending=False) #按照某行降序排列
# 按某一列(行)索引排序
df.sort_index() #按照行索引升序排序
df.sort_index(ascending=False) #按照列索引降序排序

時間序列

01-時間對象

  • Python標準庫處理時間對象:datetime
  • 靈活處理時間對象:dateutil
  • 成組處理時間對象:pandas:pd.to_datetime()

時間對象轉換代碼

# 初步的時間對象轉換
import datetime
datetime.datetime.strptime('2023-02-06','%Y-%m-%d')
# 忽略格式,自動轉換
dateutil.parser.parse('2020-02-01')
dateutil.parser.parse('2020-JAN-01')
dateutil.parser.parse('03/04/2023')
# pands轉換方式
pd.to_datetime(['2001-01-02','2020-Feb-03'])
# 輸出結果如下
pd.to_datetime(['2001-01-02','2020-Feb-03'])

02-生成時間範圍

# 預設生成一段時間的時間序列
pd.date_range('2010-01-01','2010-05-01')
# 選擇起始節點,按天數生成
pd.date_range('2010-01-01',periods=60)
# 選擇起始節點,按小時數生成
pd.date_range('2023-02-01',periods=60,freq='H')
# 選擇起始節點,輸出工作日
pd.date_range('2023-02-01',periods=60,freq='B') #生成的是時間戳
# 時間範圍轉化為字元串
tm[0].to_pydatetime()

03-時間序列

時間序列:以時間對象為索引的Series或DataFrame,datatime對象作為索引時是存儲在DatetimeIndex對象中的
時間序列的特殊功能:

  • 傳入年或年月作為切片方式
  • 傳入日期範圍作為切片方式
  • 豐富的函數支持:resample()、truncate()
# 以B模式生成時間序列
sr = pd.Series(np.arange(100),index=pd.date_range('2023-01-01',periods=100,freq='B'))
sr
# 取時間序列中的值  返回結果為99
sr['2023-04-10']
# 取時間序列之後的值
sr['2023-01-01':]
# 取時間序列一段範圍的值
# 返回結果為99

根據時間戳求每周的和

sr.resample('W').sum()

求和結果如下:image.png
根據時間戳求每月的和

sr.resample('M	').sum()

image.png

文件操作

01-CSV文件讀取

Pandas文件讀取主要參數

參數名 參數作用
sep 指定分隔符, 可用正則表達式比如's+'
header=None 指定文件無列名
name 指定列名
index_col 指定某列作為索引
skip_row 指定跳過某些行
na_values 指定某些字元串表示缺失值
parse_dates 指定某些列是否被解析為日期,類型為布爾值或者里欸包
# 讀取csv文件,將時間列作為索引(註意此時為字元串)
pd.read_csv('test.csv',index_col='date')
# 將時間字元串轉為時間序列
pd.read_csv('test.csv',index_col='date',parse_dates=True) #將能表示為時間序列的數據表示為時間序列
# 指定某列為時間序列
pd.read_csv('test.csv',index_col='date',parse_dates='date')
# 當沒有列名,全是數據的時候,可以自動生成header,預設0,1,2...
pd.read_csv('test.csv',header=None)
# 當沒有列名,全是數據的時候,可以使用列表賦值header
pd.read_csv('test.csv',header=None,names=['abcdefg']

02-CSV文件保存

Pandas文件保存主要參數

參數名 參數作用
sep 指定文件分隔符
na_rep 指定缺失值轉換的字元串,預設空字元串
header=False 不輸出列名的一行
index=False 不輸出索引的一行
cols 輸出指定的列

實戰操作

01-讀取股票數據

get_price():可以得到股票數據,語法格式如下:

get_price(security,start_date=None,end_date=None,frequency='daily',fields=None,skip_paused=False,fq='pre',count=None)

get_price()函數可以按天或者按分鐘讀取數據,各項參數含義如下:

  • security:一隻股票代碼或一隻股票代碼的list
  • start_date:開始時間,與參數count二選一,不可同時使用。需要註意的是,如果參數count和start_date都沒有設置,則start_date生效值為:'2015-01-01'
  • end_date:結束時間,預設值是'2015-12-31',
  • frequency:單位時間長度,幾天或幾分鐘,預設為daily.也可以是minute、Xd、Xm.X表示幾的意思
  • fileds:字元串list,選擇要獲取行情的數據,預設為None。參數Fields支持SecurityUnitDate中所有的數據 ,包含
    • open close low high volume money factor high_limit low_limit avg pre_close paused
  • skip_pasued:是否跳過不交易日期
  • fq:復權選項。參數值設為pre,表示前復權,為預設設置。參數權設為None,表示不復權,返回實際價格,參數值設為post,表示後復權

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如何創建有層次的C++工程目錄 大多數人創建C++工程採用預設設置,這樣會導致工程內文件散亂,毫無可觀性。那麼如何去創建一個可觀性搶的工程目錄呢?以下將為大家解惑。 1、快速創建預設工程並簡單處理 a、新手因不理解具體的項目工程有哪些文件目錄,所以我建議直接創建一個預設的項目,然後關閉當前目錄創建這 ...
  • 一、應用介紹 ”所有網頁都是客戶端“為fusion app的核心概念,讓我們利用它可以快速的做出屬於自己的應用。由於作者已經停止更新原版app,文章採用FA 重製版完成。 成品展示: 體驗下載: 下載鏈接:https://wwp.lanzoup.com/iIKXF0mxu1gd 提取碼 : xcvb ...
  • 《Terraform 101 從入門到實踐》這本小冊在南瓜慢說官方網站和GitHub兩個地方同步更新,書中的示例代碼也是放在GitHub上,方便大家參考查看。 Terraform 101 從入門到實踐 Terraform作為基礎設施即代碼(Infrastructure as Code,很簡稱IaC) ...
  • 1.介紹 selenium最初是一個自動化測試工具,而爬蟲中使用它主要是為瞭解決requests無法直接執行JavaScript代碼的問題 selenium本質是通過驅動瀏覽器,完全模擬瀏覽器的操作,比如跳轉、輸入、點擊、下拉等,來拿到網頁渲染之後的結果,可支持多種瀏覽器 from selenium ...
  • 條件判斷if 簡單的if判斷 package main import "fmt" func main(){ age := 18 if age >=18 { fmt.Println("呦呵長大了") }else { fmt.Println("還沒長大") } } 多分支if package main ...
  • 春節電影聽巳月說都還可以,我不信,我覺得還是要看看看過的觀眾怎麼說,於是我點開了流浪地球2 … 看起來好像不錯的樣子,8.2的評分,三十多億的票房 就是這評價也太多了,那我們今天就把網友對它的評論獲取下來,做成可視化詞雲圖看看大家討論最多的是什麼。 準備工作 使用的環境 Python 3.8 解釋器 ...
  • 這篇文章主要討論分散式共識,包括什麼是分散式共識以及常用的三種分散式共識演算法:PoW(工作量證明)、PoS(權益證明)和DPoS(委托權益證明)。 ...
  • JDK 8 是一次重大的版本升級,新增了非常多的特性,其中之一便是 CompletableFuture。自此從 JDK 層面真正意義上的支持了基於事件的非同步編程範式,彌補了 Future 的缺陷。 在我們的日常優化中,最常用手段便是多線程並行執行。這時候就會涉及到 CompletableFutur... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...