0%

python数据分析技法总结

目的

总结一些常用的库

常用术语

金融风控指标:WOE, IV, KS,LIFT值和PSI

参考文献

数据仓库的分层概念

https://blog.csdn.net/pmdream/article/details/113601956

canal

EDA

数据可视化

python可视化的包非常的多各有特点

与pandas无缝结合的seaborn

与matlab一致体验的matplotlib

中文支持绝好支持js扩展的pyecharts

模型

机器学习

scikit-learn:python传统机器学习库

pycaret:自动训练模型神器

新建一个环境终于装上了

深度学习

pytorch:科研领域最流行的深度学习框架

复杂网络

igraph:复杂网络研究框架

常用工具

包管理

笔记本

pyecharts

优点

  • pyechart可以解决seaborn,matplotlib中词云中文需要配很久环境的问题(特别是linux下)
  • tooltipopts的提示框可以显示更多的内容
  • 优秀的交互性和动画

缺点

  • 文档有点奇奇怪怪
  • 网上的解决方案不多

使用总结

前期数据分析用,或者需要大量交互性数据查看的时候,特别是数据中存在中文的情况

pyecharts文档

常用图例

配合文档食用更佳

graph_with_catagroies

scatter

简单使用

由于tooltip的优秀性,在处理大文本的时候,可以做到非常优秀的可视化,及其方便了EDA

详细代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from pyecharts.charts import Scatter
from pyecharts.commons.utils import JsCode
WIDTHSIZE = "1000px"
HEIGHTSIZE = "1600px"
def scatter_charts(data):
df = pd.DataFrame(data)
print(df)
# 改变图例的大小
# https://blog.csdn.net/binbin_09_10/article/details/90167286
scatter = Scatter(init_opts=opts.InitOpts(height=HEIGHTSIZE,width=WIDTHSIZE))
scatter.add_xaxis(xaxis_data=df.经度.values.tolist() )
scatter.add_yaxis(series_name="", yaxis_index=0,y_axis=df[["点赞数","用户名","等级","评论内容"]].values.tolist(), label_opts=opts.LabelOpts(is_show=False))
scatter.set_global_opts(
xaxis_opts=opts.AxisOpts(
type_="value",
name='等级'
),
yaxis_opts=opts.AxisOpts(
type_="value",
name='点赞数'
),
title_opts=opts.TitleOpts(title='第十名之后的评论', pos_top='30px', pos_left='center'),
tooltip_opts=opts.TooltipOpts(is_show=True,trigger_on='mousemove|click',axis_pointer_type='cross',formatter=JsCode(
# https://blog.csdn.net/Z17839192969/article/details/100574011
# 折行显示
"""function(params){
return '用户名:'+params.data[2]+'<br/>'+'点赞数:'+params.data[1]+'<br/>'+'等级:'+params.data[3]+'<br/>'+'评论内容:'+ '<div style="display:block;word-break: break-all;word-wrap: break-word;white-space:pre-wrap;width:500px">' +params.data[4]+ '</div>'
}
"""
))
)
return scatter

# 这个顺序怎么是乱的
data["经度"] = 资本家top10["等级"].values.tolist()
data["点赞数"] = 资本家top10["点赞数"].values.tolist()
data["等级"] = 资本家top10["等级"].values.tolist()
data["用户名"] = 资本家top10["用户名"].values.tolist()
data["评论内容"] = 资本家top10["评论内容"].values.tolist()
data["color"] = 资本家top10["评论内容"].values.tolist()
# data["用户名"] = 资本家top10["用户名"].values.tolist()
scatter = scatter_charts(data)
scatter.render("a.html")
scatter.render_notebook()

line

高级应用

多x轴
  • 效果

bar

wordCloud

简单使用

详细代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import jieba
from pyecharts.charts import WordCloud
comment_str_all = ''
# 拼接所有的评论内容到一个字符串
for reply in allReplies["评论内容"]:
comment_str_all += reply
#中文分词
seg_list = jieba.lcut(comment_str_all)

keyword_count = pd.Series(seg_list)
#keyword_count.str.len()
#这里是查看切割数据后不同长度的情况,剔除数据长度为1的数据
keyword_count = keyword_count[keyword_count.str.len()>1]

#进行数据统计,这一步就是为了下一步设置filter_words做的准备
keyword_count.value_counts()
filter_words = ['回复','不是','什么','真的','就是','这么','那么','怎么','现在','是的','这个','那个','这种','时候',
'什么','这部','没有','还有','觉得','什么','就是','没有','一个','不是','还是','最后','我们','但是',
'因为','真的','还是','现在 ','可能','可以','只是','其实','所以','这样','也许','一直','第一','为了','它们',
'看到','看过','自己','不会','一下','然后','真有','他们','已经']

# 剔除没有用的字符
keyword_count = keyword_count[~keyword_count.str.contains('|'.join(filter_words))]
#选择前100个重要的词汇进行词云展示
keyword_count = keyword_count.value_counts()[:100]

(
WordCloud()
.add(
"词频",
zip(keyword_count.index.tolist(), keyword_count.values.tolist()),
shape = 'star',
word_size_range=[20, 100],
rotate_step=10
)
.set_global_opts(title_opts=opts.TitleOpts(title="关键词汇挖掘-词云图"))
).render_notebook()

效果

geo

中国和世界支持的较好,有一部分国家的选项
原生支持的地图选项(maptype)在pyecharts.datasets.map_filenames.json文件中

seaborn

优点

缺点

  • 中文支持差

常用API

iris数据集

我们以常用的iris数据集做例子

pairplot

很好的将数据的分布和相关性都画在了一个图上

1
sns.pairplot(data=iris)


为了看清楚每个类别的区别,我们可以用hue来进行划分
1
sns.pairplot(data=iris,hue="species")


我们也可以修改一下marker让其更有学术气息,marker的种类与matplotlib一致
1
sns.pairplot(data=iris,hue="species",markers="+")

relplot

关系图

lmplot

用来进行回归分析

matplotlib

优点

  • 传统的画图库,网上有很多解决方案
  • 与matlab的api相当一致,对传统matlab党友好

缺点

  • 中文支持差

两种模式

  • 面对对象
  • 函数式

常用API

marker的种类

scatter

plot

pandas

简介

pandas用来处理表格型数据十分的方便

导入

1
import pandas as pd

常用API

对表格数据概览

describe:描述数据分布

会对表格中每一列数值型数据的分布做一个展示,例如数据条数,均值,标准差,最大最小值,1/2,1/4,3/4分位点的数据。经常用来查看数值型数据大致分布。

info:显示基本信息

列出所有列的类型是什么,有没有非空数据,以及数据条数,还有内存占用等。一般用来查看数据的类型,有没有非空的数据。

head: 预览前几个数据

看一下数据的前几条数据,经常用来直观的感受一下数据的样子。

read_xxx: 读入表格

1
2
3
4
# 读入resources文件夹下,用year变量拼接的excel文件
# index_col指定某一列为索引列
# drop_duplicates
pd.read_excel(os.path.join("resources",f'{year}.xlsx'), index_col=0).drop_duplicates()

to_xxx: 写出表格

有的时候直接pd导出,会自己带上索引列(未处理过应该是递增的数字),如果不想输出的时候带有index的话,可以带上如下参数

1
2
# 设置index = None
excel.to_excel(os.path.join(RESOURCESPATH,f"{2021}.xlsx"),index=None)

支持导出的类型

  • markdown
  • latex
  • csv
  • excel
  • clipboard

创建表格:从array中

1
2
numpy_data = np.array([[1, 2], [3, 4]])
df = pd.DataFrame(data=numpy_data, index=["row1", "row2"], columns=["column1", "column2"])

创建表格通过dict

1
pd.DataFrame(d.items(), columns=['Date', 'DateValue'])

Create a Pandas DataFrame from List of Dicts

1
2
3
4
5
6
7
8
9
# Initialise data to lists.  
data = [{'Geeks': 'dataframe', 'For': 'using', 'geeks': 'list'},
{'Geeks':10, 'For': 20, 'geeks': 30}]

# Creates DataFrame.
df = pd.DataFrame(data)

# Print the data
df

合并表格

反选columns

1
sns.pairplot(data=fullMusicPklData.loc[:, ~fullMusicPklData.columns.isin(['b'])], corner=True, hue="genre")

删掉第一列

sample: 数据采样

有时候需要先用少量数据进行测试,这时候需要采样一部分数据,可以使用内置函数sample

函数原型

reset index after concat

1
artistAllinOne.reset_index(drop=True)

按照index排序

1
df.sort_index(inplace=True)

使用举例

1
2
3
4
5
# 采样10个
data.sample(10)
# 采样10个,并指定随机种子,但这时候是有放回采样,有可能重复
# 如果不需要重复数据,可使用drop_duplicates去重
data.sample(10,random_state=1).drop_duplicates()

unique: pandas 中的set操作

对于标称属性,有时候想得到所有种类,这时候就需要使用unique

1
2
3
4
5
6
7
8
# 得到`工作`列的总类
data.Occupation.unique()
# 相当于如下的原生的python语法实现
set(data.Occupation.values.tolist())
# 综合应用举例
# unique得到的是np.array类型,要转为list才能用+合并
for team in list(data["visitor_team_name"].unique()) + list(data["home_team_name"].unique()):
# dosomething

to_dict

将pandas转为list,方便导入pyecharts画图

1
df.to_dict('records')


one column as key one column as value to python dict pandas

1
df.set_index('id')['value'].to_dict()

nan

选出存在nan的元素

按行遍历

1
2
for index, row in df.iterrows():
print(row['c1'], row['c2'])

columns重命名

1
linkFrame.columns = ["name","symbolSize"]

上面的代码会报错

1
2
3
4
5
6
7
8
9
10
outdatas = influenceData.groupby(["influencer_main_genre","influencer_id"]).agg('count')

outdatas = outdatas.groupby("influencer_main_genre").agg({
'influencer_name':"max", 'influencer_active_start':"min", 'follower_id':"sum",
'follower_name':"mean", 'follower_main_genre':"median", 'follower_active_start':"std",
'influence_follower_id_count':"var"
})

outdatas.cloumns = ["max","min","sum","mean","median","std","var"]
outdatas.rename(columns={"A": "a", "B": "c"})

求1/4,3/4,1/2分位点

1
2
3
4
5
data.price.quantile([0.25,0.5,0.75])
//输出
0.25 42812.25
0.50 57473.00
0.75 76099.75

columns和index翻转

1
df.T

多级index,drop掉一级

1
df.reset_index(level=2, drop=True)

merge by index

1
2
pd.concat([df1, df2], axis=1)

绝技: map,apply,groupby,agg

在数据仓库与数据挖掘的课中,我们学过数据的属性可以分为四类

基本四种属性分类

类别含义举例
标称属性与名称有关,值是一些符号或事物的名称。每个值代表某种类别、编码或状态。Occupation={教师,医生,程序员,农民}
二元属性二元属性是一种标称属性,只有两个类别或状态的标称属性(0 and 1),又称布尔属性性别
序数属性其可能的值之间具有有意义的序或秩评定(ranking),但是相继值之间的差是未知的。Professional_rank:助教、讲师、副教授、教授
数值属性定量,即它是可度量的量,用整数或实数值表示。数值属性可以是区间标度的或比率标度的。区间标度属性:属性用相等的单位尺度度量。值有序,可比较和定量评估值之间的差。如室外温度差,日期差等。没有真正的零点,即不能用比率讨论这些值。如摄氏温度和华氏温度都没有真正的零点,即0°C和0°F都不表示“没有温度”,可以计算温度差,但不可以计算倍数。
比率标度属性:具有固有零点的数值属性。即可以说一个值是另一个的倍数(比率)。开氏温度、度量重量、高度、速度和货币量(100美元比1美元富有100倍)的属性

pandas预处理绝技

pandas数据预处理特别是四类基础数据有着非常方便的函数map,apply,以及聚合处理函数groupby,agg

apply

map

agg

综合应用举例

新增count列
1
influenceData['influence_follower_id_count'] = influenceData.groupby('influencer_id')['follower_id'].transform('count')
生成箱型图表格

时间序列:datetime

时间序列是非常重要的数据属性,很多时候得到的数据的时间序列的类型实际上字符串类型,特别是自己通过爬虫获取到的数据,这时候首先需要将其转换为datetime数据,还有的时候需要进行时区转换,当使用的是mongdb数据库默认是格林尼治时间,需要转换为相应的当地时间才能操作

时间序列预处理

字符串转为datetime

datetime字符串format的格式

1
2
# 字符串格式为:'Sat, Dec 9, 2017'
data["datetime_datetime"] = data["date_game"].apply(lambda x:datetime.datetime.strptime(x, '%a, %b %d, %Y'))

时区转换

当使用的是mongdb数据库默认是格林尼治时间,需要转换为相应的北京时间才是正确的时间数据

1
2
3
4
5
6
7
8
9
10
11
12
13
import pytz
# 查看3000行数据的'发布时间'列的时区属性
print(allReplies['发布时间'][3000].tz)
# 将字符串类型的数据转为datetime类型
# 由于是标准的'2020-11-01 01:57:47'
allReplies[["发布时间"]] = pd.to_datetime(allReplies["发布时间"])
allReplies['发布时间'] # 发现从csv中得到的是字符串类型【但pandas统一都当作了object】
allReplies['发布时间'] = allReplies['发布时间'].apply(lambda x:pytz.utc.localize(x))
allReplies['发布时间'] # 重新看一下发布时间列的数据类型,已经变成了datetime64[ns, UTC]
# 此时的时间属性已经变成了东8区的时间
allReplies['发布时间'] = allReplies['发布时间'].apply(lambda x:x.astimezone(pytz.timezone('Asia/Shanghai')))# 变换时区信息


时间序列的筛选

对于时间序列的操作pandas有着非常优秀的函数,如

1
2
3
4
5
6
7
# datetime是时间序列数据列
# 选出2018年的数据
data[data.datetime.dt.year == 2018]
# 选出7月份的数据
data[data.datetime.dt.month == 7]
# 选出15号的数据
data[data.datetime.dt.day == 15]

有的时候我们需要选出某个区间内的数据,可以进行如下的操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import datetime
# 区间开始
start=datetime.datetime(2018,2,16)
# 区间结束
end=datetime.datetime(2018,2,22)

# 选出早于2018/2/16的数据
data[data["datetime_datetime"]<start]
# 选出晚于2018/2/22的数据
data[data["datetime_datetime"]>end]
# 选出在2018/2/16和2018/22之间的数据
data[(data["datetime_datetime"]>start) & (data["datetime_datetime"]<end)]
# 选出在2018/2/16与2018/22之外的数据
data[(data["datetime_datetime"]<start) | (data["datetime_datetime"]>end)]

sklearn

我们仍然使用iris数据集做例子

多分类

模型评价

中心化和标准化的区别

归一化

基本的归一化方法

非线性归一化

conda

强大的包和环境管理工具

查看当前环境

conda env list

新建环境

conda create --name yourenvname python=3.6

删除环境

conda remove -n thepycaret --all

jupyternotebook

尽管jupyterLab作为下一代jupyternotebook,已经具有调试功能,但我还是选择jupyter notebook(web) + pycharm(调试)。因jupyter notebook中的Nbextensions插件的toc模块真的让人爱不释手,当代码量(cell 的数量)多起来的时候方便管。

jupyterLab我就不做评测了(其实是因为没有用过),讲讲我的jupyter notebook(web) + pycharm(调试)开发模式的优缺点。

优点

  • 强大调试环境,可以debug一个cell,享受整个pycharm python调试系统
  • 丰富的jupyter notebook插件生态,如Nbextensions,Qgrid等
  • ipython的iframe,直接浏览pdf,html文档

缺点

笔者的pycharm版本为2020.1

  • pycharm如果一开始打开jupyer notebook,并之后一直使用pycharm进行编辑的话是没有问题的,但是一旦用网页打开,或者用git同步之后cell之间的顺序就会混乱掉。(尚未解决,猜测删掉pycharm的jupyter notebook的cache可能就没问题了)
  • pycharm的jupyter不支持pyecharts的图例的预览,估计是因为pycharm是用java写的,基于chrome内核开发的vscode就可以预览,但与浏览器比还是差强人意。

插件

Qgrid

像excel一样显示表格

代码详情
1
2
3
import qgrid
widget = qgrid.show_grid(df, show_toolbar = True)
widget

常用技巧

在不同的jupyter notebook之间共享变量

在2个jupyter笔记本之间,可以使用%store命令。
在第一个jupyter笔记本中:

1
2
3
data = 'string or data-table to pass'
%store data
del data

在第二个jupyter笔记本中:
1
2
%store -r data
data

Cell中 Code 和 Markdown的切换

  • 在一个cell中(在command模式下)
  • 按下 y, 进入Code
  • 按下m, 进入Markdown

常用快捷键总结

三种模式

在使用快捷键前,需要了解jupyter notebook 中 cell的三种模式,命令模式,markdown模式,code模式。

  • [ ] TODO

快捷键总结

  • [ ] TODO
快捷键作用
dd删除cell
Shift + M合并选中的cell

远程服务

  • 创建配置文件:jupyter notebook --generate-config
  • cd到配置文件所在目录,一般为C:\Users\userName\.jupyter\jupyter_notebook_config.py
  • 设置启动ip:echo c.NotebookApp.ip = '0.0.0.0' >> jupyter_notebook_config.py
  • 设置端口:echo c.NotebookApp.port = 8888 >> jupyter_notebook_config.py
  • 设置不启动浏览器:echo c.NotebookApp.open_browser = False >> jupyter_notebook_config.py
  • 设置可以外部访问:echo c.NotebookApp.allow_remote_access = True >> jupyter_notebook_config.py
    设置密码
    代码详情
1
2
3
4
5
6
7
8
9
10
11
D:\Users\aaaa\.jupyter>jupyter notebook password
Enter password:
Verify password:
[JupyterPasswordApp] Wrote hashed password to D:\Users\aaaa\.jupyter\jupyter_server_config.json

D:\Users\aaaa\.jupyter>type jupyter_server_config.json
{
"IdentityProvider": {
"hashed_password": "12345645645665"
}
}

</details>

  • 设置密码:echo c.NotebookApp.password = u'12345645645665' >> jupyter_notebook_config.py
  • start /min jupyter notebook
  • nohup jupyter notebook

参考文献

内网穿透导致无法打开笔记本

代码详情
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Traceback (most recent call last):
File "C:\Users\lnd\anaconda3\envs\torch\lib\site-packages\tornado\web.py", line 1704, in _execute
result = await result
File "C:\Users\lnd\anaconda3\envs\torch\lib\site-packages\tornado\gen.py", line 775, in run
yielded = self.gen.send(value)
File "C:\Users\lnd\anaconda3\envs\torch\lib\site-packages\notebook\notebook\handlers.py", line 95, in get
self.write(self.render_template('notebook.html',
File "C:\Users\lnd\anaconda3\envs\torch\lib\site-packages\notebook\base\handlers.py", line 516, in render_template
return template.render(**ns)
File "C:\Users\lnd\anaconda3\envs\torch\lib\site-packages\jinja2\environment.py", line 1301, in render
self.environment.handle_exception()
File "C:\Users\lnd\anaconda3\envs\torch\lib\site-packages\jinja2\environment.py", line 936, in handle_exception
raise rewrite_traceback_stack(source=source)
File "C:\Users\lnd\anaconda3\envs\torch\lib\site-packages\notebook\templates\notebook.html", line 1, in top-level template code
{% extends "page.html" %}
File "C:\Users\lnd\anaconda3\envs\torch\lib\site-packages\notebook\templates\page.html", line 154, in top-level template code
{% block header %}
File "C:\Users\lnd\anaconda3\envs\torch\lib\site-packages\notebook\templates\notebook.html", line 115, in block 'header'
{% for exporter in get_frontend_exporters() %}
File "C:\Users\lnd\anaconda3\envs\torch\lib\site-packages\notebook\notebook\handlers.py", line 40, in get_frontend_exporters
for name in get_export_names():
File "C:\Users\lnd\anaconda3\envs\torch\lib\site-packages\nbconvert\exporters\base.py", line 146, in get_export_names
e = get_exporter(exporter_name)(config=config)
File "C:\Users\lnd\anaconda3\envs\torch\lib\site-packages\nbconvert\exporters\base.py", line 102, in get_exporter
exporter = entrypoints.get_single('nbconvert.exporters', name).load()
File "C:\Users\lnd\anaconda3\envs\torch\lib\site-packages\entrypoints.py", line 82, in load
mod = import_module(self.module_name)
File "C:\Users\lnd\anaconda3\envs\torch\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 850, in exec_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "C:\Users\lnd\anaconda3\envs\torch\lib\site-packages\nbconvert\__init__.py", line 4, in <module>
from .exporters import *
File "C:\Users\lnd\anaconda3\envs\torch\lib\site-packages\nbconvert\exporters\__init__.py", line 3, in <module>
from .html import HTMLExporter
File "C:\Users\lnd\anaconda3\envs\torch\lib\site-packages\nbconvert\exporters\html.py", line 14, in <module>
from jinja2 import contextfilter
ImportError: cannot import name 'contextfilter' from 'jinja2' (C:\Users\lnd\anaconda3\envs\torch\lib\site-packages\jinja2\__init__.py)
关闭系统代理是的,你可以在 Windows 的命令提示符 (CMD) 或 PowerShell 中使用命令来更改系统代理设置。以下是如何使用命令行关闭系统代理的步骤: 在 CMD 或 PowerShell 中输入以下命令:
1
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 0 /f
这条命令会关闭系统代理。如果你想再次开启系统代理,你可以使用以下命令:
1
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /f
这些命令会修改注册表中的值,这样就可以更改系统代理设置。但是请注意,修改注册表可能会影响系统的其他部分,所以在执行这些操作时要小心。 此外,这些命令并不会影响 Clash 本身的设置,只会更改系统是否使用代理。如果 Clash 仍在运行,它可能会再次更改这些设置。如果你想完全停止使用 Clash,你可能需要先关闭 Clash。
如何将jupyter注册成windows的服务要将Jupyter Notebook注册为Windows服务,你可以使用`nssm` (非官方的“非凡服务管理器”)。`nssm`是一个允许你管理和创建Windows服务的工具。以下是一些步骤,你可以根据这些步骤操作: 1. 下载并安装`nssm`。你可以从[这里](https://nssm.cc/download)下载。 2. 打开命令提示符(CMD)并导航到`nssm.exe`的目录。 3. 使用以下命令创建一个新的服务,将“YourServiceName”替换为你想要的服务名称,将“YourPathToJupyter-notebook.exe”替换为你的`jupyter-notebook.exe`的完整路径,将"YourNotebookDirectory"替换为你的笔记本目录:
1
nssm install YourServiceName "YourPathToJupyter-notebook.exe" "--notebook-dir=YourNotebookDirectory --no-browser"
例如:
1
nssm install JupyterService "C:\Users\Username\Anaconda3\Scripts\jupyter-notebook.exe" "--notebook-dir=C:\Users\Username\Documents\JupyterNotebooks --no-browser"
nssm install JupyterService3 "D:\Users\LND\anaconda3\Scripts\jupyter.exe" "--notebook-dir=C:\Users\Username\Documents\JupyterNotebooks --no-browser" 4. 你可以使用以下命令启动你的服务:
1
nssm start YourServiceName
5. 如果你想停止你的服务,你可以使用以下命令:
1
nssm stop YourServiceName
请注意,这个过程需要管理员权限。如果你在执行这些命令时遇到问题,尝试以管理员身份运行命令提示符。 另外,这个服务默认是手动启动的,如果你想让它在启动时自动运行,你需要更改服务的启动类型。你可以在服务管理器中做到这一点,或者在创建服务时使用`nssm set YourServiceName Start SERVICE_AUTO_START`命令。 希望这个解答对你有所帮助!如果你有其他问题,欢迎提问。

jupyter显示所有的环境

conda activate adda

python -m ipykernel install --name adda

igraph

官方文档

常用API

计算节点的中心度

1
g.betweenness

生成有向图

默认是无向图,如果想生成有向图,需要制定directed = True

1
g = igraph.Graph([(0,1), (0,2), (2,3), (3,4), (4,2), (2,5), (5,0), (6,3), (5,6)],directed = True)

计算图中的节点总数

1
g.vcount()

复杂网络聚类模型

得到所有的index

1
g.vs.indices

更优雅的生成图

TODO:把美赛的代码拿过来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import igraph

edges = [['a', 'b'],
['a', 'b'],
['a', 'b'],
['b', 'a'],
['a', 'c'],
['c', 'a'],
['c', 'd'],
['c', 'd'],
['d', 'c'],
['d', 'c']]

# collect the set of vertex names and then sort them into a list
vertices = set()
for line in edges:
vertices.update(line)
vertices = sorted(vertices)

# create an empty graph
g = igraph.Graph()

# add vertices to the graph
g.add_vertices(vertices)

# add edges to the graph
g.add_edges(edges)

参考文献

Pandas数据处理三板斧——map、apply、applymap详解

聚合分析:Pandas之超好用的Groupby用法详解

numpy