python序列分析
1. 利用python進行數據分析筆記:3.1數據結構
元組是一種固定長度、不可變的Python對象序列。創建元組最簡單的辦法是用逗號分隔序列值:
tuple 函數將任意序列或迭代器轉換為元組:
中括弧 [] 可以獲取元組的元素, Python中序列索引從0開始 :
元組一旦創建,各個位置上的對象是無法被修改的,如果元組的一個對象是可變的,例如列表,你可以在它內部進行修改:
可以使用 + 號連接元組來生成更長的元組:
元組乘以整數,則會和列表一樣,生成含有多份拷貝的元組:
將元組型的表達式賦值給變數,Python會對等號右邊的值進行拆包:
拆包的一個常用場景就是遍歷元組或列表組成的序列:
*rest 用於在函數調用時獲取任意長度的位置參數列表:
count 用於計量某個數值在元組中出現的次數:
列表的長度可變,內容可以修改。可以使用 [] 或者 list 類型函數來定義列表:
append 方法將元素添加到列表尾部:
insert 方法可以將元素插入到指定列表位置:
( 插入位置范圍在0到列表長度之間 )
pop 是 insert 的反操作,將特定位置的元素移除並返回:
remove 方法會定位第一個符合要求的值並移除它:
in 關鍵字可以檢查一個值是否在列表中;
not in 表示不在:
+ 號可以連接兩個列表:
extend 方法可以向該列表添加多個元素:
使用 extend 將元素添加到已經存在的列表是更好的方式,比 + 快。
sort 方法可以對列表進行排序:
key 可以傳遞一個用於生成排序值的函數,例如通過字元串的長度進行排序:
bisect.bisect 找到元素應當被插入的位置,返回位置信息
bisect.insort 將元素插入到已排序列表的相應位置保持序列排序
bisect 模塊的函數並不會檢查列表是否已經排序,因此對未排序列表使用bisect不會報錯,但是可能導致不正確結果
切片符號可以對大多數序列類型選取子集,基本形式是 [start:stop]
起始位置start索引包含,結束位置stop索引不包含
切片還可以將序列賦值給變數:
start和stop可以省略,默認傳入起始位置或結束位置,負索引可以從序列尾部進行索引:
步進值 step 可以在第二個冒號後面使用, 意思是每隔多少個數取一個值:
對列表或元組進行翻轉時,一種很聰明的用法時向步進值傳值-1:
dict(字典)可能是Python內建數據結構中最重要的,它更為常用的名字是 哈希表 或者 關聯數組 。
字典是鍵值對集合,其中鍵和值都是Python對象。
{} 是創建字典的一種方式,字典中用逗號將鍵值對分隔:
你可以訪問、插入或設置字典中的元素,:
in 檢查字典是否含有一個鍵:
del 或 pop 方法刪除值, pop 方法會在刪除的同時返回被刪的值,並刪除鍵:
update 方法將兩個字典合並:
update方法改變了字典元素位置,對於字典中已經存在的鍵,如果傳給update方法的數據也含有相同的鍵,則它的值將會被覆蓋。
字典的值可以是任何Python對象,但鍵必須是不可變的對象,比如標量類型(整數、浮點數、字元串)或元組(且元組內對象也必須是不可變對象)。
通過 hash 函數可以檢查一個對象是否可以哈希化(即是否可以用作字典的鍵):
集合是一種無序且元素唯一的容器。
set 函數或者是用字面值集與大括弧,創建集合:
union 方法或 | 二元操作符獲得兩個集合的聯合即兩個集合中不同元素的並集:
intersection 方法或 & 操作符獲得交集即兩個集合中同時包含的元素:
常用的集合方法列表:
和字典類似,集合的元素必須是不可變的。如果想要包含列表型的元素,必須先轉換為元組:
2. 利用Python進行數據分析(9)-重采樣resample和頻率轉換
Python-for-data-重新采樣和頻率轉換
重新采樣指的是將時尺耐間序列從一個頻率轉換到另一個頻率的過程。
但是也並不是所有的采樣方式都是屬於上面的兩種
pandas中使用resample方法來實現頻率轉換,下面是resample方法的參數詳解:
將數據聚合到一個規則的低頻上,例如將時間轉換為每個月,"M"或者"BM",將數據分成一個月的時間間隔。
每個間隔是半閉合的,一個數據只能屬於一個時間間隔。時間間隔的並集必須是整個時間幀
默認情況下,左箱體邊界是包含的。00:00的值是00:00到00:05間隔內的值
產生的時間序列按照每個箱體左邊的時間戳被標記。
傳遞<span class="mark">label="right"</span>可以使用右箱體邊界標記時間序列
向loffset參數傳遞字元串或者日期偏置
在金融數據中,為每個數據桶計算4個值是常見知困物的問題:
通過<span class="girk">ohlc聚合函數</span>能夠得到四種聚合值列的DF數據
低頻搭液轉到高頻的時候會形成缺失值
ffill() :使用前面的值填充, limit 限制填充的次數
3. python中時間序列數據的一些處理方式
datetime.timedelta對象代表兩個時間之間的時間差,兩個date或datetime對象相減就可以返回一個timedelta對象。
利用以下數據進行說明:
如果我們發現時間相關內容的變數為int,float,str等類型,不方便後面的分析,就需要使用該函數轉化為常用的時間變數格式:pandas.to_datetime
轉換得到的時間單位如下:
如果時間序列格式不統一,pd.to_datetime()的處理方式:
當然,正確的轉換是這樣的:
第一步:to_datetime()
第二步:astype(datetime64[D]),astype(datetime64[M])
本例中:
order_dt_diff必須是Timedelta(Ɔ days 00:00:00')格式,可能是序列使用了diff()
或者pct_change()。
前者往往要通過'/np.timedelta'去掉單位days。後者其實沒有單位。
假如我們要統計某共享單車一天內不同時間點的用戶使用數據,例如
還有其他維度的提取,年、月、日、周,參見:
Datetime properties
注意 :.dt的對象必須為pandas.Series,而不可以是Series中的單個元素
4. arima模型python 怎麼看平穩性
時間序列分析(一) 如何判斷序列是否平穩
序列平穩不平穩,一般採用兩種方法:
第一種:看圖法
圖是指時序圖,例如(eviews畫滴):
分析:什麼樣的圖不平穩,先說下什麼是平穩,平穩就是圍繞著一個常數上下波動。
看看上面這個圖,很明顯的增長趨勢,不平穩。
第二種:自相關系數和偏相關系數
還以上面的序列為例:用eviews得到自相關和偏相關圖,Q統計量和伴隨概率。
分析:判斷平穩與否的話,用自相關圖和偏相關圖就可以了。
平穩的序列的自相關圖和偏相關圖不是拖尾就是截尾。截尾就是在某階之後,系數都為 0 ,怎麼理解呢,看上面偏相關的圖,當階數為 1 的時候,系數值還是很大, 0.914. 二階長的時候突然就變成了 0.050. 後面的值都很小,認為是趨於 0 ,這種狀況就是截尾。再就是拖尾,拖尾就是有一個衰減的趨勢,但是不都為 0 。
自相關圖既不是拖尾也不是截尾。以上的圖的自相關是一個三角對稱的形式,這種趨勢是單調趨勢的典型圖形。
下面是通過自相關的其他功能
如果自相關是拖尾,偏相關截尾,則用 AR 演算法
如果自相關截尾,偏相關拖尾,則用 MA 演算法
如果自相關和偏相關都是拖尾,則用 ARMA 演算法, ARIMA 是 ARMA 演算法的擴展版,用法類似 。
不平穩,怎麼辦?
答案是差分
還是上面那個序列,兩種方法都證明他是不靠譜的,不平穩的。確定不平穩後,依次進行1階、2階、3階...差分,直到平穩位置。先來個一階差分,上圖。
從圖上看,一階差分的效果不錯,看著是平穩的。
5. 如何用python做輿情時間序列可視化
如何批量處理評論信息情感分析,並且在時間軸上可視化呈現?輿情分析並不難,讓我們用Python來實現它吧。
痛點
你是一家連鎖火鍋店的區域經理,很注重顧客對餐廳的評價。從前,你苦惱的是顧客不愛寫評價。最近因為餐廳火了,分店越來越多,寫評論的顧客也多了起來,於是你新的痛苦來了——評論太多了,讀不過來。
從我這兒,你了解到了情感分析這個好用的自動化工具,一下子覺得見到了曙光。
你從某知名點評網站上,找到了自己一家分店的頁面,讓助手把上面的評論和發布時間數據弄下來。因為助手不會用爬蟲,所以只能把評論從網頁上一條條復制粘貼到Excel里。下班的時候,才弄下來27條。(注意這里我們使用的是真實評論數據。為了避免對被評論商家造成困擾,統一將該餐廳的名稱替換為「A餐廳」。特此說明。)
好在你只是想做個試驗而已,將就了吧。你用我之前介紹的中文信息情感分析工具,依次得出了每一條評論的情感數值。剛開始做出結果的時候,你很興奮,覺得自己找到了輿情分析的終極利器。
可是美好的時光總是短暫的。很快你就發現,如果每一條評論都分別運行一次程序,用機器來做分析,還真是不如自己挨條去讀省事兒。
怎麼辦呢?
序列
辦法自然是有的。我們可以利用《貸還是不貸:如何用Python和機器學習幫你決策?》一文介紹過的數據框,一次性處理多個數據,提升效率。
但是這還不夠,我們還可以把情感分析的結果在時間序列上可視化出來。這樣你一眼就可以看見趨勢——近一段時間里,大家是對餐廳究竟是更滿意了,還是越來越不滿意呢?
我們人類最擅長處理的,就是圖像。因為漫長的進化史逼迫我們不斷提升對圖像快速准確的處理能力,否則就會被環境淘汰掉。因此才會有「一幅圖勝過千言萬語」的說法。
准備
首先,你需要安裝Anaconda套裝。詳細的流程步驟請參考《 如何用Python做詞雲 》一文。
助手好不容易做好的Excel文件restaurant-comments.xlsx,請從這里下載。
用Excel打開,如果一切正常,請將該文件移動到咱們的工作目錄demo下。
因為本例中我們需要對中文評論作分析,因此使用的軟體包為SnowNLP。情感分析的基本應用方法,請參考《如何用Python做情感分析?》。
到你的系統「終端」(macOS, Linux)或者「命令提示符」(Windows)下,進入我們的工作目錄demo,執行以下命令。
pip install snownlp
pip install ggplot
運行環境配置完畢。
在終端或者命令提示符下鍵入:
jupyter notebook
如果Jupyter Notebook正確運行,下面我們就可以開始編寫代碼了。
代碼
我們在Jupyter Notebook中新建一個Python 2筆記本,起名為time-series。
首先我們引入數據框分析工具Pandas,簡寫成pd以方便調用。
import pandas as pd
接著,讀入Excel數據文件:
df = pd.read_excel("restaurant-comments.xlsx")
我們看看讀入內容是否完整:
df.head()
結果如下:
注意這里的時間列。如果你的Excel文件里的時間格式跟此處一樣,包含了日期和時間,那麼Pandas會非常智能地幫你把它識別為時間格式,接著往下做就可以了。
反之,如果你獲取到的時間只精確到日期,例如"2017-04-20"這樣,那麼Pandas只會把它當做字元串,後面的時間序列分析無法使用字元串數據。解決辦法是在這里加入以下兩行代碼:
from dateutil import parser
df["date"] = df.date.apply(parser.parse)
這樣,你就獲得了正確的時間數據了。
確認數據完整無誤後,我們要進行情感分析了。先用第一行的評論內容做個小實驗。
text = df.comments.iloc[0]
然後我們調用SnowNLP情感分析工具。
from snownlp import SnowNLP
s = SnowNLP(text)
顯示一下SnowNLP的分析結果:
s.sentiments
結果為:
0.6331975099099649
情感分析數值可以正確計算。在此基礎上,我們需要定義函數,以便批量處理所有的評論信息。
def get_sentiment_cn(text):
s = SnowNLP(text) return s.sentiments
然後,我們利用Python裡面強大的apply語句,來一次性處理所有評論,並且將生成的情感數值在數據框裡面單獨存為一列,稱為sentiment。
df["sentiment"] = df.comments.apply(get_sentiment_cn)
我們看看情感分析結果:
df.head()
新的列sentiment已經生成。我們之前介紹過,SnowNLP的結果取值范圍在0到1之間,代表了情感分析結果為正面的可能性。通過觀察前幾條數據,我們發現點評網站上,顧客對這家分店評價總體上還是正面的,而且有的評論是非常積極的。
但是少量數據的觀察,可能造成我們結論的偏頗。我們來把所有的情感分析結果數值做一下平均。使用mean()函數即可。
df.sentiment.mean()
結果為:
0.7114015318571119
結果數值超過0.7,整體上顧客對這家店的態度是正面的。
我們再來看看中位數值,使用的函數為median()。
df.sentiment.median()
結果為:
0.9563139038622388
我們發現了有趣的現象——中位數值不僅比平均值高,而且幾乎接近1(完全正面)。
這就意味著,大部分的評價一邊倒表示非常滿意。但是存在著少部分異常點,顯著拉低了平均值。
下面我們用情感的時間序列可視化功能,直觀查看這些異常點出現在什麼時間,以及它們的數值究竟有多低。
我們需要使用ggplot繪圖工具包。這個工具包原本只在R語言中提供,讓其他數據分析工具的用戶羨慕得流口水。幸好,後來它很快被移植到了Python平台。
我們從ggplot中引入繪圖函數,並且讓Jupyter Notebook可以直接顯示圖像。
%pylab inlinefrom ggplot import *
這里可能會報一些警告信息。沒有關系,不理會就是了。
下面我們繪制圖形。這里你可以輸入下面這一行語句。
ggplot(aes(x="date", y="sentiment"), data=df) + geom_point() + geom_line(color = 'blue') + scale_x_date(labels = date_format("%Y-%m-%d"))
你可以看到ggplot的繪圖語法是多麼簡潔和人性化。只需要告訴Python自己打算用哪個數據框,從中選擇哪列作為橫軸,哪列作為縱軸,先畫點,後連線,並且可以指定連線的顏色。然後,你需要讓X軸上的日期以何種格式顯示出來。所有的參數設定跟自然語言很相似,直觀而且易於理解。
執行後,就可以看到結果圖形了。
在圖中,我們發現許多正面評價情感分析數值極端的高。同時,我們也清晰地發現了那幾個數值極低的點。對應評論的情感分析數值接近於0。這幾條評論,被Python判定為基本上沒有正面情感了。
從時間上看,最近一段時間,幾乎每隔幾天就會出現一次比較嚴重的負面評價。
作為經理,你可能如坐針氈。希望盡快了解發生了什麼事兒。你不用在數據框或者Excel文件裡面一條條翻找情感數值最低的評論。Python數據框Pandas為你提供了非常好的排序功能。假設你希望找到所有評論里情感分析數值最低的那條,可以這樣執行:
df.sort(['sentiment'])[:1]
結果為:
情感分析結果數值幾乎就是0啊!不過這里數據框顯示評論信息不完全。我們需要將評論整體列印出來。
print(df.sort(['sentiment']).iloc[0].comments)
評論完整信息如下:
這次是在情人節當天過去的,以前從來沒在情人節正日子出來過,不是因為沒有男朋友,而是感覺哪哪人都多,所以特意錯開,這次實在是饞A餐廳了,所以趕在正日子也出來了,從下午四點多的時候我看排號就排到一百多了,我從家開車過去得堵的話一個小時,我一看提前兩個小時就在網上先排著號了,差不多我們是六點半到的,到那的時候我看號碼前面還有才三十多號,我想著肯定沒問題了,等一會就能吃上的,沒想到悲劇了,就從我們到那坐到等位區開始,大約是十分二十分一叫號,中途多次我都想走了,哈哈,哎,等到最後早上九點才吃上的,服務員感覺也沒以前清閑時周到了,不過這肯定的,一人負責好幾桌,今天節日這么多人,肯定是很累的,所以大多也都是我自己跑腿,沒讓服務員給弄太多,就蝦滑讓服務員下的,然後環境來說感覺衛生方面是不錯,就是有些太吵了,味道還是一如既往的那個味道,不過A餐廳最人性化的就是看我們等了兩個多小時,上來送了我們一張打折卡,而且當次就可以使用,這點感覺還是挺好的,不愧是A餐廳,就是比一般的要人性化,不過這次就是選錯日子了,以後還是得提前預約,要不就別趕節日去,太火爆了!
通過閱讀,你可以發現這位顧客確實有了一次比較糟糕的體驗——等候的時間太長了,以至於使用了「悲劇」一詞;另外還提及服務不夠周到,以及環境吵鬧等因素。正是這些詞彙的出現,使得分析結果數值非常低。
好在顧客很通情達理,而且對該分店的人性化做法給予了正面的評價。
從這個例子,你可以看出,雖然情感分析可以幫你自動化處理很多內容,然而你不能完全依賴它。
自然語言的分析,不僅要看錶達強烈情感的關鍵詞,也需要考慮到表述方式和上下文等諸多因素。這些內容,是現在自然語言處理領域的研究前沿。我們期待著早日應用到科學家們的研究成果,提升情感分析的准確度。
不過,即便目前的情感分析自動化處理不能達到非常准確,卻依然可以幫助你快速定位到那些可能有問題的異常點(anomalies)。從效率上,比人工處理要高出許多。
你讀完這條評論,長出了一口氣。總結了經驗教訓後,你決定將人性化的服務貫徹到底。你又想到,可以收集用戶等候時長數據,用數據分析為等待就餐的顧客提供更為合理的等待時長預期。這樣就可以避免顧客一直等到很晚了。
祝賀你,經理!在數據智能時代,你已經走在了正確的方向上。
下面,你該認真閱讀下一條負面評論了……
討論
除了情感分析和時間序列可視化,你覺得還可以如何挖掘中文評論信息?除了點評網站之外,你還知道哪些輿情分析的數據來源?歡迎留言分享給大家,我們一起交流討論。
如果你對我的文章感興趣,歡迎點贊,並且微信關注和置頂我的公眾號「玉樹芝蘭」(nkwangshuyi)。
如果你身邊有好友正在做輿情分析的研究工作,也歡迎你把這篇文章轉發給他們,共同學習和提高。
6. python 時間序列分析 收斂性問題
Python與R相比速度要快。Python可以直接處理上G的數據;R不行,R分析數據時需要先通過資料庫把大數據轉化為小數據(通過groupby)才能交給R做分析,因此R不可能直接分析行為詳單,只能分析統計結果。所以有人說:Python=R+SQL/Hive,並不是沒有道理的。
7. python數據分析該怎麼入門呢
1.為什麼選擇Python進行數據分析?
Python是一門動態的、面向對象的腳本語言,同時也是一門簡約,通俗易懂的編程語言。Python入門簡單,代碼可讀性強,一段好的Python代碼,閱讀起來像是在讀一篇外語文章。Python這種特性稱為「偽代碼」,它可以使你只關心完成什麼樣的工作任務,而不是糾結於Python的語法。
另外,Python是開源的,它擁有非常多優秀的庫,可以用於數據分析及其他領域。更重要的是,Python與最受歡迎的開源大數據平台Hadoop具有很好的兼容性。因此,學習Python對於有志於向大數據分析崗位發展的數據分析師來說,是一件非常節省學習成本的事。
Python的眾多優點讓它成為最受歡迎的程序設計語言之一,國內外許多公司也已經在使用Python,例YouTube,Google,阿里雲等等。
3.數據分析流程
Python是數據分析利器,掌握了Python的編程基礎後,就可以逐漸進入數據分析的奇妙世界。CDA數據分析師認為一個完整的數據分析項目大致可分為以下五個流程:
在這一階段,Python也具有很好的工具庫支持我們的建模工作:
scikit-learn-適用Python實現的機器學習演算法庫。scikit-learn可以實現數據預處理、分類、回歸、降維、模型選擇等常用的機器學習演算法。
Tensorflow-適用於深度學習且數據處理需求不高的項目。這類項目往往數據量較大,且最終需要的精度更高。
5)可視化分析
數據分析最後一步是撰寫數據分析報告,這也是數據可視化的一個過程。在數據可視化方面,Python目前主流的可視化工具有:
Matplotlib-主要用於二維繪圖,它能讓使用者很輕松地將數據圖形化,並且提供多樣化的輸出格式。
Seaborn-是基於matplotlib產生的一個模塊,專攻於統計可視化,可以和Pandas進行無縫鏈接。
從上圖我們也可以得知,在整個數據分析流程,無論是數據提取、數據預處理、數據建模和分析,還是數據可視化,Python目前已經可以很好地支持我們的數據分析工作。
8. python數據分析時間序列如何提取一個月的數據
Pandas中,最基本的時間序列類型就是以時間戳為索引的Series對象。
時間戳使用Timestamp(Series派生的子類)對象表示,該對象與datetime具有高度的兼容性,可以直接通過to_datetime()函數將datetime轉換為TimeStamp對象。
import pandas as pd # 導入pandas模塊,並起個別名pd from datetime import datetime import numpy as np pd.to_datetime('20200828') # 將datetime轉換為Timestamp對象
Timestamp('2020-08-28 00:00:00')
當傳入的是多個datetime組成的列表,則Pandas會將其強制轉換為DatetimeIndex類對象。
# 傳入多個datetime字元串 date_index = pd.to_datetime(['20200820', '20200828', '20200908']) date_index
DatetimeIndex(['2020-08-20', '2020-08-28', '2020-09-08'],
dtype='datetime64[ns]', freq=None)
如何取出第一個時間戳
date_index[0] # 取出第一個時間戳
Timestamp('2020-08-20 00:00:00')
2.在Pandas中,最基本的時間序列類型就是以時間戳為索引的Series對象。
# 創建時間序列類型的Series對象 date_ser = pd.Series([11, 22, 33], index=date_index) date_ser
2020-08-20 11
2020-08-28 22
2020-09-08 33
dtype: int64
也可將包含多個datetime對象的列表傳給index參數,同樣能創建具有時間戳索引的Series對象。
# 指定索引為多個datetime的列表 date_list = [datetime(2020, 1, 1), datetime(2020, 1, 15), datetime(2020, 2, 20), datetime(2020, 4, 1), datetime(2020,