① 用python統計詞頻
def statistics(astr):
# astr.replace("\n", "")
slist = list(astr.split("\t"))
alist = []
[alist.append(i) for i in slist if i not in alist]
alist[-1] = alist[-1].replace("\n", "")
return alist
if __name__ == "__main__":
code_doc = {}
with open("test_data.txt", "r", encoding='utf-8') as fs:
for ln in fs.readlines():
l = statistics(ln)
for t in l:
if t not in code_doc:
code_doc.setdefault(t, 1)
else:
code_doc[t] += 1
for keys in code_doc.keys():
print(keys + ' ' + str(code_doc[keys]))
② Python氣象數據處理進階之Xarray(6):數據重組與換形
這一部分涉及到了常用的操作,比如調換維度的位置,給數據重新reshape換形等等,建議大家可以認真閱讀這部分。
老樣子,先新建一個數組
比如說在求某個東西時需要將時間維放在最後一維,但是數據本身的時間在第一維,那麼便可以用到這個操作。
第一種是精準換位,指定每個維度的位置
第二種是單獨換位,只對指定維度換位,將time放在最後,其餘不變
第三種為全部換位,相當於數組轉置
擴展指增加一個維度,壓縮指將一個維度擠壓掉
官方文檔中接下來有一段是關於DataArray向DataSet轉換的,個人感覺放在這一章節並不合理,我後邊會整理放進Python氣象數據處理進階之Xarray(1)中(我覺得兩種基礎數據結構以及互相轉換應該最開始介紹的)。所以接下來跳過這部分。
個人感覺可能處理站點數據會用到這個方法
換一個數組演示
現在將這個2維數組堆疊成1維
也可以拆分,其實就是反堆疊
最重要的是不同於Pandas,Xarray的stack不缺自動丟失缺測值!!!
Xarray還提供了將不同變數stack的例子,有興趣的可以去看看。這個用法感覺比較雞肋
這塊比較難理解,建議還是先讀第一篇文章,弄清數據結構,da數組顯示Dimensions without coordinates: x,而通過da.set_index函數,將X設置為混合索引號。
之後便可以實線自由索引:
通過mda.reset_index('x')重置。
reorder_levels()函數允許調換索引順序(個人感覺比較雞肋)
這小節應該是這篇文章和數組換形換維同等重要的。
這就是對數組進行滾動。這個的作用主要在於做差分計算。雖然前邊講過Xarray提供了中央差計算函數,但是仍需要更靈活的操作,滾動函數就實現了這個目的。
③ python(pandas模塊)
1.什麼是pandas? numpy模塊和pandas模塊都是用於處理數據的模塊。 numpy主要用於針對數組進行統計計算,處理數字數據比較方便。 pandas除了可以處理數字數據,還可...
④ python用卡方檢驗,自動分箱,結果是否可靠有待驗證
def calc_chiSquare(sampleSet, feature, target):
'''
計算某個特徵每種屬性值的卡方統計量
params:
sampleSet: 樣本集
feature: 目標特徵
target: 目標Y值 (0或1) Y值為二分類變數
return:
卡方統計量dataframe
feature: 特徵名稱
act_target_cnt: 實際壞樣本數
expected_target_cnt:期望壞樣本數
chi_square:卡方統計量
'''
# 計算樣本期望頻率
target_cnt = sampleSet[target].sum()
sample_cnt = len(sampleSet[target])
expected_ratio = target_cnt * 1.0/sample_cnt
# 對變數按屬性值從大到小排序
df = sampleSet[[feature, target]]
col_value = list(set(df[feature]))
# 計算每一個屬性值對應的卡方統計量等信息
chi_list = []; target_list = []; expected_target_list = []
for value in col_value:
df_target_cnt = df.loc[df[feature] == value, target].sum()
df_cnt = len(df.loc[df[feature] == value, target])
expected_target_cnt = df_cnt * expected_ratio
chi_square = (df_target_cnt - expected_target_cnt)**2 / expected_target_cnt
chi_list.append(chi_square)
target_list.append(df_target_cnt)
expected_target_list.append(expected_target_cnt)
# 結果輸出到dataframe, 對應欄位為特徵屬性值, 卡方統計量, 實際壞樣本量塌拆, 期望壞樣本量
chi_stats = pd.DataFrame({feature:col_value, 'chi_square':chi_list,
'act_target_cnt':target_list, 'expected_target_cnt':expected_target_list})
return chi_stats[[feature, 'act_target_cnt', 'expected_target_cnt', 'chi_square']]
def chiMerge_maxInterval(chi_stats, feature, maxInterval=5):
'''
卡方分箱合並--最大區間限製法
params:
chi_stats: 卡方統計量dataframe
feature: 目標特徵
maxInterval:最大分箱數閾值
return:
卡方合並結果dataframe, 特徵分割敏老split_list
'''
橋衫升 group_cnt = len(chi_stats)
split_list = [chi_stats[feature].min()]
# 如果變數區間超過最大分箱限制,則根據合並原則進行合並
while(group_cnt > maxInterval):
min_index = chi_stats[chi_stats['chi_square']==chi_stats['chi_square'].min()].index.tolist()[0]
# 如果分箱區間在最前,則向下合並
if min_index == 0:
chi_stats = merge_chiSquare(chi_stats, min_index+1, min_index)
# 如果分箱區間在最後,則向上合並
elif min_index == group_cnt-1:
chi_stats = merge_chiSquare(chi_stats, min_index-1, min_index)
# 如果分箱區間在中間,則判斷與其相鄰的最小卡方的區間,然後進行合並
else:
if chi_stats.loc[min_index-1, 'chi_square'] > chi_stats.loc[min_index+1, 'chi_square']:
chi_stats = merge_chiSquare(chi_stats, min_index, min_index+1)
else:
chi_stats = merge_chiSquare(chi_stats, min_index-1, min_index)
group_cnt = len(chi_stats)
chiMerge_result = chi_stats
split_list.extend(chiMerge_result[feature].tolist())
return chiMerge_result, split_list
def chiMerge_minChiSquare(chi_stats, feature, dfree=4, cf=0.1, maxInterval=5):
'''
卡方分箱合並--卡方閾值法
params:
chi_stats: 卡方統計量dataframe
feature: 目標特徵
maxInterval: 最大分箱數閾值, default 5
dfree: 自由度, 最大分箱數-1, default 4
cf: 顯著性水平, default 10%
return:
卡方合並結果dataframe, 特徵分割split_list
'''
threshold = get_chiSquare_distuibution(dfree, cf)
min_chiSquare = chi_stats['chi_square'].min()
group_cnt = len(chi_stats)
split_list = [chi_stats[feature].min()]
# 如果變數區間的最小卡方值小於閾值,則繼續合並直到最小值大於等於閾值
while(min_chiSquare < threshold and group_cnt > maxInterval):
min_index = chi_stats[chi_stats['chi_square']==chi_stats['chi_square'].min()].index.tolist()[0]
# 如果分箱區間在最前,則向下合並
if min_index == 0:
chi_stats = merge_chiSquare(chi_stats, min_index+1, min_index)
# 如果分箱區間在最後,則向上合並
elif min_index == group_cnt-1:
chi_stats = merge_chiSquare(chi_stats, min_index-1, min_index)
# 如果分箱區間在中間,則判斷與其相鄰的最小卡方的區間,然後進行合並
else:
if chi_stats.loc[min_index-1, 'chi_square'] > chi_stats.loc[min_index+1, 'chi_square']:
chi_stats = merge_chiSquare(chi_stats, min_index, min_index+1)
else:
chi_stats = merge_chiSquare(chi_stats, min_index-1, min_index)
min_chiSquare = chi_stats['chi_square'].min()
group_cnt = len(chi_stats)
chiMerge_result = chi_stats
split_list.extend(chiMerge_result[feature].tolist())
return chiMerge_result, split_list
def get_chiSquare_distuibution(dfree=4, cf=0.1):
'''
根據自由度和置信度得到卡方分布和閾值
params:
dfree: 自由度, 最大分箱數-1, default 4
cf: 顯著性水平, default 10%
return:
卡方閾值
'''
percents = [0.95, 0.90, 0.5, 0.1, 0.05, 0.025, 0.01, 0.005]
df = pd.DataFrame(np.array([chi2.isf(percents, df=i) for i in range(1, 30)]))
df.columns = percents
df.index = df.index+1
# 顯示小數點後面數字
pd.set_option('precision', 3)
return df.loc[dfree, cf]
def merge_chiSquare(chi_result, index, mergeIndex, a = 'expected_target_cnt',
b = 'act_target_cnt', c = 'chi_square'):
'''
params:
chi_result: 待合並卡方數據集
index: 合並後的序列號
mergeIndex: 需合並的區間序號
a, b, c: 指定合並欄位
return:
分箱合並後的卡方dataframe
'''
chi_result.loc[mergeIndex, a] = chi_result.loc[mergeIndex, a] + chi_result.loc[index, a]
chi_result.loc[mergeIndex, b] = chi_result.loc[mergeIndex, b] + chi_result.loc[index, b]
chi_result.loc[mergeIndex, c] = (chi_result.loc[mergeIndex, b] - chi_result.loc[mergeIndex, a])**2 /chi_result.loc[mergeIndex, a]
chi_result = chi_result.drop([index])
chi_result = chi_result.reset_index(drop=True)
return chi_result
for col in bin_col:
chi_stats = calc_chiSquare(exp_f_data_label_dr, col, 'label')
chiMerge_result, split_list = chiMerge_maxInterval(chi_stats, col, maxInterval=5)
print(col, 'feature maybe split like this:', split_list)
⑤ 最全的pandas面試基礎100題目
在進行下面的題目操作時,一定要先導入上面的兩個數據分析包 pandas、numpy
1. 如何用Python的列表創建一個series?
輸出:
一個series是一個一維的標記數組,可以容納任何數據類型(整數、字元串、浮點數、Python對象等)。必須記住,與Python列表不同,一個series總是包含相同類型的數據。
2.如何使用列表創建一個DataFrame?
輸出:
3.如何使用Series 字典對象生成 DataFrame?
輸出:
4.如何在pandas中創建一個空的DataFrame?
要創建一個完全空的pandas dataframe,我們使用以下操作:
輸出:
已知有這樣的數據,如何進行查看
輸出:
2.如何查看尾部數據?
3.如何快速查看數據的統計摘要?
4.如何查詢索引和列名?
1.簡述Pandas Index
在panda中建立索引意味著簡單地從DataFrame中選擇特定的數據行和列。
pandas支持四種類型的多軸索引,它們是:
它們統稱為索引器。這些是迄今為止索引數據最常見的方法。這四個函數有助於從DataFrame獲取元素、行和列。
2.Pandas 定義重新索引(Reindexing)
重新索引會更改DataFrame的行標簽和列標簽。重新索引意味著使數據符合特定軸上給定的一組標簽。
多個操作可以通過像這樣的索引來完成:
輸出:
3.如何設置索引?
panda set_index() 是一種將列表、序列或dataframe設置為dataframe索引的方法。
語法:
DataFrame.set_index(keys, inplace=False)
參數:
改變索引列
在本例中,名稱列被用作DataFrame的索引列
輸出:
如輸出圖像所示,以前索引列是一系列數字
Before Operation –
After Operation
4.如何重置索引?
Pandas Series.reset_index()
函數的作用是:生成一個新的DataFrame或帶有重置索引的Series。
例1: 使用 Series.reset_index() 函數重置給定Series對象的索引
輸出:
現在,我們將使用Series.reset_index()函數來重置給定的series對象的索引
輸出 :
從輸出中可以看到,該 Series.reset_index() 函數已將給定Series對象的索引重置為默認值。它保留了索引,並將其轉換為列。
1.1先創建數據:
1.2選擇單列,產生 Series
詳見 按標簽選擇 。
2.1用標簽提取一行數據:
詳見 按位置選擇 。
3.1用整數位置選擇:
4.1用單列的值選擇數據:
5.1用索引自動對齊新增列的數據:
1.如何得到一個數列的最小值、第25百分位、中值、第75位和最大值?
輸出:
Pandas dataframe.mean(axis=None) 函數返回所請求軸(axis=0代表對列進行求平均值,axis=1代表對行進行求平均值)的值的平均值。
示例: 使用 mean() 函數查找索引軸上所有觀測值的平均值。
輸出:
讓我們使用datafame .mean()函數來查找索引軸上的平均值。
3.如何將函數應用到DataFrame中的每個數據元素?
可以使用 apply() 函數以便將函數應用於給定dataframe中的每一行。讓我們來看看我們完成這項任務的方式。
實例:
輸出:
4.如何在panda中獲得一個DataFrame的行數和列數?
輸出:
獲取df的行和列計數
輸出:
5.如何在panda DataFrame中獲得列值的總和?
Pandas dataframe.sum() 函數返回所請求軸的值的和
語法: DataFrame.sum(axis=None, skipna=None, )
參數:
示例1: 使用 sum() 函數查找索引軸上所有值的總和
現在求出沿索引軸的所有值的和。我們將跳過計算和時的NaN值。
輸出:
如何將新行追加到pandas DataFrame?
Pandas dataframe.append() 函數的作用是:將其他dataframe的行追加到給定的dataframe的末尾,返回一個新的dataframe對象。
語法:
DataFrame.append( ignore_index=False,)
參數:
示例1: 創建兩個數據框,然後將第二個附加到第一個。
現在將df2附加到df1的末尾
輸出:
請注意,第二個DataFrame的索引值保留在附加的DataFrame中。如果我們不希望發生這種情況,則可以設置ignore_index = True。
輸出 :
「group by」 指的是涵蓋下列一項或多項步驟的處理流程:
詳見 分組 。
輸出:
1.先分組,再用 sum() 函數計算每組的匯總數據:
輸出:
2.多列分組後,生成多層索引,也可以應用 sum 函數:
輸出:
如何將numpy數組轉換為給定形狀的DataFrame?
輸出:
輸出:
透視表是一種可以對數據動態排布並且分類匯總的表格格式,在pandas中它被稱作pivot_table。
pivot_table(data, values=None, index=None, columns=None)
參數:
詳見: 數據透視表
列印輸出:
用上述數據生成數據透視表非常簡單:
返回結果:
1.如何將列添加到pandas DataFrame?
源數據:
輸出:
輸出:
2.如何向panda DataFrame添加索引、行或列?
向DataFrame添加索引
如果您創建了一個DataFrame, panda允許將輸入添加到索引參數中。它將確保您擁有所需的索引。否則,在默認情況下,DataFrame包含一個數值索引,該索引從0開始,在DataFrame的最後一行結束。
向DataFrame添加行、列
我們可以使用.loc、iloc和ix將行、列插入到DataFrame中。
添加具有特定索引名的行:
輸出:
3.如何在panda DataFrame上進行迭代?
您可以通過結合使用for循環和對DataFrame的iterrows()調用來遍歷DataFrame的行。
輸出:
4.我們如何排序DataFrame?
我們可以通過以下幾種有效地在DataFrame中執行排序:
(1)按標簽
可以使用sort_index()方法對數據dataframe進行排序。可以通過傳遞axis參數和排序順序來實現。默認情況下,按升序對行標簽進行排序。
⑥ Python基礎命令都有什麼
(1)打開csv文件
import pandas as pd
df=pd.read_csv(r』data/data.csv』)
(2)dataframe index 重新排序
data=df.sort_index(axis=0,ascending=False)
(3)dataframe 按照某一列進行升序或者降序排列
data=df.sort([『date』],ascending=True升序,False降序)
(4)dataframe 的index重新從0開始
data=data.reset_index(drop=True)
(5)畫橫坐標是日期的圖
import matplotlib.pyplot as plt
x=data[『date』]#日期是字元串形式
y=data[『close price』]
plt.plot_date(x,y)
(6)求標准差
import numpy as np
np.std
(7)下取整
import math
math.floor
上取整:math.ceil
(8)希爾伯特變換
from scipy import fftpack
hx= fftpack.hilbert(price)
(9)值排序
data.order()
(10)差分
data.diff(1)#一階差分
dataframe 刪除元素
data.drop(元素位置)
(11)嵌套的array處理方法
import itertools
a = [[1,2,3],[4,5,6], [7], [8,9]]
out = list(itertools.chain.from_iterable(a))
(12)dataframe修改列名
data.columns=[『num』,』price』]
(13)excel表導入以後有空行解決辦法
import numpy as np
data= data.drop(data.loc[np.isnan(data.name.values)].index)
(15)diff用法
一.是dataframe或者series格式,直接就用data.diff()
二.是list格式,先轉換成轉換成list格式data=data.tolist() 然後dif=np.diff(data)
(16)dataframe中的日期type不是date格式,不能直接相加減,所以先轉換成list格式
t=data.time.tolist()
date_time = datetime.datetime.strptime(str(t),』%Y-%m-%d %H:%M:%S』)
date_time=datetime.date(date_time.year,date_time.month,date_time.day)
past= date_time - datetime.timedelta(days=n*365)
(17)符號化
np.sign
(18)字典的使用
label={『11』:』TP』,』1-1』:』FN』,』-11』:』FP』,』-1-1』:』TN』}
for i in range(len(data1)):
state=str(int(data1[i]))+str(int(data2[i]))
result.append(label[state])
(19)用plt畫圖的時候中文不顯示的解決辦法
from matplotlib.font_manager import FontProperties
font_set = FontProperties(fname=r」c:windowsontssimsun.ttc」, size=15)
plt.title(u』中文』, fontproperties=font_set)
(20)獲取當前程序運行的時間
from time import time
time1=time()
time2=time()
print(time2-time1)
以上是我找到的資料,對於我這個學習Python到半吊子的人來說也是要收藏起來的。