laravel nova 不显示资源

好久没用了,发现怎么不会用了,不显示资源。reddit上一个答案解释了原因: 需要关闭认证:

https://nova.laravel.com/docs/3.0/resources/authorization.html#disabling-authorization

/**
 * Determine if the given resource is authorizable.
 *
 * @return bool
 */
public static function authorizable()
{
    return false;
}

参考资料


在 Mac M1 上安装 selenium

自从主力机换成 M1 后,就很少开docker了,很多容器都没有做arm架构的镜像。我常用的 selenium 也是,可叹。最后还是裸着安装了。以前在这篇文章里折腾过本地安装《selenium 裸安装备忘》,这次也是类似的操作,在本篇文章里记录一下。

一、安装java

brew install java

image-20221117午後13156478

image-20221117午後13232702

export PATH="/opt/homebrew/opt/openjdk/bin:$PATH"
alias java="/opt/homebrew/opt/openjdk/bin/java

image-20221117午後32601808

我发现 Mac 下的PATH有问题,在 zshrc 里改的不符合想法,系统的PATH还是在前面,我担心这样会有问题,遂直接改了这个文件 /etc/paths

二、安装chromedriver

先去官网下载 Chrome 版本对应的Chromedriver:https://chromedriver.chromium.org/downloads,扔到 path 对应的目录里。这里我扔到 ~/bin 目录下

image-20221117午後70447004

Mac 下允许执行权限,设置->安全 里:

Screenshot 8

三、安装selenium

官方地址:https://www.selenium.dev/downloads/

我下载了目前最新的 4.6.0版本:

image-20221125午後45446075

然后运行:

java -jar bin/selenium-server-4.6.0.jar standalone --host 100.100.100.9 --port 14444

IP 端口根据各自的需要配置了。

image-20221117午後72428922

看到日志显示 找到driver 就说明已经运行成功了。

尝试调用,看到输出了:

image-20221125午後45927768

16:57:45.003 INFO [LocalDistributor.newSession] - Session request received by the Distributor:
 [Capabilities {browserName: chrome, chromeOptions: {args: [--no-sandbox, window-size=1080x1920, --disable-gpu, --hide-scrollbars, --disable-extensions, start-maximized, --lang=zh-cn, --accept-lang=zh-cn, --arc-disable-locale-sync, --override-language-detection, --disable-dev-shm-usage]}, platform: ANY}, Capabilities {browserName: chrome, goog:chromeOptions: {args: [--no-sandbox, window-size=1080x1920, --disable-gpu, --hide-scrollbars, --disable-extensions, start-maximized, --lang=zh-cn, --accept-lang=zh-cn, --arc-disable-locale-sync, --override-language-detection, --disable-dev-shm-usage]}}]
Starting ChromeDriver 107.0.5304.62 (1eec40d3a5764881c92085aaee66d25075c159aa-refs/branch-heads/5304@{#942}) on port 43558
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.

16:57:46.590 WARN [ProtocolHandshake.createSession] - Support for Legacy Capabilities is deprecated; You are sending the following invalid capabilities: [chromeOptions, platform]; Please update to W3C Syntax: https://www.selenium.dev/blog/2022/legacy-protocol-support/

16:57:46.606 INFO [LocalNode.newSession] - Session created by the Node. Id: d0aff398d25ed2e6c16003eb81336a8b, Caps: Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 107.0.5304.110, chrome: {chromedriverVersion: 107.0.5304.62 (1eec40d3a576..., userDataDir: /var/folders/k1/qfq95df561b...}, goog:chromeOptions: {debuggerAddress: localhost:49491}, networkConnectionEnabled: false, pageLoadStrategy: normal, platformName: ANY, proxy: Proxy(), se:cdp: http://localhost:49491, se:cdpVersion: 107.0.5304.110, setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:virtualAuthenticators: true}

16:57:46.611 INFO [LocalDistributor.newSession] - Session created by the Distributor. Id: d0aff398d25ed2e6c16003eb81336a8b
 Caps: Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 107.0.5304.110, chrome: {chromedriverVersion: 107.0.5304.62 (1eec40d3a576..., userDataDir: /var/folders/k1/qfq95df561b...}, chromeOptions: {args: [--no-sandbox, window-size=1080x1920, --disable-gpu, --hide-scrollbars, --disable-extensions, start-maximized, --lang=zh-cn, --accept-lang=zh-cn, --arc-disable-locale-sync, --override-language-detection, --disable-dev-shm-usage]}, goog:chromeOptions: {debuggerAddress: localhost:49491}, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: ANY, platformName: ANY, proxy: Proxy(), se:bidiEnabled: false, se:cdp: ws://100.100.100.9:14444/se..., se:cdpVersion: 107.0.5304.110, setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:virtualAuthenticators: true}

四、番外-容器化

这两个命令是可以跑起来了:

docker run -d -p 4444:4444 --name selenium-hub selenium/hub:latest 
docker run -d --link selenium-hub:hub -e SE_EVENT_BUS_HOST=hub -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_EVENT_BUS_PUBLISH_PORT=4442 -p 5900:5900 --name selenium-node-chrome-vnc selenium/node-chrome:latest 

因为 arm下还没有相关的镜像,虽然容器可以运行

image-20231231142107145

image-20231231142135144

但是无法拉起chrome,用代码拉起chrome一定报错

image-20231231142327309

其实如果直接在vnc里启动chrome,也可以注意到,chrome是无法启动的:

image-20231231142419187

正常情况下应该是这个样子:

image-20231231184340328

所以如果有需要远程运行的话, 找一台x86的机器运行即可。我也是没想到,我x86的MacBook Air还能发挥余热。

docker run -d \
  --name selenium-chrome-1 \
  --restart always \
  --network bridge \
  -p 5901:5900 \
  -p 4445:4444 \
  -v /dev/shm:/dev/shm \
  selenium/standalone-chrome-debug

docker run -d \
  --name selenium-chrome-2 \
  --restart always \
  --network bridge \
  -p 5902:5900 \
  -p 4446:4444 \
  -v /dev/shm:/dev/shm \
  selenium/standalone-chrome-debug

docker run -d \
  --name selenium-chrome-3 \
  --restart always \
  --network bridge \
  -p 5903:5900 \
  -p 4447:4444 \
  -v /dev/shm:/dev/shm \
  selenium/standalone-chrome-debug

参考资料


pandas 操作 excel 备忘

以下链接是我边搜边写 pandas 代码的过程,记录一下。写完手头需求之后基本也懂了。

总结性内容:

细节操作:

我的test代码:

import pandas as pd
import yaml
import datetime

class Project():
    def __init__(self,name):
        self.name = name

    @staticmethod
    def columns():
        return {
            'name':'项目名称',
            'requestCount':'需求总数',
            "requestDoneCount":'需求完成数', 
            'percentRequestCount':'需求完成率',
            'requestKpiCount':"一个月前需求总数",
            "requestKpiDoneCount":'一个月前需求完成数',
            'percentKpiRequestCount':'一个月前需求完成率',
            'director':'主责人',
        }

    def doneFlag():
        return ("a","b","c","d","e")
    def directorOverwrite():
        return {
            "xxx平台":"无",
        }

def getProjectDict(df,now):
    ft = df[df.主责中心 == "kelu.org中心"]
    ftProjects = ft.groupby("blog")
    datetimeNow=datetime.datetime.strptime(now,"%Y%m%d")
    kpiTime=datetimeNow.replace(month=datetimeNow.month - 1).strftime("%Y-%m-%d")

    projectDict = {}

    for mainSys, sysReqs in ftProjects:
        project = Project(mainSys)
        project.requestCount = sysReqs.shape[0]
        sysReqsDone = sysReqs[sysReqs['状态'].isin(Project.doneFlag())]
        project.requestDoneCount = sysReqsDone.shape[0]
        if(project.requestCount == 0):
            project.percentRequestCount = 1
        else:
            project.percentRequestCount = round((float(project.requestDoneCount) / project.requestCount), 4)

        sysReqs['需求创建时间'] = pd.to_datetime(sysReqs['需求创建时间'])
        sysReqsKpi = sysReqs[sysReqs['需求创建时间'] < kpiTime]
        project.requestKpiCount = sysReqsKpi.shape[0]
        sysReqsKpiDone = sysReqsKpi[sysReqsKpi['状态'].isin(Project.doneFlag())]
        project.requestKpiDoneCount = sysReqsKpiDone.shape[0]
        if(project.requestKpiCount == 0):
            project.percentKpiRequestCount = 1
        else:
            project.percentKpiRequestCount = round((float(project.requestKpiDoneCount) / project.requestKpiCount), 4)

        if mainSys in Project.directorOverwrite():
            project.director = Project.directorOverwrite()[mainSys]
        else:
            for _, reqData in sysReqs.iterrows():
                project.director = reqData.主责人
                break

        project.reqs = sysReqs

        projectDict[mainSys] = vars(project)
        # print(type(projectDict[mainSys]))

    return projectDict

def exportMainSheet(projectDict):
    df=pd.DataFrame(projectDict).transpose()
    newDf=df[[
        'name',
        'requestCount',
        "requestDoneCount",
        'percentRequestCount',
        'requestKpiCount',
        'requestKpiDoneCount',
        'percentKpiRequestCount',
        'director'
        ]].sort_values(by=['percentKpiRequestCount','requestKpiCount'],ascending=False)

    # 处理输出内容
    newDf.reset_index(drop=True, inplace=True)
    newDf.index = newDf.index + 1
    newDf.loc['合计'] = newDf[['requestCount',"requestDoneCount",'requestKpiCount','requestKpiDoneCount']].sum()
    newDf.loc['合计','percentRequestCount'] = round((float(newDf.loc['合计','requestDoneCount']) / newDf.loc['合计','requestCount']), 4)
    newDf.loc['合计','percentKpiRequestCount'] = round((float(newDf.loc['合计','requestKpiDoneCount']) / newDf.loc['合计','requestKpiCount']), 4)

    newDf[u'percentRequestCount']= newDf['percentRequestCount'].apply(lambda x:format(x, '.2%'))
    newDf[u'percentKpiRequestCount']= newDf['percentKpiRequestCount'].apply(lambda x:format(x, '.2%'))

    newDf.rename(columns=Project.columns(),inplace=True)

    return newDf

def main():
    now='20221115'
    inputFilename='input'+now+'.xlsx'
    outputFilename='output'+now+'.xlsx'

    df = pd.read_excel(inputFilename,sheet_name='需求列表')
    projectDict = getProjectDict(df,now)
    # print(yaml.dump(projectDict,allow_unicode=True))

    with pd.ExcelWriter(outputFilename) as writer:
        exportMainSheet(projectDict).to_excel(writer, sheet_name="汇总")
        directorDict = {}
        for projectItem in projectDict.values():
            if(projectItem['percentRequestCount'] < 1):
                sysReqs = projectItem['reqs']
                reqsNotDone = sysReqs[~sysReqs['状态'].isin(Project.doneFlag())]
                if projectItem['director'] in directorDict:
                    reqsNotDone = pd.concat([reqsNotDone,directorDict[projectItem['director']]])
                directorDict[projectItem['director']] = reqsNotDone

        for director, reqsNotDone in directorDict.items():
            reqsNotDone.reset_index(drop=True, inplace=True)
            reqsNotDone.index = reqsNotDone.index + 1
            reqsNotDone.to_excel(writer, sheet_name=director)

if __name__=="__main__":
    main()

iterm2 给台前调度Stage Manager留出空间

今年Mac OS 更新到了 Ventura 13.0,新增了一个台前调度Stage Manager功能,如下图:

image-20221110午前104256477

我 iterm2 快捷键默认是全屏占满,这样会把左边的 stage 顶掉,不太舒服,遂需要把它的左边部分露出来。

配置方式呢如下,Preference->Profile->Default->Window,将 Columns 改成合适的值,同时把Style 改成“右侧”,如下图:

image-20231018165937180

最终实现的效果如下:

image-20221110午後54219171

我其他的配置可以参考15年的这两篇文章:https://blog.kelu.org/category/tags/iterm2.html


pandas 备忘

我对python也差不多是零基础,快忘光光了,这一篇做点简单记录。

官方API地址:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html

Pandas 是一个开源的第三方 Python 库,从 Numpy 和 Matplotlib 的基础上构建而来,享有数据分析“三剑客之一”的盛名(NumPy、Matplotlib、Pandas)。Pandas 已经成为 Python 数据分析的必备高级工具,它的目标是成为强大、灵活、可以支持任何编程语言的数据分析工具。

pandas教程

Pandas 这个名字来源于面板数据(Panel Data)与数据分析(data analysis)这两个名词的组合。在经济学中,Panel Data 是一个关于多维数据集的术语。Pandas 最初被应用于金融量化交易领域,现在它的应用领域更加广泛,涵盖了农业、工业、交通等许多行业。

Pandas 最初由 Wes McKinney(韦斯·麦金尼)于 2008 年开发,并于 2009 年实现开源。目前,Pandas 由 PyData 团队进行日常的开发和维护工作。在 2020 年 12 月,PyData 团队公布了最新的 Pandas 1.20 版本 。

在 Pandas 没有出现之前,Python 在数据分析任务中主要承担着数据采集和数据预处理的工作,但是这对数据分析的支持十分有限,并不能突出 Python 简单、易上手的特点。Pandas 的出现使得 Python 做数据分析的能力得到了大幅度提升,它主要实现了数据分析的五个重要环节:

  • 加载数据
  • 整理数据
  • 操作数据
  • 构建数据模型
  • 分析数据

Pandas内置数据结构 我们知道,构建和处理二维、多维数组是一项繁琐的任务。Pandas 为解决这一问题, 在 ndarray 数组(NumPy 中的数组)的基础上构建出了两种不同的数据结构,分别是 Series(一维数据结构)DataFrame(二维数据结构):

  • Series 是带标签的一维数组,这里的标签可以理解为索引,但这个索引并不局限于整数,它也可以是字符类型,比如 a、b、c 等;
  • DataFrame 是一种表格型数据结构,它既有行标签,又有列标签。

安装

Python 官方标准发行版没有自带 Pandas 库,因此需要另行安装。

除了标准发行版外,还有一些第三方机构发布的 Python 免费发行版, 它们在官方版本的基础上开发而来,并有针对性的提前安装了一些 Python 模块,从而满足某些特定领域的需求,比如专门适应于科学计算领域的 Anaconda,它就提前安装了多款适用于科学计算的软件包。

对于第三方发行版而言,它们已经自带 Pandas 库,所以无须另行安装,例如:

  1. Anaconda(官网下载:https://www.anaconda.com/)是一个开源的 Python 发行版,包含了 180 多个科学包及其依赖项。除了支持 Windows 系统外,也支持 Linux 和 Mac 系统。

  2. Python(x,y)(下载地址:https://python-xy.github.io/)是一款基于 Python、Qt (图形用户界面)和 Spyder (交互式开发环境)开发的软件,主要用于数值计算、数据分析和数据可视化等工程项目,目前只支持 Python 2 版本。

  3. WinPython(下载地址:https://sourceforge.net/projects/winpython/files/)一个免费的 Python 发行版,包含了常用的科学计算包与 Spyder IDE,但仅支持 Windows 系统。

因为我是新手,不使用太高层的工具了,集成工具虽然方便,毕竟封装了一层,说不准它也存在问题呢(尤其是我还用着Mac M1的情况下)?网络问题啊什么的还要折腾,遂直接使用pip直接安装,也有利于掌握。

pip install pandas
pip install openpyxl

image-20221109午後35840479

hello world

image-20221109午後41047948

Pandas Series

类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。

Series 由索引(index)和列组成,函数如下:

pandas.Series( data, index, dtype, name, copy)

参数说明:

  • data:一组数据(ndarray 类型)。
  • index:数据索引标签,如果不指定,默认从 0 开始。
  • dtype:数据类型,默认会自己判断。
  • name:设置名称。
  • copy:拷贝数据,默认为 False。
import pandas as pd
sites = {1: "Google", 2: "Runoob", 3: "Wiki"}
myvar = pd.Series(sites, index = [1, 2], name="RUNOOB-Series-TEST" )
print(myvar)

image-20221109午後41723229

DataFrame

首先要明确表格中的行与列:

  • 行:row,在dataframe中可以理解为index
  • 列:column

一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。

DataFrame 构造方法如下:

pandas.DataFrame( data, index, columns, dtype, copy)

参数说明:

  • data:一组数据(ndarray、series, map, lists, dict 等类型)。

    ndarray 是 NumPy 中的 N 维数组对象,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。ndarray 对象是用于存放同类型元素的多维数组。

  • index:索引值,或者可以称为行标签。

  • columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。

  • dtype:数据类型。

  • copy:拷贝数据,默认为 False。

image-20221109午後44217343

image-20221109午後43750874

CSV

(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。CSV 是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。

image-20221109午後44645743

方法简单记录:

  • read_csv

  • to_csv

  • head( n ) 方法用于读取前面的 n 行,如果不填参数 n ,默认返回 5 行。

  • tail( n ) 方法用于读取尾部的 n 行,如果不填参数 n ,默认返回 5 行,空行各个字段的值返回 NaN

  • info() 方法返回表格的一些基本信息

    image-20221109午後45041932

json

df = pd.read_json('sites.json')
print(df.to_string())

excel

df = pd.read_excel(io, sheet_name=0, header=0, names=None, index_col=None, 
              usecols=None, squeeze=False,dtype=None, engine=None, 
              converters=None, true_values=None, false_values=None, 
              skiprows=None, nrows=None, na_values=None, parse_dates=False, 
              date_parser=None, thousands=None, comment=None, skipfooter=0, 
              convert_float=True, kwds)

pandas读取Excel后返回 DataFrame。

数据清洗

参考 https://www.runoob.com/pandas/pandas-cleaning.html

常用函数

  • 统计函数
    • count() 统计某个非空值的数量。

    • sum() 求和

    • mean() 求均值

    • median() 求中位数

    • mode() 求众数

    • std() 求标准差

    • min() 求最小值

    • max() 求最大值

    • abs() 求绝对值

    • prod() 求所有数值的乘积。

    • cumsum() 计算累计和,axis=0,按照行累加;axis=1,按照列累加。

    • cumprod() 计算累计积,axis=0,按照行累积;axis=1,按照列累积。

    • corr() 计算数列或变量之间的相关系数,取值-1到1,值越大表示关联性越强

    • 百分比变化(pct_change)

    • 协方差(cov)

    • 相关系数(corr)

    • 排名(rank)

    另外,describe() 函数显示与 DataFrame 数据列相关的统计信息摘要。

image-20221109午後50401569

  • 重置索引(reindex)

    • reindex
    • reindex_like
    • rename
  • iteration遍历

    • iteritems():以键值对 (key,value) 的形式遍历,以列标签为键,以对应列的元素为值。
    • iterrows():以 (row_index,row) 的形式遍历行,返回一个迭代器,以行索引标签为键,以每一行数据为值。
    • itertuples():返回一个迭代器,该方法会把每一行生成一个元组。
  • sorting排序

    • sort_index() 行标签排序
    • sort_index(axis=1) 列标签排序
    • sort_values(by=’col1’) / sort_values(by=[‘col1’,’col2’]) 表示按值排序。
    • sort_values() 提供了参数kind用来指定排序算法。这里有三种排序算法:
      • mergesort
      • heapsort
      • quicksort
  • 去重函数:drop_duplicates()

  • 字符串处理

    • lower() 将的字符串转换为小写。
    • upper() 将的字符串转换为大写。
    • len() 得出字符串的长度。
    • strip() 去除字符串两边的空格(包含换行符)。
    • split() 用指定的分割符分割字符串。
    • cat(sep=””) 用给定的分隔符连接字符串元素。
    • get_dummies() 返回一个带有独热编码值的 DataFrame 结构。
    • contains(pattern) 如果子字符串包含在元素中,则为每个元素返回一个布尔值 True,否则为 False。
    • replace(a,b) 将值 a 替换为值 b。
    • count(pattern) 返回每个字符串元素出现的次数。
    • startswith(pattern) 如果 Series 中的元素以指定的字符串开头,则返回 True。
    • endswith(pattern) 如果 Series 中的元素以指定的字符串结尾,则返回 True。
    • findall(pattern) 以列表的形式返出现的字符串。
    • swapcase() 交换大小写。
    • islower() 返回布尔值,检查 Series 中组成每个字符串的所有字符是否都为小写。
    • issupper() 返回布尔值,检查 Series 中组成每个字符串的所有字符是否都为大写。
    • isnumeric() 返回布尔值,检查 Series 中组成每个字符串的所有字符是否都为数字。
    • repeat(value) 以指定的次数重复每个元素。
    • find(pattern) 返回字符串第一次出现的索引位置。
  • 设置数据显示格式

    • get_option()
    • set_option()
    • reset_option()
    • describe_option()
    • option_context()
  • loc/iloc

    • 基于标签索引选取数据
    • 基于整数索引选取数据
  • 窗口函数

    • rolling()
    • expanding()
    • ewm()
  • 聚合函数

    • aggregate
  • 缺失值处理

  • groupby() 分组操作

    • 拆分(Spliting):表示对数据进行分组;
    • 应用(Applying):对分组数据应用聚合函数,进行相应计算;
    • 合并(Combining):最后汇总计算结果。
  • merge() 函数

  • concat() 函数能够轻松地将 Series 与 DataFrame 对象组合在一起

  • 时间

    • Timestamp()
    • date_range()
    • to_datetime()
    • Period()
    • period_range()
    • python内置方法 strptime()
    • DatetimeIndex()
    • Timedelta()
    • to_timedelta()
  • sample随机抽样

  • resample数据重采样

    • 降采样 /.lmklk,.lk,,,,,? llresample()
    • 升采样 resample(‘D’).asfreq().head()
    • 频率转换 asfreq()
    • fds 插值处理 pad/ffill,backfill/bfill,interpolater(‘linear’),fillna(value)
  • 分类对象(Categorical Object)。有序排列、自动去重的功能,但是它不能执行运算。

  • Pandas绘图,在 Matplotlib 绘图软件包的基础上单独封装了一个plot()接口,通过调用该接口可以实现常用的绘图操作

    • 线条绘图
    • 柱状图:bar() 或 barh()
    • 直方图:hist()
    • 箱状箱:box()
    • 区域图:area()
    • 散点图:scatter()
  • 读取文件

    • read_csv to_csv
    • read_json
    • read_sql_query
    • to_excel read_excel
  • 索引(index)

    通过索引可以从 DataFame 中选择特定的行数和列数,这种选择数据的方式称为“子集选择”。

    在 Pandas 中,索引值也被称为标签(label),它在 Jupyter 笔记本中以粗体字进行显示。索引可以加快数据访问的速度,它就好比数据的书签,通过它可以实现数据的快速查找。

    • 通过列索引(标签)读取多列数据。

      import pandas as pd  
      #设置"Name"为行索引    
      data = pd.read_csv("person.csv", index_col ="Name")   
      # 通过列标签选取多列数据  
      a = data[["City","Salary"]]
      print(a)
      
    • set_index()

    • 重置索引reset_index()

  • 分层索引(Multiple Index)

    在一个轴上拥有多个(即两个以上)索引层数,这使得我们可以用低维度的结构来处理更高维的数据。

    分层索引的目的是用低维度的结构(Series 或者 DataFrame)更好地处理高维数据。

    • MultiIndex()
    • 分层索引切片取值
    • 聚合函数应用
    • 局部索引
    • 行索引层转换为列索引
    • 交换层
    • 层排序
  • 执行SQL操作

  • NumPy

    Pandas 是在 NumPy 的基础构建而来

    熟悉 NumPy 可以更加有效的帮助我们使用 Pandas。

    NumPy 主要用 C语言编写,因此,在计算还和处理一维或多维数组方面,它要比 Python 数组快得多。

  • 使用注意事项

    • if 语句
    • 布尔运算
    • isin()
    • reindex()

参考资料


m1 安装 python

brew install python3

Screenshot 5

更改.bashrc.zshrc

alias python="/opt/homebrew/bin/python3"
alias python3="/opt/homebrew/bin/python3"

确认 pip 命令

$ python3 -m pip --version
pip 22.2.2 from /opt/homebrew/lib/python3.10/site-packages/pip (python 3.10)

$ python3 -m pip install --upgrade setuptools
$ python3 -m pip install --upgrade pip

$ pip --version

image-20221109午後33348088

image-20221109午後33432512

修改pip源为阿里源

pip config set global.index-url https://mirrors.aliyun.com/pypi/simple

参考资料


python 使用备忘

最近重新拿起 python,这里零碎地记录一下内容

参考资料